##はじめに
AtCoderのB問題を解いて見ました。
この問題は初学者の私からすると、非常に数学力というのでしょうか、経験不足というのでしょうか、頭の柔らかさと言うのでしょうか、、、
そのような力が必要だなと痛感した一問でした。
それではよろしくお願いします!
問題は以下から確認してください↓
B - Break Number
はじめに入力受け取りです。
n = gets.to_i
ここからは本当に法則を見つけてそれをプログラムで組めるかです。
まずはじめに私が思いついたのは愚直に、入力された数字に2で割り切れるか調べて、割り切れたら何回割り切れるかプログラムを組んで、、、配列も使って、、、
みたいな感じでやってました。
するとかなり複雑ですし、途中で断念しました。
次にある法則を見つけました。
答えは全て1に2をかけていった数字であると言うこと。
Nには1~100しか入らないと言うことなので、答えは2, 4, 8, 16, 32, 64
とNが1の時の1
しかありえないのです。
私は本当にバカなのでこの法則を見つけて、書いた回答がこちら↓
n = gets.to_i
if n >= 64
puts 64
elsif n >= 32
puts 32
elsif n >= 16
puts 16
elsif n >= 8
puts 8
elsif n >= 4
puts 4
elsif n >= 2
puts 2
else
puts 1
end
泥臭く頑張りすぎじゃね??と思いながら他にも思いつかなかったのでこれで実行したら、一応ACいただきました!
しかし、非常に不格好なので他の方の回答を参考に、自分でわかりやすい且つ、簡潔な回答を考えて見ました。
それがこちら↓
n = gets.to_i
i = 1
while i <= n
i *=2
end
puts i / 2
上記のコードは、「答えは1に2をかけていった数値になる」と言う法則に加えて下記のような法則に気づければかけると思います。説明が難しいので例で説明しています。
例えば32に2をかけた数値は64です。
もし入力された数値Nが32以上で64より小さかったら、答えは32です。(32が一番2で割れる回数が多い)
Nが16以上で32より小さかったら、答えは16です。(16が一番2で割れる回数が多い)
上記のコードではnを超えるまで2をかけていきます。超えた時点で処理をやめますが、一回、余計に2をかけているので2で割って一回分戻してあげていると言う感じです。