LoginSignup
0
0

More than 3 years have passed since last update.

10進数でも2進数でも8進数でも逆から読んで同じになる回文数(Ruby)

Last updated at Posted at 2019-11-24

回文とは

世の中ね、顔かお金かなのよ...
(よのなかねかお か おかねかなのよ)
のように上から読んでも下から読んでも同じ言葉を回文と言います。

10進数 2進数 8進数
0 0 0
1 1 1
2 10 2
3 11 3
4 100 4
5 101 5
6 110 6
7 111 7
8 1000 10
9 1001 11
10 1010 12

例えば、上の表では10進数で9が2進数、8進数共に回文数となっています。

今回は10以上の数で10進数、2進数、8進数共に回文となる最初の数を探してみます。

考え方

まず2進数で一番右が"0"の数を考えてみます。10101010とか。
回文でなければならないので、一番右が"0"だど一番左も"0"にならなければいけないのですが、そのような2進数は存在しません。(例えば、00101010は存在しない)
なので右も左も"1"から始まる2進数になるはずですが、これは必ず奇数になります。なので奇数だけ順番に探していけば良いことになります。

10進数の回文数

ある10進数が回文数となっているかどうかは、reverseメソッドを使って、

qiita.rb
num.to_s == num.to_s.reverse

を使えば分かります。

その10進数が2進数でも回文数になっているか

またある10進数の、その数の2進数が回文数になっているかどうかは、.to_sメソッドを使えば

qiita.rb
num.to_s(2) == num.to_s(2).reverse

で分かるようになります。
to.s()のカッコの中に数字を入れると、その進数に変換することが出来ます。

あとは10以上の10進数で2進数、8進数共に回文数になっている数をif文とwhileループで探すだけです!

qiita.rb
num = 11
border = "-------"
while true
  if num.to_s == num.to_s.reverse &&
     num.to_s(8) == num.to_s(8).reverse &&
     num.to_s(2) == num.to_s(2).reverse
    puts num
    puts num.to_s(2)
    puts num.to_s(8)
    puts "we found it!"
    break
  end
  puts num
  puts num.to_s(2)
  puts num.to_s(8)
  puts "not this one."
  puts border
  num += 2
end

計算してみると、

qiita.rb
585
1001001001
1111

になりました!

ちなみに

これに16進数でも回文数となるような数を探そうと思って、条件を付け足してプラグラムを走らせてみたのですが、何分待っても計算が終わりませんでした、、、

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