我需要制作一个程序,找到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
...
答案 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}}