2015年4月22日水曜日

150422

Ruby


カプレカ数

コードを書いてみた。
オンライン整数列大辞典の
A099009(http://oeis.org/A099009/list)
と比較し、答え合わせしてみる。

def kaprekar_numbers(m)
  m_ary = []
  numbers = (0..9).to_a
  numbers.repeated_combination(m){|c_ary|
    # 後述のnが9の倍数ということはc_aryの和も9の倍数
    if c_ary.inject(:+) % 9 == 0
      min_ary = c_ary.clone
      min = min_ary.join.to_i
      max = min_ary.reverse.join.to_i
      n = max - min
      m_ary << n if c_ary == n.to_s.split('').map(&:to_i).sort
    end
  }
  m_ary.sort
end

N = 20
ary = [0]
m = 2
while ary.size < N
  kaprekar_numbers(m).each{|i| ary << i}
  m += 1
end
ary = ary[0..N - 1]

# OEIS A099009のデータ
ary0 =
[0,495,6174,549945,631764,63317664,97508421,
 554999445,864197532,6333176664,9753086421,
 9975084201,86431976532,555499994445,633331766664,
 975330866421,997530864201,999750842001,
 8643319766532,63333317666664]
# 一致の確認
p ary == ary0

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。