0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Ruby] AtCoder Beginner Contest 205 C問題

Posted at

##はじめに
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

##最後に
もし、この方がわかりやすい!とか、こんな方法でも解けた!とありましたらコメントにて知らせていただけると幸いです!
ありがとうございました!

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?