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