##はじめに
AtCoder過去問をRubyで解いてみました。
よろしくお願いします。
問題はこちらから確認してください↓
##C - 100 to 105
まずは入力を受け取ります。
その後xの十のくらいまでの二桁をx_tenに代入します。
x = gets.to_i
x_ten = x % 100
僕の考え方は100の位以降の桁は一旦無視して、x_tenを5で割り、その答えをcntに代入、そして余りを4で割り、その答えをcntに足し、余りを3で割り...を1まで繰り返します。
余りを出す計算と割り算の答えをcntに追加していく計算を別にしていますが、上記のことをコードに落とし込んだのが↓です。
x = gets.to_i
x_ten = x % 100
five_rem = x_ten % 5
four_rem = five_rem % 4
three_rem = four_rem % 3
two_rem = three_rem % 2
cnt = x_ten / 5
cnt += five_rem / 4
cnt += four_rem / 3
cnt += three_rem / 2
cnt += two_rem / 1
十の位までのxを5から順番に割って、割り切れなかった数字を次の数字が割って...という処理で、百のくらいは無視して、5, 4, 3, 2, 1をそれぞれ何個使ってx_tenを作れるかの最小値がcntに入っています。
実際は、5, 4, 3, 2, 1のどれかを一回使うごとに+100がついてきてます。
つまりcntを100倍すれば、下二桁をxに合わせたときの百のくらいが分かります。
xの百の位はx-x_ten
で表現できます。
cntの100倍がxの百の位以下であれば1を出力できます。足りない分は100を使えばいいので下二桁に影響を与えずに百の位を合わせに行けます。
逆にcntの100倍がxの百の位を超えてしまうようなら、下二桁を合わせたときに百の位はどう頑張っても、合わせられないので0を出力します。
x = gets.to_i
x_ten = x % 100
five_rem = x_ten % 5
four_rem = five_rem % 4
three_rem = four_rem % 3
two_rem = three_rem % 2
cnt = x_ten / 5
cnt += five_rem / 4
cnt += four_rem / 3
cnt += three_rem / 2
cnt += two_rem / 1
if cnt * 100 <= x-x_ten
puts 1
else
puts 0
end
##おまけ
最後のif文の条件式はcntに100を掛けなくてもcntとx/100を比べてもできましたね。
あと、僕はクソ真面目に解きましたが、xの百の位の数字に5をかけた数字がxの下二桁以上であれば、合計価格がちょうどx円で買い物ができるという法則を見つけられたなら下記のようにより明快な短いコードを書けます。
x = gets.to_i
x_ten = x % 100
n = x / 100
if n * 5 >= x_ten
puts 1
else
puts 0
end
Comments
Let's comment your feelings that are more than good