高橋の数の算出について
各桁を並び替えてできる最大の数と
各桁を並び替えてできる最小の数(ただし、最高位は0以外にする)の差が
自身と一致するとき、高橋の数と呼びます。
(http://masami.d2.r-cms.jp/blog_detail/blog_id=3&id=6)
以下のコードで、9桁までの高橋の数を
求めようとしたのですが、
9桁の高橋の数の算出に何時間も
かかっています。
もっと高速に求める方法があれば、ご教示ください。
def takahashi_number(m)
(10 ** (m - 1)..10 ** m - 1).each{|n|
ary = n.to_s.split('').map(&:to_i)
min_ary = ary.sort
max = min_ary.reverse.join.to_i
# 最高位を0以外にする←カプレカ数との違い
i = 0
while min_ary[i] == 0
i += 1
end
min_ary[0], min_ary[i] = min_ary[i], min_ary[0]
min = min_ary.join.to_i
p [m, n] if n == max - min
}
end
(2..9).each{|m| takahashi_number(m)}
出力結果
[3, 495]
[4, 6174]
[6, 549945]
[6, 631764]
[6, 660852]
[8, 63317664]
[8, 66308652]
[9, 554999445]
[9, 864197532]
(追記)
(どの言語を用いるにせよ)今のところ、高橋の数は9の倍数であることと
yoh2さんのアイデアを用いていたコードが一番速いものと思われます。
このRuby版のコードを作ったので、回答に載せました。
皆様の参考になれば幸いです。