c - 毕达哥拉斯三元组

标签 c algorithm

我尝试解决 this problem

There exists exactly one Pythagorean triplet for which a + b + c = 1000.

我使用欧几里得公式:

Euclid's formula

我的解决方案是:

int a = 0, b = 0, c = 0, m = 0, n = 0;
int abort = 0;

 while(abort == 0)
 {
      m++;
      while(abort == 0 && n < 10000)
      {
          n++;
          if(m > n)
          {
              a = (m*m) - (n*n);
              b = 2*m*n;
              c = (m*m) + (n*n);

              if(a+b+c == 1000 && a > 0 && b > 0 && c > 0 /*&& a < b && b < c*/)
              {
                   exit = 1;
              }
          }
      }
      n = 0;
 }

如果我运行它,我得到 a = 375 b = 200 和 c = 425。这是错误的,因为它应该是 a < b < c但是如果我使用你在我的代码中看到的检查(被注释掉的部分),我的代码将永远运行。

那么我的错误是什么?

最佳答案

您使用的公式集有一个典型错误:并非所有毕达哥拉斯三元组都可以用它来描述(但所有基本 个); 正确的公式集是

  a = k * (m * m - n * n)
  b = k * (2 * m * n)
  c = k * (m * m  + n * n)

例如,tiplet (9 12 15) 需要 k = 3;但是,提供的集合过多:一些三元组出现两次或更多次,因此您将不得不使用HashMap 或其他东西。在您的确切问题中,所需的三元组 (375 200 425) 是由 (m = 20, n = 5, k = 1) 生成的,因此在this Project Euler 问题中可以使用缩短的公式,但是在其他情况下,您必须使用正确的方法。

关于c - 毕达哥拉斯三元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21110044/

相关文章:

algorithm - 算法的复杂度(渐近)

algorithm - 是否存在可以生成所有可能排列的交换序列?

c - 关闭我最近创建的文件时 fclose 崩溃

C malloc 增加缓冲区大小

c - Windows 命令提示符如何处理连续的 CTRL + C (SIGINT) 信号?

c - 无法杀死在 NVIDIA GPU 上运行的坏内核

c++ - 时间复杂度相同但运行时间差异很大

python - 用于检查矩阵中行/列中的 5 的更好算法

java - 如何在 Java 中测试一副纸牌是否洗得足够多

c - union、.c 和 .h 文件中的 Typedef 嵌套结构