毕达哥拉斯三重奏

时间:2014-01-14 09:33:50

标签: c algorithm

我尝试解决this problem

  

恰好存在一个毕达哥拉斯三重态,其中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;
 }

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

那我的错是什么?

3 个答案:

答案 0 :(得分:4)

有一个典型错误,其中包含您正在使用的公式:并非所有毕达哥拉斯三元组都可以用它来描述(但所有小学那些); 公式集是

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

例如,小节(9 12 15)需要 k = 3 ;但是,提供的集合过度:某些三元组出现两次或更多次,因此您将不得不使用HashMap或其他东西。在您确切的问题中,所需的三元组(375 200 425)由(m = 20,n = 5,k = 1)生成,所以在这个 Project Euler promblem可以使用缩短的公式,但是在其他人中,你将与正确的人有关。

答案 1 :(得分:0)

ab在公式a^2 + b^2 = c^2中完全等效(与c不同,后者扮演着不同的角色)。保持算法不变,并在获得算法后在结果中交换ab,如果它们恰好处于“错误”的顺序。

从形式上讲,鉴于任何abc属于毕达哥拉斯三元组,除了因为a < b不属实,而b < a是,bac是毕达哥拉斯三重奏。

答案 2 :(得分:0)

  

这是错误的,因为它应该是&lt; b&lt; ç

我认为你说“应该”,因为你认为(m²-n²)&lt; 2mn&lt; (平方米+N²)。

确实,m2 +n²≥2nm并且确实m2 +n²≥m²-n²但是2mn≥m²-n²是不正确的(如果需要,可以在下面解释)。例如,取m = 4且n = 1.然后2mn = 8,小于m²-n² = 15。

所以你不应该将a < b作为终止条件,这不是你想要的。

基本上你有正确的算法来找到答案,但有时a将是最短的一面,有时会b。这是有道理的,因为它只是公式中特殊的c(hypoteneuse)。所以改为按照你的方式运行算法 - 这会找到三元组 - 然后如果你想返回一个答案集,其中a < b < c只是在返回之前交换ab。< / p>

最后,正如另一位回答者指出的那样,这可能找不到你正在寻找的毕达哥拉斯三重奏。对于任何a²+b²=c²,ka²+kb²=kc²也是正确的,结果可能是pa + pb + pc = 1000(其中p²= k)......


解释数学:

对于真实的m,n。

(m-n)² ≥ 0所以m²-2mn-n² ≥ 0m²-n² ≥ 2mn

(第一个结果)

然后(第二个结果)

m²+n² ≥ m²-n²
由于m²≥0且n²≥0,

对于实m和n是微不足道的。