当ブログでは順次『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ループの条件のひっかけに気をつければ問題なくこなせるだろう。今回は問題なくクリアできるため、ぜひチャレンジしてみよう。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。