A - Payment(ABC173復習)

7月5日に開催されたAtCoder Beginner Contest 173

A問題の復習。

A - Payment

問題文
お店で N 円の商品を買います。
1000 円札のみを使って支払いを行う時、お釣りはいくらになりますか?
ただし、必要最小限の枚数の 1000 円札で支払いを行うものとします。

制約

  • 1≤N≤10000
  • N は整数

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

出力
お釣りの金額を整数で出力せよ。

A - Payment

提出したコード

n = gets.to_i
change = 10000 - n
if change < 1000
  puts change
else
  puts change - change.to_s[-4].to_i * 1000
end

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

おつりを change = 10000 - n として、
それが 1000 未満だったらそのまま出力。
1000 以上だったら、千の位の数字 × 1000 を引いて、出力。

意外と苦戦。無理やりACしたけどあまりよろしくないコード。

もっといいコード

n = gets.to_i
change = 1000 - n % 1000
puts change == 1000 ? 0 : change

これが書きたかった。

n(商品の値段)を 1000 で割った余りは、商品の値段の1000円未満の部分になる。
(1900円の商品を 1000 で割った余りは、900)

なので、その 1000円未満の部分を 1000 から差し引けば、答え。

かと思いきや、n が 1000円などキリのいい数字の場合、 1000 - 0 は 1000 になってしまう。

よって、最後に条件分岐で、change が 1000 の場合は 0 を表示させる。

感想

問題を見たとき簡単な問題だと思ったのになかなかうまくできず、B問題を先に解いたほどだった。

サクッと書けるようになりたい。