【Java】10進数で回文 byプログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズルという本を買いました。知らず知らずのうちにアルゴリズムを身に着くということで先輩もおすすめしており、より良いコードを書くために勉強になるのではないかと思っております。
今回はこの本の最初の問題『10進数で回文』を少し変えてJavaで書いてみたいと思います。※本の問題をそのまま書くわけにもいかないので…
問題
11~1000のうち10進数、2進数、8進数のいずれで表しても回文数になる数字はどれか?
回文数とは先頭から読んでも後ろから読んでも同じ数になる数字です。
例)10進数の9=1001(2進数)=11(8進数)となり、2進数と8進数では回文になっています。これが11~1000の中で10進数、2進数、8進数で回文が揃う数字を探すという問題になります。
コード
11~1000をループさせ、その中で10進数を2進数と8進数に変換し、さらに反転させたものと比べるというのがオーソドックスな考えかたでしょうか?
ということで以下がコードになります。
public class App { public static void main(String[] args) throws Exception { for(int target = 11; target < 1000; target++) { String decimalNumber = String.valueOf(target); String binaryNumber = Integer.toBinaryString(target); String octalNumber = Integer.toOctalString(target); String reDecimalNumber = toReverse(decimalNumber); String reBinaryNumber = toReverse(binaryNumber); String reOctalNumber = toReverse(octalNumber); if(decimalNumber.equals(reDecimalNumber) && binaryNumber.equals(reBinaryNumber) && octalNumber.equals(reOctalNumber)) { System.out.println("10進数"+ target); System.out.println("2進数"+ binaryNumber); System.out.println("8進数"+ octalNumber); } } } // 文字列を反転 private static String toReverse(String value) { StringBuffer sb = new StringBuffer(value); return sb.reverse().toString(); } }
7行目で2進数へ変換し、8行目で8進数へ変換しています。
さらにtoReverseメソッドで文字列を反転させています。
【実行結果】
答えは585になりました。
本はrubyで書かれているのですが、while(true)で無限ループにして、回文数を見つけたらif文の中でbreakしてループを止めていました。また、2進数で1桁目が0になると、反転したら01となり、これは数字として不適切なため1番右側の数字は1となります。つまり奇数を探せばいいので奇数だけでループを処理し、高速化しています。
ただコードを書いて実現するだけでなく、効率よく動かすためのヒントも書いてあるのでためになります。気になる問題があったら自分でもコードを書いていきたいと思います。