所有毕达哥拉斯的三元组都小于500

Finding all Pythagorean triples less than 500

本文关键字:小于 三元组 毕达哥拉斯      更新时间:2023-10-16

我需要制作一个程序,找到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语句中。它检查a的平方和b的平方是否等于c的平方。没关系。不过,在和语句之后会发生一些有趣的事情。如果我把它做成c*c<500的情况下,我得到了比c<500。然而,如果使用c<500,然后程序从200开始向上,缺少明显的三元组,如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
...

正如其他人所说,您的代码打印正确的值,而不是从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();

你的代码对我来说很好。就像在中一样,它不会错过任何三元组。

然而,我认为你可以通过消除c的for循环来提高效率(O(n^2logn) instead of O(n^3))。只需计算a^2 + b^2,并在预先构建的500以内的数字平方列表中对这个数字进行二进制搜索。

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

您可以省略c上的整个循环和b上的大部分循环。我们只需要在一个范围内测试b,该范围从a的当前值开始[防止打印同一个三元组两次],并在sqrt(500^2 - a^2)[]结束,因为对于较大的bc不会是<=500。我用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²