プログラム!!
問題4は簡単だった。
A palindromic number reads the same both ways.
The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.Find the largest palindrome made from the product of two 3-digit numbers.
3桁かける3桁の掛け算の積で回文数字のなる最大のものをもとめよ。
計算部分はこちら。
public void probrem4() { final int first = 100; final int last = 999; int largest = -1; for (int i = first; i <= last; i++) { for (int j = first; j <= last; j++) { int prd = i * j; if (isPalindromic(prd)) { if (largest < prd) { largest = prd; } } } } System.out.println(largest); }
ネストが深いのがちょっといや。
ま、それはともかく、問題は回文かどうかを判定しているisPalindromic(prd)の部分。
ぼくは最初こう書いた。
private boolean isPalindromic(int number) { String numStr = String.valueOf(number); int halfLen = numStr.length() / 2; for (int i = 0; i < halfLen; i++) { char left = numStr.charAt(i); char right = numStr.charAt(numStr.length() - 1 - i); if (left != right) { return false; } } return true; }
もちろん正解を導くことはできたのだが、皆の正解を見て「あっ」って思った。
そりゃそうだ。回文の判定は
元の文字列 == 逆さにした文字列
でよいわけだ。そしてJavaではStringBufferではreverseというメソッドがある(Stringにはない)
ふむふむ。なるほどねー。
ちなみに、product は英語で 積 のこと。まず英語部分でハマった・・。
追記:
英語ついでに、英語圏の人の回答をみると回文判定ロジックのメソッド名は「isPalindrome」としているのがほとんどだった。うーむ。そうなのか。is + 名詞か。is + 形容詞はありかと思ったけどそうでもないのか。
追記2:
結局、メソッド名も判定ロジックも修正するとこうなる。
private boolean isPalindrome(int number) { String numStr = String.valueOf(number); String rev = new StringBuffer(numStr).reverse().toString(); return numStr.equals(rev); }