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

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

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

お題の目的

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

サンプルコード

C++

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

Swift

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

解説

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

まず、計算に使う変数とforループのカウンターの初期値である。これらのどちらかを0にしてしまうと積1 は0となった上で計算に使う変数の値にそれが代入されてしまい、その後も0を他の数で掛けても0になってしまうことから、出力は必ず0になってしまう。したがって、最低限計算に使う変数の初期値は1にするのが正しい2

次にループ時の範囲である。これはループカウンターの初期値によって変わる。今回のサンプルコードでは1スタートとしているため、1スタートで入力された値以下3 という条件とするため、今回は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を中心にいろいろな情報や意見などを提供しています。ご用の方はコメントかコンタクトフォームにて。

  1. 乗算の結果 []
  2. ループカウンターについては0でも問題ないが、その場合は掛ける時は必ずカウンターに1を加えた値にしなければならないため、わかりやすさを考えれば1にするのが適切 []
  3. 未満ではない点に注意 []