Java euler项目问题4的改进解决方案

Java euler项目问题4的改进解决方案,java,algorithm,palindrome,Java,Algorithm,Palindrome,对于Euler项目中的问题4,我在StackOverflow中遇到了许多解决方案。我的问题不是再次询问Euler项目对问题4的解决方案,该项目已在StackOverflow中实现。相反,我遇到了一个改进的解决方案。 我有两个问题反对改进的解决方案。无论如何,我已经在下面发布了解决方案,供人们研究 public static void main(String[] args) { int max = -1; for ( int i = 999 ; i >= 100 ; i--) {

对于Euler项目中的问题4,我在StackOverflow中遇到了许多解决方案。我的问题不是再次询问Euler项目对问题4的解决方案,该项目已在StackOverflow中实现。相反,我遇到了一个改进的解决方案。 我有两个问题反对改进的解决方案。无论如何,我已经在下面发布了解决方案,供人们研究

public static void main(String[] args) {

int max = -1;

for ( int i = 999 ; i >= 100 ; i--) {
    if ( max >= i*999 ) { 
        break;
    }
    for (int j = 999 ; j >= i ; j-- ) {             
        int p = i * j;
        if ( max < p && isPalindrome(p) ) {
            max = p;
        }
    }
}       
System.out.println(max > -1? max : "No palindrome found");
}
publicstaticvoidmain(字符串[]args){
int max=-1;
对于(int i=999;i>=100;i--){
如果(max>=i*999){
打破
}
对于(int j=999;j>=i;j--){
int p=i*j;
如果(最大值-1?max:“未找到回文”);
}
问题

  • 为什么会有一个条件(max>=i*999)?。我们将要实现什么,包括这样一个廉价的操作 从下面的片段中

    for (int j = 999 ; j >= i ; j-- ) {             
            int p = i * j;
            if ( max < p && isPalindrome(p) ) {
                max = p;
            }
        }
    
    用于(int j=999;j>=i;j--){
    int p=i*j;
    如果(最大值
  • 它不是
    j>=100
    ,而是
    j>=i
    。我可以看出节省了很多时间,但是,我想知道它背后的意图
    为了回答问题1,之所以要检查
    (max>=i*999)
    ,是因为您可能已经偶然发现了两个3位数字的乘积,它是回文,但大于
    i*999
    。由于外部for循环从i=999开始,一旦找到新的max,新的max就有可能大于下一次迭代中递减的i值的最大可能回文乘积。例如,如果我们发现一个回文乘积为926*998,其中i=926和j=998,新的max设置为这个乘积。注意,这只是一个假设,我不知道这个产品是否是回文。然后,内部for循环在迭代i=926时完成。然后在外for循环的下一次迭代中,我现在是925,因为925*999小于926*998,所以没有必要继续寻找最大回文乘积,因为它已经被找到了。原因是在这一点上,925*999是最大的回文乘积,可以继续计算


    为了回答问题2,
    j>=i
    的原因是为了避免重复计算产品。例如,假设条件是
    j>=100
    。当j是999,i也是999时,在内部for循环的第一次迭代中。我们最终可能会计算从999*999、999*998到999*100的产品。但是,如果内部for循环达到某个点,此时i为100,j为999,那么最终将重复计算100*999。请注意,这只是一个示例,可能还没有达到这一点。

    你的问题是什么?这更多的是数学而不是编程。