##回文とは
世の中ね、顔かお金かなのよ...
(よのなかねかお か おかねかなのよ)
のように上から読んでも下から読んでも同じ言葉を回文と言います。
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メソッドを使って、
num.to_s == num.to_s.reverse
を使えば分かります。
###その10進数が2進数でも回文数になっているか
またある10進数の、その数の2進数が回文数になっているかどうかは、.to_sメソッドを使えば
num.to_s(2) == num.to_s(2).reverse
で分かるようになります。
to.s()のカッコの中に数字を入れると、その進数に変換することが出来ます。
##あとは10以上の10進数で2進数、8進数共に回文数になっている数をif文とwhileループで探すだけです!
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
計算してみると、
585
1001001001
1111
になりました!
##ちなみに
これに16進数でも回文数となるような数を探そうと思って、条件を付け足してプラグラムを走らせてみたのですが、何分待っても計算が終わりませんでした、、、