元ネタ:
https://codeiq.jp/magazine/2013/12/3238/
"10進数の10以上で最小の値"だと
3桁の数になるんだけど、
"10進数の1000以上で最小の値"だと
大きな数になり、計算量も多くなる。
回文数が
ABCDCBA
の形と
ABCDDBCA
の形で場合分けして書いたら、うまく解けた。
reversible.rb
#n進で表した時に回文数となっているかを判定するメソッド
#十分大きい数でも対応できるようにFixnumでなくIntegerに定義する
class Integer
def reversible?(n)
self.to_s(n).reverse == self.to_s(n)
end
end
#2進・8進・10進のそれぞれで回文数となる数をTripleReversibleと呼ぶことにして、
#それに配列のようにアクセスできるモジュールを定義する
module TripleReversible
extend self
def [](nth)
arr = []
#10の1乗,2乗,3乗,,,とイテレートしていく
(1..Float::INFINITY).each do |n|
#1の位の数字が偶数の場合は、2進で1の位が0となり回文数にならない。
#よって、1の位の数(=最初の桁の数)が奇数のもののみを調べればよい。
[1,3,5,7,9].each do |x|
(10**(n/2)*x).upto(10**(n/2)*(x+1)-1) do |m|
r = n.odd? ?
#奇数桁数:ABCDCBAのタイプ
(m.to_s.chop + m.to_s.reverse).to_i
#偶数桁数:ABCDDCBAのタイプ
: (m.to_s + m.to_s.reverse).to_i
arr << r if r.reversible?(8) && r.reversible?(2)
return arr[nth] if arr[nth]
end
end
end
end
end
#puts TripleReversible[0] #-> 1
#puts TripleReversible[1] #-> 3
#puts TripleReversible[2] #-> 5
#puts TripleReversible[3] #-> 7
#puts TripleReversible[4] #-> 9
#puts TripleReversible[5] #-> 585
#puts TripleReversible[6] #-> 719848917