2015年11月8日日曜日

151108

Ruby


約数の出力

Polite number を考えていて、約数の出力について気になった。
haruyaさんのコード(http://d.hatena.ne.jp/haruya12/20150918/1442570781)
がシンプルで勉強になった。

require 'prime'

def d(m, k)
  return m unless @factor[k]
  (0..@factor[k][1]).map{|e| d(m * @factor[k][0] ** e, k + 1)}.flatten
end

n = 630
# 順番を逆にする方が後の結果が綺麗になる
@factor = Prime.prime_division(n).reverse
p @factor
p d(1, 0)
p d(1, n % 2 == 0 ? 1 : 0)
p d(1, n % 3 == 0 ? 2 : 0)
p d(1, n % 5 == 0 ? 3 : 0)
p d(1, n % 7 == 0 ? 4 : 0)

出力結果
[[7, 1], [5, 1], [3, 2], [2, 1]]
[1, 2, 3, 6, 9, 18, 5, 10, 15, 30, 45, 90, 7, 14, 21, 42, 63, 126, 35, 70, 105, 210, 315, 630]
[1, 2, 3, 6, 9, 18, 5, 10, 15, 30, 45, 90]
[1, 2, 3, 6, 9, 18]
[1, 2]
1

0 件のコメント:

コメントを投稿

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