B - 1%(ABC165復習)

5月2日に開催されたAtCoder Beginner Contest 165Rubyで参加しました。

今日はB問題の復習です。

各問題の制約や入力・出力例はリンク先(AtCoderのサイト)をご覧ください。

B - 1%

問題文
高橋くんはAtCoder銀行に 100 円を預けています。
AtCoder銀行では、毎年預金額の 1 % の利子がつきます(複利、小数点以下切り捨て)。
利子以外の要因で預金額が変化することはないと仮定したとき、高橋くんの預金額が初めて X 円以上になるのは何年後でしょうか。

入力
入力は以下の形式で標準入力から与えられる。
X

B - 1%

提出したコード

x = gets.to_i
total = 100
n = 0
while total < x
  total = (total * 1.01).floor
  n += 1
end
puts n

結果:AC(正解) 実行時間:55 ms

考えたことを言語化してみる

1行目:標準入力値を数値に変換して変数 x に代入

2行目:高橋くんの預金額を表すtotalという変数に100を代入

3行目:年数を表す n という変数に0を代入

4〜7行目(while文)
(5行目)1年分の利子を含む高橋くんの預金額を計算しfloorで切り捨て、totalに再代入
(6行目)年数 n をプラス1する
(4行目)5〜6行目の処理を、total(高橋くんの預金額)が x より小さい間繰り返す

8行目:年数 n を出力

docs.ruby-lang.org

whileは、whileの次に書いた式がtrueの間、次行からendまでの処理を繰り返します。

繰り返し処理といえばRubyではeachをよく使います。timesもありますが、今回の問題のようにある一定の条件下での繰り返しとなるとwhileですね。リファレンスには「制御構造」として載っていました。untilforも使えそうです。

この問題に関しては他の参加者の方々もほぼ同じようなコードだったので、改善後のコードはなしです。

感想

複利の計算」なら昔習った!と思ったのが間違いでした…。無駄に時間を使ってしまいました。

最終的なコードに関しては、いいコードになったのではないでしょうか。