LoginSignup
0
0

More than 1 year has passed since last update.

[Ruby] AtCoder過去問 C - 100 to 105

Posted at

はじめに

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0