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
答案 0 :(得分:1)
您对test
的第三次通话正在返回true
,但您对test
的第二次通话未使用该值。当你真的希望它返回false
时,它会落到方法的底部并返回true
。
当您递归调用test
时,如果递归调用返回true
,您希望返回test
(来自true
)。
更改
if(!test(i, size, digits))
return false;
靠近底部,
return test(i, size, digits);
答案 1 :(得分:0)
你的循环永远不会达到0,因为条件总会得到满足。
while(product > 0){
digits.add(index,product%10);
product /= 10;
index++;
}
老实说,我认为检查回文的最简单方法是:
public boolean palindrome (int n) {
return String.valueOf(n).equals(new StringBuilder(String.valueOf(n)).reverse().toString());
}
答案 2 :(得分:-1)
问题在于:
while(product > 0){
digits.add(index,product%10);
product /= 10;
index++;
}
product
永远不能减少为负数(小于0),除以10;这意味着你永远不会退出这个循环。让我们进一步看看:
1- product is created and it's value is 102*102=10404. (The first time through the for loops.)
2- product is divided by 10 to get 1040.4
3- While loop is checked, 1040.4 > 0, enter again.
4- product is divided by 10 to get 104.04
5- While loop is checked, 104.04 > 0, enter again.
无限重复步骤4和5,因为即使你保持在1以下,它也总是高于0.(例如0.0000000000000010404&gt; 0)