paizaオンラインハッカソン7に参加してみた – カーディガン(C++, Swift)

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

当ブログでは順次『paizaオンラインハッカソンVol.7 プログラミングで彼女をつくる』の回答例を上げており、基本的にはC++とSwiftでの解答例を上げている。ソースコードはGitHubでも公開しているので、ソースコードを見たい方はそちらもご確認されたい。今回はカーディガンのお題の解答例と解説を上げたい。

お題の目的

今回のお題の目的は入力された数値をもとに、1から入力された数値までの間の数全てを1ずつ段階的に乗算するというものである。例えば4が入力されたら以下の計算式になる.

1 * 2 * 3 * 4

サンプルコード

C++

参考URL: https://github.com/saitomarch/POH7/blob/master/cpp/cardigan.cpp

#include <iostream>
#include <cstdlib>
using namespace std;
int main(void){
    string str;
    getline(cin, str);
    int times = stoi(str);
    int num = 1;
    for (int cnt = 1; cnt <= times; cnt++) {
        num *= cnt;
    }
    cout << num << endl;
    return EXIT_SUCCESS;
}

Swift

参考URL: https://github.com/saitomarch/POH7/blob/master/swift/cardigan.swift

let times = Int(readLine()!)!
var num = 1
for cnt in 1...times {
    num *= cnt
}
print(num)

解説

今回では落とし穴となるポイントは大きく2つある。

まず、計算に使う変数とforループのカウンターの初期値である。これらのどちらかを0にしてしまうと積 ((乗算の結果)) は0となった上で計算に使う変数の値にそれが代入されてしまい、その後も0を他の数で掛けても0になってしまうことから、出力は必ず0になってしまう。したがって、最低限計算に使う変数の初期値は1にするのが正しい ((ループカウンターについては0でも問題ないが、その場合は掛ける時は必ずカウンターに1を加えた値にしなければならないため、わかりやすさを考えれば1にするのが適切)) 。

次にループ時の範囲である。これはループカウンターの初期値によって変わる。今回のサンプルコードでは1スタートとしているため、1スタートで入力された値以下 ((未満ではない点に注意)) という条件とするため、今回はfor (int cnt = 1; cnt <= times; cnt++)としている。Swiftでは書き方を変えている。サンプルコードではfor cnt in 1...timesとしているが、これは意味合いとしてはC++のサンプルコードと同じ意味となっている。なお、0スタートとする場合は、C++ではfor (int cnt = 0; cnt < times; cnt++)に、SwiftではC++と同じ書き方もできるが、for cnt in 0..<timesとする。なお0スタートとする場合は前述の通り、乗算時はcntに1を加えた値を掛けるつようがある点で要注意である。

最後に

今回はforループの条件のひっかけに気をつければ問題なくこなせるだろう。今回は問題なくクリアできるため、ぜひチャレンジしてみよう。

タイトルとURLをコピーしました