public class problem14 {
public static void main(String[] args) {
int biggest = 0;
int biggestNum =0;
for(int i = 1; i<1000001;i++){
if(Solve(i)>biggest){
biggest = Solve(i);
biggestNum = i;
}
}
System.out.println("Chain: " + biggest + "Number: " + biggestNum);
}
public static boolean evenorodd(int num){
//returns true if even, and returns false if odd
int lastNum = num % 10;
if(lastNum==0||lastNum==2||lastNum==4||lastNum==6||lastNum==8){
return true;
}else{
return false;
}
}
public static int Solve(int num){
int count = 1;
int end = 0;
while(end!=1){
if(evenorodd(num)){
num = num/2;
count+=1;
if(num==1){
end=1;
return count;
}
}
if(!evenorodd(num)){
num = 3*num +1;
count+=1;
if(num==1){
end=1;
return count;
}
}
}
return count;
}
}
对不起伙计们,我已经查找了那些问题14解决方案,我仍然无法弄清楚为什么我的代码没有给我正确的答案。请帮帮我,我现在试着弄清楚差不多一个小时了。我只需要知道为什么我没有得到正确的答案,因为我已经测试了很多数字。
答案 0 :(得分:0)
您的算法存在的问题是,在Solve()
方法中,您正在分别检查if(evenorodd(num))
和if(!evenorodd(num))
!因为即使在这种情况下,如果你的num是偶数并且被处理以产生真实结果但是num最后变为1,因此它也被if(!evenorodd(num))
处理,因为它已经变为1 // an odd number
。
第二次,而不是直接从if-else块返回count
,您最好使用break
语句退出循环并最终返回计数!
尝试将其缩减为if(evenorodd(num)){...} else {...}
。
为int Solve(num)
方法锻炼以减轻您的工作量: -
public static int Solve(int num){
int count = 1;
int end = 0;
while(end!=1){
if(evenorodd(num)){
num = num/2;
count+=1;
if(num==1){
end=1;
break;
}
}
else
{
num = 3*num +1;
count+=1;
if(num==1){
end=1;
break;
}
}
}
return count;
}
我希望它有所帮助,你得到了正确的答案!最好的愿望......
答案 1 :(得分:-2)
你的算法很好。你正在吹嘘int的范围。请改用long。
A Groovy solution for Project Euler 14
我得到了上面的投票,所以这里有更多细节。
Shekhar是对的,你不应该重新测试相同的条件,但在这种情况下,它实际上对你的算法不重要。无论如何,循环只能从第一个条件完成,偶数。博客文章讨论了这个以及你可以做的其他优化来加速计算。
你需要使“num”长,即使使用经过修改的非重复测试算法,或者在你的周期中的各个点它将超出int的范围,这将给你一个错误的答案。 / p>
另外,你不应该在外部“i”循环中调用Solve()两次,将第一个调用的结果存储在变量中,如果它更大则只分配它。
所有这一切,你不需要所有的代码。更少的代码意味着更少的东西可能出错。这是一个完成工作的Solve()函数的简单实现。
public static int Solve(long num) {
int count = 1;
while (num > 1) {
num = (num & 1) == 0 ? num / 2 : 3 * num + 1;
count++;
}
return count;
}
(num&amp; 1)屏蔽掉除了last之外的所有位,因此它为0表示偶数,1表示奇数。这只是你做evenorodd()函数的简便方法。
= ?:语法(如果你以前没见过 - 这是一个ternery操作符)进行测试,然后如果为true则返回什么,然后如果为false则返回什么。再次,只是if-then-else的简写,你需要进行单一的值赋值。
希望这有帮助。