LoginSignup
0
0

More than 5 years have passed since last update.

10進数、2進数、8進数のいずれで表現しても回文数になるやつ

Last updated at Posted at 2014-01-20

元ネタ:
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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0