0

这是问题

“回文数的两种读法都是一样的。由两个 2 位数字的乘积构成的最大回文数是 9009 = 91 × 99。
找到由两个 3 位数字的乘积构成的最大回文数。”

我不确定为什么我的代码不起作用。我推断如果我从最大的数字开始并每次减少 X,那么我找到的第一个回文数就是它。但由于某种原因,它没有打印。任何帮助是极大的赞赏!

import java.lang.StringBuilder;

public class Euler4 {

  public static void main(String[] args){ 
    for (int x=999*999; x>=100*100; x--){
      String num=Integer.toString(x);
      StringBuilder num1 = new StringBuilder(num);
      String num2 = num1.toString();
      if (num2.equals(num1.reverse())==true)
      System.out.println(num);
      break;
  }
  }
}
4

4 回答 4

4

你的循环只循环一次,因为你有break;. 添加大括号以防止将来发生此类事情:

if (num2.equals(num1.reverse().toString())) {
      System.out.println(num);
      break;
}

另请注意,编写是多余的if(someBoolean == true),只是if(someBoolean)为了防止错误分配(=而不是==)而编写。请..缩进你的代码!

老实说,当我查看您的代码时,我并没有注意到这一点,但是我使用了调试器,不到 5 秒就发现了问题。有一个调试器..使用它!

于 2013-10-30T07:29:26.297 回答
1

您的代码缩进很差,这就是您没有发现错误的原因。每次迭代后你都会中断。

if (num2.equals(num1.reverse())==true) {
    System.out.println(num);
    break;
}

在 if 语句周围不使用大括号是可以的,但我建议在学习时尝试将它们放在所有内容中。

于 2013-10-30T07:30:18.527 回答
0

if在你的陈述周围加上大括号:

if (num2.equals(num1.reverse())==true) {
  System.out.println(num);
  break;
}

不使用大括号只会执行条件之后的第一条语句作为块的一部分。

于 2013-10-30T07:30:12.067 回答
0

您可以像这样摆脱StringBuildernum2检查 ik:

if (num.equals(num.reverse())) {
    //...
}

这样你就可以找到一个回文,但不能确定它是由两个 3 位数字的乘积构成的。它可以是两个素数的乘积,一个是 2 位数字,另一个是 4 位数字。您必须检查所有 3 位数字的乘积,看看它是否构成回文。

于 2013-10-30T07:31:09.303 回答