发现不到500的所有毕达哥拉斯三元组

时间:2014-02-20 04:55:16

标签: c++

我需要制作一个程序,找到a,b和c到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;
                }
            }
        }
    }
}

我的for语句检查c中的每个值,然后是b,然后是a。所以我的问题似乎在if语句中。它检查平方和b平方是否等于c平方。没关系。然而,在和声明之后发生了一些有趣的事情。如果我把它设为c * c <= 500,那么我得到一个明显更短的数字列表,而不是c&lt;但是,如果使用c < 500然后程序在200s开始上升,缺少明显的三元组,如3 + 4 = 5。我很好奇为什么会这样,因为很明显我并没有为每个值打印每一个三元组。

编辑:好的,显然c和c * c的区别很大,但我用c * c来测试程序的奇怪之处,抱歉不清楚。此外,删除和语句也存在同样的问题。我不明白为什么当前状态的程序在200s而不是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
...

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

您的代码对我来说很好。因为它不会错过任何三重奏。

但是,我认为你可以通过消除c的for循环来提高效率(O(n^2logn) instead of O(n^3))。只需计算a^2 + b^2并在预先建立的数字方块列表中对此数字进行二元搜索,最多可达500个。

当然这需要额外的O(n)内存空间。

答案 2 :(得分:0)

您可以省略c上的整个循环以及b上的整个循环。我们只需要在b [阻止打印相同的三元组]的当前值的范围内测试a,并以sqrt(500^2 - a^2) [< em>因为c对于较大的<=500 而言b不会是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))+"²"); } } 。我给出了一个Java解决方案,应该没有问题可以适应:

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