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
谢谢。
编辑:我将其修复以提高效率并提供最大回文数而不是仅列出回文数。如果有人感兴趣,这是 final :http://pastebin.com/qJUpZVzK
最佳答案
您第三次调用 test
正在返回 true
, 但你第二次调用 test
没有使用该值。它落到方法的底部并返回 false
, 当你真的想让它返回 true
.
当您调用 test
时递归地,你想返回 true
(来自 test
)如果递归调用返回 true
.
改变
if(!test(i, size, digits))
return false;
靠近底部,到
return test(i, size, digits);
关于java - 回文程序,无法终止循环,欧拉计划 #4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20940160/