这是我到目前为止所写的内容。它编译,并且,据我所知,它应该“工作” - 如果你要给你的计算机无限的时间来计算答案!
我只是想知道是否有人愿意能够给我一种方法来优化这个,以便我的程序能告诉我最高的回文数(同样向前和向后,例如,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);
}
答案 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 = x
,LoopOfSecondNumber = y
=&gt;因此,此解决方案已在早期的外循环中找到。
但这并没有为您带来太多优化,在最好的情况下,它会占用原始代码的一半时间。
答案 3 :(得分:1)
你为什么不从另一边解决它?
创建一组从1000000(1000 * 1000)开始的所有回文数字并且正常工作,应该相当容易。
然后将它们分解 - 尽管我猜你需要一个算法: - (