2011-03-15 30 views
1

我很清楚這個蠻力方法是壞的,我應該使用類似歐幾里德公式的東西,並且最終循環不需要c = 1000 - (a + b)等......但現在我只是想讓這個工作。找到一個畢達哥拉斯三重線(項目歐拉)

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 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; 
} 

大部分情況下,代碼的工作方式與我預期的一樣。我想不通爲什麼它被停止害羞A + B + C = 1000

我最後的三重的是280 406,共計980

如果我刪除一個< b < C檢,三重變成332,249,415共計996

所有結果符合勾股定理 - 我只是不能土地+ b + C = 1000

什麼在阻止我嗎?

+0

我搜索看着類似的帖子,其中沒有分享我的問題。 – monkeySeeMonkeyDo 2011-03-15 21:03:34

+0

如果你想要'a 2011-03-15 21:26:54

回答

1

你最內層的for循環中的條件明確地說永遠不會測試任何其中a + b + c等於1000的東西。你的意思是a + b + c <= 1000

+0

我忘記提及,我確實接受了這一點,輸出與...相同...... = 1000. – monkeySeeMonkeyDo 2011-03-15 21:11:17

5

的代碼循環的這部分很奇怪:

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

最初,a = 1, b = 2, c = 3。但是在第一個for(c),c=997,所以第二次迭代for(b)將運行到b=996。繼續這樣做,在某個時候你會發現一個三元組(a,b,c),那時,c可能不會接近1000,b會迭代到c處於的狀態......等等。我認爲你無法準確預測它將會產生三倍的方式。

我建議你的東西去像

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) { 
     } 
    } 
} 

這樣的話,循環將不依賴於先前發現的三倍。

...你真的應該使用歐幾里得的方法。

+0

原諒我的無知,但爲什麼應該將b和c初始值設爲a + 1和b + 1。這與僅使用1,2和3有何不同? – monkeySeeMonkeyDo 2011-03-15 21:25:37

+0

當暴力時,使用一些小的觀察來減少問題的大小是明智的。例如因爲b> 0,a * a + b * b> a * a,所以c * c> a * a和c> a。然後c + a> 2 * a和2 * a + b 2011-03-15 21:32:43

0

替代可能的解決方案:

#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; 
} 

有關其他參考,請參閱下列職位 Finding Pythagorean Triples: Euclid's Formula Generating unique, ordered Pythagorean triplets