开发者

finding a pythagorean triplet (project euler)

I'm well aware this brute force method is bad and that I should be using something like Euclid's formula, and that the final loop isn't needed as c = 1000 - (a + b) etc... but right now I just want this to work.

bool isPythagorean(int a, int b, int c) {
    if((a*a + b*b) == c*c && a < b && b < c) {
        cout << a << " " << b << " " << c << endl;
        return true;
    } else {
        return false;
    }
}

int 开发者_StackOverflow社区main()
{
    int a = 1;
    int b = 2;
    int c = 3;

    for(a = 1; a < b; ++a) {
        for(b = 2; b < c; ++b) {
            for(c = 3; a + b + c != 1000 && !isPythagorean(a, b, c); ++c) {
            }
        }
    }

    return 0;
}

For the most part, the code works as I expect it to. I cannot figure out why it is stopping shy of a + b + c = 1000.

My final triplet is 280 < 294 < 406, totalling 980.

If I remove the a < b < c check, the triplet becomes 332, 249, 415 totalling 996.

All results fit the pythagorean theorem -- I just cannot land a + b + c = 1000.

What is preventing me?


This part of the code iterates very strangely:

for(a = 1; a < b; ++a) {
    for(b = 2; b < c; ++b) {
        for(c = 3; a + b + c != 1000 && !isPythagorean(a, b, c); ++c) {
        }
    }
}

Initially, a = 1, b = 2, c = 3. But upon the first for(c), c=997, so the second iteration of for(b) will run up to b=996. Keep doing this, and at some point you find a triple (a,b,c), at that point, c is probably not close to 1000, b will iterate up to whatever state c was is in... and so on. I don't think you can accurately predict the way it's going to come up with triples.

I suggest you go with something like

for(a = 1; 3*a < 1000; ++a) {
    for(b = a+1; a+2*b < 1000; ++b) {
        for(c = b+1; a + b + c != 1000 && !isPythagorean(a, b, c); ++c) {
        }
    }
}

That way, loops won't depend on the previously found triple.

... and you really should use Euclid's method.


The condition in your innermost for loop explicitly says to never test anything where a + b + c is equal to 1000. Did you mean a + b + c <= 1000?


Alternate possible Solution:

#include <iostream>
#define S(x) x*x

int main() {
int c = 0;
for(int a=1;a<(1000/3);++a) {
    // a < b; so b is at-least a+1 
    // If a < b < c and a + b + c = 1000 then 'a' can't be greater than 1000/3  
    // 'b' can't be greater than 1000/2. 
    for(int b=a+1;b<(1000/2);++b) {         
        c = (1000 - a - b); // problem condition
        if(S(c) == (S(a) + S(b) ))
            std::cout<<a*b*c;
        }
    }       
return 0;
}

For additional reference please refer the following posts Finding Pythagorean Triples: Euclid's Formula Generating unique, ordered Pythagorean triplets

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜