箱のプログラミング日記。

渋谷の自社開発企業でRails書いてます。

【rubyアルゴリズム】整数を分解したい

f:id:y_hakoiri:20191102121842j:plain

アルゴリズム問題を解いているとたまにある、

「二桁の整数を10の位と1の位に分解して、それらをどうこう」

みたいなやつ。

 

「分解」と聞いて真っ先に思い浮かぶのが

私の場合はsplitなんだけど(安易?)

splitってstringに使うものだから整数にto_sするのかな?とか考えてやってみるも、

当然のことながら区切り文字でつまづく。

ref.xaio.jp

 

(前までよく使ってたリファレンスのサイトが最近見れなくなった、何なんだろう不便)

 

結論から言うと、「%」をうまいこと使って分解するぽいです

 

問題

二桁の整数を入力させ、

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の位になる

と言う導き方になります。