2014-02-20 34 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();