unix - 查找给定范围内毕达哥拉斯三元组的数量

标签 unix c++ c

我正在尝试编写一个程序,用于打印给定范围 N 的毕达哥拉斯三元组 (a^2 + b^2 = c^2),其中 a<=b<=c<=N。

#include <stdio.h>

int main()
{

  int a = 0, b = 0, c = 0, N, T,c2;

  scanf("%d", &T);

  while(T--)
  {
    int counter = 0;
    scanf("%d", &N);
   {
     for (c = 0; c <=N; c++)
     {
       for (b = 0; b < c; b++)
       {
          for (a = 0; a < b; a++)
          {
             c2 = c*c;
            if (a*a + b*b == c2 )
            //if(sqrt (pow(a,2) + pow(b,2)) == c) 
            {
                ++counter;
                 printf("\n %d , %d, %d \n",a,b,c);   }
            }
         }
      }
   }
   printf("%d\n", counter);

  }
  return 0;
}

这对于 N<1000 非常有效。对于更高的 N,例如 10000,这需要很多时间。 有没有更好的方法来优化这个程序或任何更好的算法而不是蛮力,以便花费更少的时间来计算更高的 N ?

最佳答案

根据数论,毕达哥拉斯三元组由 (2pq, p^2-q^2, p^2+q^2) 参数化。您可以枚举这些,并在 c > N 时中止。这当然是最佳选择,因为您执行的计算次数与三元组的数量一样多...

关于unix - 查找给定范围内毕达哥拉斯三元组的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24141150/

相关文章:

c++ - 如何用范围内的随机值填充数组? (重复是可以的。)

c++ - 命令行参数不起作用 - 完全跳过它们

c - 如何在 C 中逐字获取输入而不获取整个字符串?

C编程比较二维数组的行和列

c - 我应该调用什么 API 来获得系统正常运行时间?

unix - 如何创建每月第二个星期二运行的 cron 作业

objective-c - C编程格式调整

c - C 和 Go 之间的抽象 Unix 套接字

linux - 尝试创建永久别名 - UNIX

c++ - 通用类型演绎斯科特迈耶斯