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

我需要做一个程序,找到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;
                }
            }
        }
    }
}

你的代码对我来说很好。因为它不会漏掉任何三胞胎

但是,我认为可以通过消除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();