問題
3桁の正の整数を入力します。その整数の「百の位・十の位・一の位の和」について、
10の倍数(0,10,20,30...)からの差が
・2以内であるときは"True"
・それ以外は"10の倍数との差は○です"
と表示されるようにしましょう。
出力例:
near_ten(117)→True
near_ten(123)→10の倍数との差は4です
near_ten(111)→10の倍数との差は3です
0も10の倍数に含むものとします。
百の位・十の位・一の位の和が6などの時に、「10の倍数との差は6です」と出力せずに、「10の倍数との差は4です」と10の倍数から近い方の差を出力するようにしてください。
私の回答
def near_ten(num)
total = (num/100) + (num/10%10) + (num%10)
end
解説
時間制限で百の位・十の位・一の位の和だけしか記述できなかった。
模範回答
def near_ten(num)
total = (num/100) + (num/10 % 10) + (num % 10)
remainder = total % 10
if remainder <= 2 || remainder >= 8
puts "True"
elsif remainder <= 5
puts "10の倍数との差は#{remainder}です"
else
puts "10の倍数との差は#{10 - remainder}です"
end
end
模範解説
(num/100) + (num/10 % 10) + (num % 10)によって、百の位・十の位・一の位をそれぞれ足し合わせています。
num/100(百の位)
2桁の整数を100で割った値が百の位になります。
num = 117の場合、num/100 つまり117/100は1.17となります。
Rubyでは整数同士(integer型)の計算だと返り値は整数になるので、小数点以下は切り捨てられて「1」になります。
そのため、百の位の取得は、3桁の数字を100で割るだけで可能となります。
よって、百の位は「1」となります。
num/10 % 10(十の位)
2桁の整数を10で割り、その値を10で割った際の余りが十の位になります。
num = 117の場合、117/10は11.7になります。整数同士は小数点以下の計算は行わないので、11になります。
11 % 10 は、11を10で割った際の余りを計算結果として返します。百の位の計算と同様に、小数点以下の計算は行わないので、余りは1となります。
よって、十の位は「1」となります。
num % 10の場合(一の位)
2桁の整数を10で割った際の余りが一の位になります。
num = 117の場合、117 % 10 は、117を10で割った際の余りを計算結果として返します。百の位の計算と同様に、小数点以下の計算は行わないので、余りは7となります。
よって、一の位は「7」になります。
8行目のelseのポイントは、「百の位・十の位・一の位の和が6または7に該当する場合は、10から差し引いて、10の倍数との差分を導出する必要がある」という点です。
感じたこと
なんとか各桁の和は記述することができたが、その後の差の部分の記述ができなかった。
またrubyでは整数同士(integer型)の計算だと返り値は整数になり小数点は切り捨てられることは知らなかったので
ここで学べてよかった。
位の計算はよくある計算だと思うのでしっかりと理解し覚えていきたい。
アドバイスやご指摘等ございましたらぜひお願いします!
以上