LoginSignup
0
0

More than 1 year has passed since last update.

[Ruby] Atcoder過去問 C - Replacing Integer

Posted at

はじめに

AtCoder過去問のC問題を解いてみました。
よろしくお願いします。

問題はこちらからご確認ください。

C - Replacing Integer

まずは入力を受け取ります。

n, k = gets.split.map(&:to_i)

今回の場合、for文やeach文を使って回すと、nの入力値が大きすぎたときに、かなり負荷がかかってしまうのでできれば使いたくないです。

nからkを何回も引いていく作業は、割り算で作ることができます。
割り算のあまりを算出する%を使えば、0を超えないまで(負の数にならないまで)のnからkを引き続けた結果を得られます。

まずはそれをaに代入します。

n, k = gets.split.map(&:to_i)

a = n % k

次にaが最小の数ではないかもしれません。
なぜならn % kをした後にもう一度kを引いたときに、aよりも絶対値が小さくなる可能性があるからです。

さらにkを引いたものをbに代入しておきましょう。

n, k = gets.split.map(&:to_i)

a = n % k
b = a - k

あとはaとbの絶対値のどちらが小さいかを調べて、小さい方を出力するようにします。
aが負の数であることはあり得ないのでaは何も加工しなくても絶対値です。

bに関してはabsメソッドを使用して絶対値に変換します。

n, k = gets.split.map(&:to_i)

a = n % k
b = a - k
if a <= b.abs
  puts a
else
  puts b.abs
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