プログラム!!

問題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);
	}