【发布时间】:2014-01-05 22:39:43
【问题描述】:
import java.util.ArrayList;
public class Euler4{
public static void main(String [] args){
int size = 0;
int product = 0;
for(int i = 102; i > 100; i--){
for(int j = 102; j > 100; j--){
ArrayList<Integer> digits = new ArrayList<Integer>();
product = i*j;
int index = 0;
while(product > 0){
digits.add(index,product%10);
product /= 10;
index++;
}
for(int element : digits)
System.out.println("digits :" + element);
size = digits.size() - 1;
if(test(0,size,digits)){
System.out.println("i and j " + i + " " + j);
break;
}
}
}
}
public static boolean test(int i, int size, ArrayList<Integer> digits){
if(digits.get(size).equals(digits.get(i))){
if(size == i || size - i == 1){
return true;
}else{
System.out.println("i: " + i + " size: " + size + " digits@i: " + digits.get(i) +" digits@size " + digits.get(i));
size--;
i++;
if(!test(i, size, digits))
return false;
}
}
return false;
}
}
这是输出:
digits :4 index: 0
digits :0 index: 1
digits :4 index: 2
digits :0 index: 3
digits :1 index: 4
digits :2 index: 0
digits :0 index: 1
digits :3 index: 2
digits :0 index: 3
digits :1 index: 4
digits :2 index: 0
digits :0 index: 1
digits :3 index: 2
digits :0 index: 3
digits :1 index: 4
digits :1 index: 0
digits :0 index: 1
digits :2 index: 2
digits :0 index: 3
digits :1 index: 4
i: 0 size: 4 digits@i: 1 digits@size 1
i: 1 size: 3 digits@i: 0 digits@size 0
我认为while循环和递归都有问题。通过 test() 方法运行的值是进入数组的最后一组值,即 10201,因此即使 while 循环搞砸了,递归方法仍然应该返回 true。我不知道为什么不是。
这就是问题所在: http://projecteuler.net/problem=4
谢谢。
编辑:我将其修复为更高效并提供最大回文数,而不仅仅是列出回文数。如果有人感兴趣,这里是决赛:http://pastebin.com/qJUpZVzK
【问题讨论】:
-
这是欧拉计划,第 4 题吗?如果是这样,你应该在问题中这么说。如果没有,你应该避免调用你的类
Euler4,这会导致错误的假设。 -
好吧,我去改一下。
-
考虑使用堆栈来检测回文,如果字符串 == 堆栈则它是回文。
-
您的数字问题是使用除以 10 的余数,这会产生奇怪的结果。例如 1002 % 10 = 2, 1001 % 10 = 1, 1000 % 10 = 0。对
String使用对数或转换数并存储其长度。例如,请参阅this ideone clip。 -
@t0mppa:对,但这不是我想要的吗?我用模数得到最后一个数字,然后用除法去掉最后一个数字。问题似乎在于 while 循环条件。