项目Euler 9解决方案没有给出正确的结果

时间:2015-05-19 16:11:29

标签: java algorithm combinatorics

问题是:

  毕达哥拉斯三元组是一组三个自然数,a< b< C,   为此,

     

a ^ 2 + b ^ 2 = c ^ 2例如,3 ^ 2 + 4 ^ 2 = 9 + 16 = 25 = 5 ^ 2.

     

恰好存在一个毕达哥拉斯三重态,其中a + b + c =   1000.找到产品abc。

因此使用函数tripletP()我认为该程序为数字1000生成3个加法器的所有可能组合。 并且函数isTriplet(a,b,c)在这段代码中,永远不会返回true,并且int product的值最后为0。 我似乎无法找到我的逻辑中的缺陷,任何帮助都会受到赞赏。

这是我的Java类,其代码我认为可以解决问题9:

public class ProblemNine {


    public static void main(String[] args) {

        ProblemNine f = new ProblemNine();
        System.out.println(f.tripletP());

    }

    boolean isTriplet(int a, int b, int c){

        if((a*a)+(b*b)==(c*c)){
            return true;
        } else return false;    
    }

    int tripletP(){
        int a=1,b=2,c=997;
        int product = 0;

        //outerloop generates all possible combinations of 3 summators for the number 1000, if b>c>a is true
        outerloop:
        for(int i = 997; i>499; i--){
            c = i;
            b = 999-i;
            a = 1;

            while(b>(a+2) && (a+b) == (1000-i) && a!=b && c>b){
                b--;
                a++;
                // supposedly checks if a,b,c are a triplet.
                if (isTriplet(a,b,c)){
                    product=a*b*c;
                    break outerloop;
                }
            }   

            if(c>997 || b>499 || a>249){
                break outerloop;
            }
        }

        return product;
    }

}

1 个答案:

答案 0 :(得分:2)

for(int i = 997; i>499; i--){

你太早停止了。如果a<b<ca+b+c == 1000,c的最小可能值不是500,则为335。

for(int i = 997; i>335; i--){

有了这个新的下限,b偶尔会大于c,这会过早地触发你的一些条件。但是,你可以删除它们并仍然得到正确的答案。

    for(int i = 997; i>335; i--){
        c = i;
        b = 999-i;
        a = 1;

        while(b>(a+2)){
            b--;
            a++;
            if (isTriplet(a,b,c)){
                product=a*b*c;
                break outerloop;
            }
        }
    }