欧拉14.答案不匹配

时间:2014-08-23 12:32:56

标签: java

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解决方案,我仍然无法弄清楚为什么我的代码没有给我正确的答案。请帮帮我,我现在试着弄清楚差不多一个小时了。我只需要知道为什么我没有得到正确的答案,因为我已经测试了很多数字。

2 个答案:

答案 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的简写,你需要进行单一的值赋值。

希望这有帮助。