##はじめに
AtCoder Beginner Contest 205のC問題を解いてみました。
様々な答えはあるかとは思いますが、自分の回答を説明していきたいと思います。
問題文は下記リンクから飛んで確認してください。
それではよろしくお願いします!
##問題C-POW
a, b, c = gets.split(" ").map &:to_i
まず1行目。a, b, c それぞれに入力された値が順番に受け取れるようにします。
この問題はaもbも、共通してcの数だけ累乗されます。なのでわざわざ計算する必要なく、単純にaとbどちらが大きいかをif文で条件分岐し、適切な出力ができるようにしてやれば問題ないです。
a, b, c = gets.split(" ").map &:to_i
if a < b
puts "<"
elsif a > b
puts ">"
else
puts "="
end
しかしこれでは問題があります。aとbはマイナスの値も入力される可能性があるので、例えば上記のif文だと
-7 5 2
と入力されたら、bの方が数が大きいので"<"が表示されますね。
しかしながら、この問題はcの数、累乗したらどちらが大きいかを比べないといけないものなので、この例だと本当は
-7 × -7 = 49
5 × 5 = 25
なので">"と出力されなければ不正解なのです。
つまりcが偶数だと、累乗された時にプラスになるのでこのif文では不十分なんです。
なのでeven?メソッドを使用してcが偶数かどうかを調べます。
もし偶数だった場合はabsメソッドをaとbに使用し、絶対値に変換する処理をします。
そうすることで、もし片方がマイナスで累乗するとその数の方が大きくなるという結果になっても、aとbを比べるだけで適切な出力結果を得ることができます。
先ほどのif文の前に下記のようにもう一つ処理を加えて完成です。
a, b, c = gets.split(" ").map &:to_i
if c.even?
a = a.abs
b = b.abs
end
if a < b
puts "<"
elsif a > b
puts ">"
else
puts "="
end
##最後に
もし、この方がわかりやすい!とか、こんな方法でも解けた!とありましたらコメントにて知らせていただけると幸いです!
ありがとうございました!