Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何优化我的糟糕代码,以查找3位数字中的最高回文?_Java_Loops_Palindrome - Fatal编程技术网

Java 如何优化我的糟糕代码,以查找3位数字中的最高回文?

Java 如何优化我的糟糕代码,以查找3位数字中的最高回文?,java,loops,palindrome,Java,Loops,Palindrome,这是我到目前为止写的。它可以编译,而且,据我所知,它应该“工作”——如果你给你的计算机无限的时间来计算答案的话 我只是想知道是否有人能给我一个优化的方法,这样我的程序就能告诉我最高的回文数,前后相同,例如91*99=9009;由任意两个三位数相乘而成 public class HighestPalindrome { public static void main(String[] args) { int number=0; int answer=0; sea

这是我到目前为止写的。它可以编译,而且,据我所知,它应该“工作”——如果你给你的计算机无限的时间来计算答案的话

我只是想知道是否有人能给我一个优化的方法,这样我的程序就能告诉我最高的回文数,前后相同,例如91*99=9009;由任意两个三位数相乘而成

 public class HighestPalindrome {
     public static void main(String[] args) {
    int number=0;
    int answer=0;

    search:
    for(int LoopOfFirstNumber=999;LoopOfFirstNumber<=100;LoopOfFirstNumber -= 3){
      for(int LoopOfSecondNumber=LoopOfFirstNumber;LoopOfSecondNumber<=100;LoopOfSecondNumber-=3)
      {
        number = LoopOfFirstNumber * LoopOfSecondNumber;
        if (number == reverse(number))
         {
          answer=number;
          System.out.println(answer);
          break search;
         }
      }
    }
  }

     //The code after this works fine, I believe. It will reverse any number given very quickly, I think the problem
     //is above....with the two for loops!

    private static int reverse(int n, int r) {
      if (n == 0) return r;
      System.out.println("This iteration returns " + n/10 + " and  " + 10*r+n%10);
      return reverse(n/10, 10*r+n%10);
    }

    public static int reverse(int n) {
     return reverse(n, 0);
    }
您的for循环条件错误:

LoopOfFirstNumber<=0
您应该继续循环,直到循环计数器>=100,这是最小的3位数

此外,一旦找到回文,就需要打破这两个循环。目前,您只中断内部循环。要解决此问题,您需要使用带标签的中断。

您的for循环条件错误:

LoopOfFirstNumber<=0
您应该继续循环,直到循环计数器>=100,这是最小的3位数


此外,一旦找到回文,就需要打破这两个循环。目前,您只中断内部循环。要解决此问题,您需要使用带标签的break。

内部for循环不需要以999开头,它可以以LoopOfSecondNumber=LoopOfFirstNumber开头:

让我们假设有一个解决方案,LoopOfSecondNumber=x>LoopOfFirstNumber=y。然后会有一个解决方案,其中两个数字是切换的:LoopOfFirstNumber=x,loopOffSecondNumber=y=>因此,这个解决方案在外部循环中已经找到了


不过,这不会给您带来太多优化,在最好的情况下,它会占用原始代码一半的时间。

内部for循环不需要从999开始,它可以从LoopOfSecondNumber=LoopOfFirstNumber开始:

让我们假设有一个解决方案,LoopOfSecondNumber=x>LoopOfFirstNumber=y。然后会有一个解决方案,其中两个数字是切换的:LoopOfFirstNumber=x,loopOffSecondNumber=y=>因此,这个解决方案在外部循环中已经找到了


不过,这不会给您带来太多优化,在最好的情况下,它会占用原始代码一半的时间。

正如您已经猜到的,问题在于嵌套循环。试着找出这些数字的一些性质。两个三位数的数字相乘总是得到一个五位数或六位数的数字。因为你要找的是最高的数字,所以它应该是以数字9开头的六位数字,因为它是回文的,所以可能也以数字9结尾。简而言之,您希望数字的格式为9xyx9

接下来,并非所有的数字对都可以相乘并以数字9结束。xx3和xx3将给出XXXXX 9,xx1和xx9也是如此;但是xx1和xx8永远不会乘以XXXXX 9


查找类似这些属性,并尝试在搜索中筛选哪些属性可能容易实现。

正如您已经猜到的,问题在于嵌套循环。试着找出这些数字的一些性质。两个三位数的数字相乘总是得到一个五位数或六位数的数字。因为你要找的是最高的数字,所以它应该是以数字9开头的六位数字,因为它是回文的,所以可能也以数字9结尾。简而言之,您希望数字的格式为9xyx9

接下来,并非所有的数字对都可以相乘并以数字9结束。xx3和xx3将给出XXXXX 9,xx1和xx9也是如此;但是xx1和xx8永远不会乘以XXXXX 9


找到类似于这些的属性,并尝试筛选哪些属性可以轻松实现到您的搜索中。

为什么不从另一个角度解决它

创建一组所有回文数字,从1000000 1000*1000开始,向下,应该相当容易


然后将它们分解——虽然我想你需要一个算法来解决这个问题:——

为什么不从另一个角度来解决呢

创建一组所有回文数字,从1000000 1000*1000开始,向下,应该相当容易


然后对它们进行因式分解——虽然我想你需要一个算法来实现这一点:-

正如我看到的,循环退出条件中有一个错误:LoopOffirstNumber这也不能保证给你最大的数字。第一个因子最大的数不一定是最大的,两个较小的数可能相乘成较大的数。我明白了,循环退出条件中有一个错误:loopOffirstNumber这也不能保证给你最大的数。第一个因子最大的数字不一定是最大的,两个较小的数字可以相乘成较大的数字。实际上,它应该是LoopOfFirstNumber>100,因为我们只需要三位数……啊,非常感谢。我从'+'循环改为'-'循环,因为我认为如果我在这个循环中正确的话,这会更快

是吗?但我忘了编辑条件了!非常感谢!实际上…为什么我希望我的for循环在100次迭代后停止?999不是也有三位数吗?你不想在100后停止,但你最初发布的循环从999开始倒计时。如果你在数数,你想从100开始。如果在当前乘积小于当前最大回文数时停止每个循环,倒计时应该会更快-测试小于该值的数字是否为回文数没有任何意义。此外,每个数字都要测试两次,因为对于第一个和第二个数字的任何给定值,稍后,您将使用第一个和第二个交换的数字测试相同的数字。实际上,它应该是LoopOfFirstNumber>100,因为我们只需要三位数字……啊,非常感谢。我从'+'循环改为'-'循环,因为我认为这会更快,实际上我的假设是正确的吗?),但我忘了编辑条件!非常感谢!实际上…为什么我希望我的for循环在100次迭代后停止?999不是也有三位数吗?你不想在100后停止,但你最初发布的循环从999开始倒计时。如果你在数数,你想从100开始。如果在当前乘积小于当前最大回文数时停止每个循环,倒计时应该会更快-测试小于该值的数字是否为回文数没有任何意义。此外,每个数字都要测试两次,因为对于第一个和第二个数字的任何给定值,稍后,您将用第一个和第二个swappedOk测试相同的数字,我明白您想说什么,非常感谢您花时间说出来!。我只是想想办法把这些东西整合到我的代码中。如果每次迭代我都将循环减少3而不是1,我相信它会起作用吗?我只是编辑了我的代码以包含我的修订,现在它仍然没有运行:你仍然在做=100。@codaddict-我做了更改,它马上就起作用了!非常感谢你能解释一下为什么会这样吗?我的印象是for循环的第二个条件指定了一个结束循环的点?肯定with=100会导致它直接结束吗?显然不是这样,我只是有点困惑!:再次非常感谢@user476033:您现在的代码可能不会给出正确的结果,因为它跳过了一些有效的可能性。有三对可能的最后一位数字可以相乘到以9:1*9=9、3*3=9、7*7=49结尾的5-6位数字。也就是说,您需要搜索所有xx1*xx9、xx3*xx3和xx7*xx7。这意味着测试最多24300个组合,或者更少,如果你再应用一些优化的话;与您的原始版本相比,它最多测试810000个组合。在我的电脑里,24300个回文测试需要一眨眼的时间来计算。好的,我明白你想说什么了,非常感谢你花时间说出来!。我只是想想办法把这些东西整合到我的代码中。如果每次迭代我都将循环减少3而不是1,我相信它会起作用吗?我只是编辑了我的代码以包含我的修订,现在它仍然没有运行:你仍然在做=100。@codaddict-我做了更改,它马上就起作用了!非常感谢你能解释一下为什么会这样吗?我的印象是for循环的第二个条件指定了一个结束循环的点?肯定with=100会导致它直接结束吗?显然不是这样,我只是有点困惑!:再次非常感谢@user476033:您现在的代码可能不会给出正确的结果,因为它跳过了一些有效的可能性。有三对可能的最后一位数字可以相乘到以9:1*9=9、3*3=9、7*7=49结尾的5-6位数字。也就是说,您需要搜索所有xx1*xx9、xx3*xx3和xx7*xx7。这意味着测试最多24300个组合,或者更少,如果你再应用一些优化的话;与您的原始版本相比,它最多测试810000个组合。在我的电脑里,24300个回文测试需要一眨眼的时间来计算;抱歉,我不知道如何在注释中发布正确缩进的代码!对于int SETOFALINEGERS=999999;抱歉,我不知道如何在注释中发布正确缩进的代码!