Project Euler 4的Palindrome产品输出

时间:2012-03-14 13:42:22

标签: java

我不明白为什么我的输出没有得到回文。我怀疑它有问题在于内部for循环,但我会感激任何输入。

/*
 * 
 * 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.
 *
 */

public class projecteuler4 {

public static boolean isPalindrome(String palindromeCandidate) {

    StringBuilder sb1 = new StringBuilder(palindromeCandidate);

    if (sb1.equals(sb1.reverse())) 
        return true;
    else
        return false;
}
public static void main(String[] args) {

    String answer;

    for (int i = 100; i <= 999; i++) {
        for (int j = i; j <= 999; j++) {
            int ans = i * j;
            answer = Integer.toString(ans);
            if(isPalindrome(answer)) {
                System.out.println(answer);
            }
            else 
                continue;
        }
    }

}

5 个答案:

答案 0 :(得分:1)

    包含相同字符串的
  1. StringBuilder不相等,因此您需要比较从它们返回的字符串:

    return palindromCandidate.equals(new StringBuilder(palindromeCandidate).reverse().toString());
    
  2. 我知道这不是我的意思,但这是解决这个谜语的一种非常昂贵的方式。我建议你考虑更多的数学解决方案。

答案 1 :(得分:0)

您需要比较palindromeCandidate方法中的字符串而不是StringBuilders,以便进一步更改

if (sb1.equals(sb1.reverse())) 
    return true;
else
    return false;

return palindromeCandidate.equals(sb1.reverse().toString());

StringBuilder方法链,因此sb1.reverse()方法在执行反向后返回自身。

答案 2 :(得分:0)

替换

if (sb1.equals(sb1.reverse())) 

if (sb1.toString().equals(sb1.reverse().toString())) 

注意:您在循环结束时也不需要continue

答案 3 :(得分:0)

你可以尝试这样......

public class LargestPolindrome {
static List<Integer> polindromes = new ArrayList<Integer>();

/**
 * @param args
 */
public static void main(final String[] args) {
    int polindrome = 0;
    for (int i = 999; i > 1; i--) {
        for (int j = 999; j > 1; j--) {
            polindrome = i * j;
            if (isPolindrome(polindrome)) {
                polindromes.add(polindrome);
            }
        }
    }
    Collections.sort(polindromes);
    System.out.println(polindromes.get(polindromes.size() - 1));
}

public static boolean isPolindrome(final Integer num) {
    final int rer = Integer.valueOf(new StringBuilder(num.toString()).reverse().toString());
    return rer == num;
}

}

答案 4 :(得分:0)

你可以尝试这个。有一个函数isPallindrome。它检查一个数字是否是回文。在我的主要功能。我已经运行了for循环和问题的内部循环,以便在问题指示时获得少于1000的两个产品。然后,我检查过,如果结果是回文,它将被添加到回文arraylist。最后,我从arraylist输出最大值。

public static void main(String[] args) {
    // TODO code application logic here
    long result = 0;
    List<Long> palindrome = new ArrayList<Long>();
    for(int i = 0; i < 1000; i++){
        for(int j = 0; j < 1000; j++){
            result = i*j;
            if(isPallindrome(result)){
                palindrome.add(result);
            }
        }

    }
    long i = Collections.max(palindrome);
    System.out.println(i);
}
public static boolean isPallindrome(long n){
    long pallindrome = n;
    long reverse = 0;
    while(pallindrome!=0){
        long remainder = pallindrome % 10;
        reverse = reverse * 10 + remainder;
        pallindrome = pallindrome / 10;
    }
    if(n == reverse){
        return true;
    }
    return false;
}