アルゴリズム問題を解いているとたまにある、
「二桁の整数を10の位と1の位に分解して、それらをどうこう」
みたいなやつ。
「分解」と聞いて真っ先に思い浮かぶのが
私の場合はsplitなんだけど(安易?)
splitってstringに使うものだから整数にto_sするのかな?とか考えてやってみるも、
当然のことながら区切り文字でつまづく。
(前までよく使ってたリファレンスのサイトが最近見れなくなった、何なんだろう不便)
結論から言うと、「%」をうまいこと使って分解するぽいです
問題
二桁の整数を入力させ、
10の位と1の位に分解するプログラムを作成しなさい
回答
# 整数を分解
def slice_num(num)
x = (num / 10) % 10 # 10の位
y = (num / 1) % 10 # 1の位
return x, y
end
puts "二桁の整数を入力してください"
input = gets.to_i
x, y = slice_num(input)
解説
まずは処理の実行部分から
puts "二桁の整数を入力してください"
input = gets.to_i
x, y = slice_num(input)
このへんはそのまま。
getsは全て文字列で返すので、to_iで整数に変換させた状態でinputに代入
次に整数を分解するメソッドslice_numにinputを渡した状態で呼び出し、
返り値をxとyにそれぞれ代入します
(returnで複数返せば一気に複数代入できるの知らなかった)
※実際は分解した上で何か処理をさせる場合が多いけど、今回は割愛
次にメソッド内をみてみる
# 整数を分解
def slice_num(num)
x = (num / 10) % 10 # 10の位
y = (num / 1) % 10 # 1の位
return x, y
end
渡ってきたinputはメソッド内では引数numとして扱われます。
10の位を出したい場合、
x = (num / 10) % 10
10で割った数、をさらに10で割った数の余りが10の位になる
と言う法則らしい。
例えばnum = 20だとすると
num / 10 = 2
2 % 10 = 0...2(割れないので2がそのまま余る)
続いて1の位を出したい場合、
y = (num / 1) % 10
1で割った数、をさらに10で割った数の余りが1の位になる
num = 20
num / 1 = 20
20 % 10 = 2...0
当然余りの数がxとyにそれぞれ代入されるので、
これで無事10の位と1の位を分解し、それぞれを変数に代入することができました。
結論
要は整数値を位ごとに分解したい時は、
Aで割った数、をさらに10で割った数の余りがAの位になる
と言う導き方になります。