初投稿。
とある日に遭遇したRuby問題。
ポイントは整数の十の位・一の位を個別の整数として出力するメソッドを理解すること。特に十の位!
模範解答だけではイマイチしっくり来なかったため、解答コードを元に解説を備忘録として。
〜今回はヒントがありました。〜
「入力された2桁以上の整数を10で割った計算結果の余りが1の位、整数を10で割ったものを更に10で割った計算結果の余りが10の位となります。」
現代文の問題かのようなヒントが記載されていましたが、要は'%'を使いなさいということですね。
def addition(a, b)
a + b
end
def multiplication(a,b)
a * b
end
def slice_num(num)
# 10の位
tens_place = (num / 10) % 10
# 1の位
ones_place = num % 10
return tens_place, ones_place
end
puts "二桁の整数を入力してください"
input = gets.to_i
X, Y = slice_num(input)
add_result = addition(X, Y)
multiple_result = multiplication(X, Y)
puts "足し算結果と掛け算結果の合計値は#{add_result + multiple_result}です"
解いていく前に忘れてはいけない大前提のおさらい!
「Rubyの性質上、整数同士(integer型)の計算だと返り値は整数になるので、小数点以下は切り捨てられる。」
この前提で今回のアプトプットの8割完了です。
では実際に2桁の整数を入力して考えてみます。
input = 55 の場合
slice_numメソッドに代入され、
tens_place = (55 / 10) % 10
ones_place = 55 % 10
ここで文系の私は壁にぶつかるわけです。
ones_plase = 55 % 10 すると余りは5。なるほどどんな整数が入力されても一の位は求められるわこれで。
では十の位tens_place = (55 / 10) % 10 するとそもそも5(小数点以下切り捨て)をさらに10で割って余りってなんぞ?!と。
原因は'%'の理解不足でした。
割り算では5を10で割ると0.5ですが、'%'←で割って余りを求める際の考え方は「5(10未満の数字)を10で割ると、割れない。なので5がそのまま余る」という解釈なのです。
ターミナルで実行結果を確認すると、下記の通り55でも75でも十の位が個別の整数として返ってきます。
irb(main):001:0> num = (55 / 10) % 10
=> 5
irb(main):002:0> num = (75 / 10) % 10
=> 7
irb(main):003:0>
2桁の整数では(num / 10)の段階で十の位を求められそうな雰囲気もありますが、ここでの '/ 10'の役割はnumの十の位を1桁目に持ってくることです。その上でnum十の位より上の数字を'% 10'で排除します。
(num / 10)では3桁以上の整数が入力された場合に対応できません。ターミナルで実行結果を確認すると、
irb(main):001:0> num = (1525 / 10)
=> 152
irb(main):002:0> num = (1525 / 10) % 10
=> 2
irb(main):003:0>
となり、'% 10'を記述することで何桁の整数でも十の位を個別の整数として求めることができます。
以上。