C++ 查找小于500的所有毕达哥拉斯三元组
我需要做一个程序,找到a,b,c到500的所有毕达哥拉斯三元组。这是我的密码:C++ 查找小于500的所有毕达哥拉斯三元组,c++,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 &a
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的for循环来提高效率(
O(n^2logn)而不是O(n^3)
)。只需计算a^2+b^2,并在一个预构建的数字平方列表(最多500个)中对该数字进行二进制搜索
当然,这需要O(n)个额外的内存空间。您可以省略
c
上的整个循环以及b
上的大部分循环。我们只需要在一个范围内测试b
,该范围从当前值a
[防止打印同一个三元组两次],到sqrt(500^2-a^2)
[因为c
不会像其他人所说的那样,您的代码打印正确的值,而不是从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();
#包括
流myfile(“results.txt”);
对于(int a=1;a你在问为什么当你限制c*c测试c时,你的列表会更短?很明显,如果你在200年代开始测试,你会出错3^2+4^2=5^2?代码看起来很好。c*c如果你想找到整个列表,我建议你在和&
之后删除这个条件。这里的问题是你限制了你的列表c*c的值应该总是小于500,这意味着c可以取小于23的值
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²
#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();