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

时间:2010-10-25 10:31:03

标签: java loops palindrome

这是我到目前为止所写的内容。它编译,并且,据我所知,它应该“工作” - 如果你要给你的计算机无限的时间来计算答案!

我只是想知道是否有人愿意能够给我一种方法来优化这个,以便我的程序能告诉我最高的回文数(同样向前和向后,例如,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);
    }

4 个答案:

答案 0 :(得分:3)

正如您已经猜到的,问题出在嵌套循环中。试着弄清楚数字的一些属性。两位三位数的乘法将始终给出具有五位或六位数的数字。由于您正在寻找最高的数字,因此它预计是从数字9开始的六位数字,因为它是回文,它也可能以数字9结束。简而言之,您期望9xyyx9形式的数字。

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

查找这些属性,并尝试过滤哪些可能很容易在搜索中实现。

答案 1 :(得分:1)

您的for循环条件错误:

LoopOfFirstNumber<=0

它应该是:

LoopOfFirstNumber>=100

您应该继续循环,直到您的循环计数器为>= 100,这是最小的3位数字。

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

答案 2 :(得分:1)

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

我们假设有一个LoopOfSecondNumber = x > LoopOfFirstNumber = y的解决方案。然后会有一个解决方案,其中切换两个数字:LoopOfFirstNumber = xLoopOfSecondNumber = y =&gt;因此,此解决方案已在早期的外循环中找到。

但这并没有为您带来太多优化,在最好的情况下,它会占用原始代码的一半时间。

答案 3 :(得分:1)

你为什么不从另一边解决它?

创建一组从1000000(1000 * 1000)开始的所有回文数字并且正常工作,应该相当容易。

然后将它们分解 - 尽管我猜你需要一个算法: - (