2014-02-20 35 views
0

我需要做的是找出所有勾股數爲A,B和C到500這裏是我的代碼的程序:找到所有的勾股數小於500

int main() 
{ 
    for (int a = 1; a <= 500; a++) 
    { 
     for (int b = 1; b <= 500; b++) 
     { 
      for (int c = 1; c <= 500; c++) 
      { 
       if ((a*a)+(b*b) == c*c && c <= 500) 
       { 
        cout << a << " + " << b << " = " << c << endl; 
       } 
      } 
     } 
    } 
} 

我的發言爲您在每個值c,然後b,然後a。所以我的問題似乎在if語句中。它檢查平方和b平方是否等於c平方。沒關係。儘管如此,一些有趣的事情發生在和聲明之後。如果我使c * c < = 500,我會得到比c < 500小得多的小數字列表。但是,如果使用c < 500,那麼程序將在200s內開始並上升,失去明顯的三元組,如3+ 4 = 5。我很好奇爲什麼會發生這種情況,因爲顯然我不會爲每個值打印每個三元組。

編輯:好的,顯然c和c * c的區別很大,但我用c * c來測試程序中有什麼奇怪的東西,抱歉不清楚。另外,刪除和語句也會出現同樣的問題。我不明白爲什麼這個節目現在的狀態是從200年代開始,而不是在3 + 4 = 5年。以下是當前輸出:

208 + 306 = 370 
208 + 390 = 442 
209 + 120 = 241 
210 + 72 = 222 
210 + 112 = 238 
210 + 176 = 274 
210 + 200 = 290 
210 + 280 = 350 
210 + 416 = 466 
... 
+1

你問你爲什麼在限制'c * c <= 500'而不是'c <500'時爲什麼你的列表更短?這應該是相當明顯的...... –

+0

在'if'條件下測試'c <= 500'是多餘的,因爲for循環已經保證這是真的。我不明白爲什麼這個代碼會錯過'3^2 + 4^2 = 5^2',你能解釋還是顯示輸出?當然,對於'c * c <= 500',結果會更少。這種情況顯然更具有限制性。 – Nabla

+0

那麼,顯然如果你在200年代開始,你會錯誤3^2 + 4^2 = 5^2? – qwr

回答

0

您的代碼對我來說工作正常。因爲它不會錯過任何三聯。

但是,我認爲你可以通過消除for循環來提高效率(O(n^2logn) instead of O(n^3))。只需計算a^2 + b^2並在預先編制的500以內的正方形數列中進行二進制搜索。

當然這需要O(n)額外的內存空間。

0

您可以省略c的整個循環以及b以上的一部分。我們只需要在一個範圍內,以測試b開始的a [從打印相同三重兩次防止]和sqrt(500^2 - a^2)結束[因爲c不會<=500對於較大b]的當前值。我給Java中的解決方案,這應該是沒有問題的,以適應:

import java.lang.Math; 

public class Pythagorean { 
    public static void main(String[] args) { 
    for (int a=1; a<500; a++) 
    for (int b=a; b<Math.sqrt(250000-a*a); b++) 
    if (Math.sqrt(a*a+b*b) == Math.round(Math.sqrt(a*a+b*b))) 
     System.out.println(""+a+"² + "+b+"² = "+(int)Math.round(Math.sqrt(a*a+b*b))+"²"); 
    } 
} 

輸出:

3² + 4² = 5² 
5² + 12² = 13² 
6² + 8² = 10² 
7² + 24² = 25² 
8² + 15² = 17² 
9² + 12² = 15² 
9² + 40² = 41² 
10² + 24² = 26² 
11² + 60² = 61² 
12² + 16² = 20² 
[...] 
300² + 315² = 435² 
319² + 360² = 481² 
320² + 336² = 464² 
325² + 360² = 485² 
340² + 357² = 493² 
1

像其他人所說的,你的代碼打印出正確的價值觀,不只是從開始超過200

208 + 306 = 370

我覺得你的問題是輸出超支可用的屏幕緩衝區。因此,在頂部,您會看到它始於208 + 306 = 370.

嘗試將結果寫入文件。

#include<fstream> 
ofstream myfile("results.txt"); 
for (int a = 1; a <= 500; a++) 
{ 
    for (int b = 1; b <= 500; b++) 
    { 
     for (int c = 1; c <= 500; c++) 
     { 
      if ((a*a)+(b*b) == c*c && c <= 500) 
      { 
       cout << a << " + " << b << " = " << c << endl; 
       myfile << a << " + " << b << " = " << c << endl; 
      } 
     } 
    } 
} 
myfile.close();