【问题标题】:Finding number of Pythagorean triples within a given range在给定范围内查找毕达哥拉斯三元组的数量
【发布时间】:2014-06-10 12:25:55
【问题描述】:

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

#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

【问题讨论】:

  • a) 这是 Stackoverflow 的问题。 b) 欧拉计划?
  • ...或者最好不要这样做,因为它也可以在那里关闭。
  • @deviantfan.. 为什么会在 S/O 上关闭?只是好奇......这似乎是一个合法的编程问题,除非我真的很愚蠢并且错过了一些东西
  • 一旦abc中的2个固定,最后一个可以不循环直接计算。 (所以在你的情况下a*a = c*c - b*b

标签: unix c++ c


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    首先,您可以在c 的新值可用时立即计算c2

     for (c = 0; c <=N; c++)
      {
       /* compute c2 here */
    

    这节省了为每个ba 反复计算的时间。

    b 也是如此:只要b 可用,就可以计算b 的平方,而不是计算a 的每个值。您的编译器可能会自动应用这些优化,但不一定。

    最后,只有一个值a 可以使等式成立,这个值是sqrt(c2 - b2)。对于较大的b 值,计算此表达式并检查它是否使等式成立比测试0b 之间的所有值要快得多。如果您对sqrt(c2 - b2) 使用双精度计算,那么浮点逼近将不会成为问题,直到N 约为 226

    【讨论】:

      【解决方案3】:

      您可以通过以下计算减少一个变量。如果我们假设

      a = m^2 - n^2,  b = 2mn,  c = m^2 + n^2
      

      让我们检查它是否满足a^2 + b^2 = c^2

      a^2+b^2 = (m^2 - n^2)^2 + (2mn)^2 = (m^2 + n^2)^2 = c^2.
      

      现在,我们可以遍历所有可能的mn 并生成相应的abc

      这是我用过的最快的方法。但是,我不知道是否存在任何O(1)O(log(n)) 数学解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-07
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多