Javascript中的毕达哥拉斯三元组公式 - Project Euler Prob 9

TGa*_*arr 1 javascript loops formula

我正在尝试解决项目欧拉问题9:

毕达哥拉斯三元组是一组三个自然数,a <b <c,其中,a2 + b2 = c2

例如,32 + 42 = 9 + 16 = 25 = 52.

恰好存在一个毕达哥拉斯三元组,其中a + b + c = 1000.找到产品abc.

我在维基百科上查找了找到毕达哥拉斯三元组的公式,并尝试将其翻译成代码.问题是代码输出了错误的答案,但我认为代码是正确的.

var a, b, c;
var pos1, pos2, pos3;
var ans1, ans2, ans3;

for(var n=2; n<=20000; n++) {
  a = 2 * n + 1;
  b = 2 * n * (n +1);
  c = 2 * n * (n +1) + 1;
  if(a<b<c) {
  if(a^2 + b^2 === c^2) {
      pos1 = a;
      pos2 = b;
      pos3 = c;
  }
  if(a + b + c ===1000) {
      ans1 = a;
      ans2 = b;
      ans3 = c;
  }
}
}
console.log(ans1 + " " + ans2 + " " + ans3);
Run Code Online (Sandbox Code Playgroud)

Xot*_*750 7

这是一个解决方案

var a;
var c;

for (var b = 1; b < 1000; b += 1) {
    a = (500000 - 1000 * b) / (1000 - b);

    if (Math.floor(a) === a) {
        c = 1000 - a - b;

        break;
    }
}

console.log(a, b, c);
Run Code Online (Sandbox Code Playgroud)

结果是375 200 425

jsfiddle

毕达哥拉斯
a 2 + b 2 = c 2

我们还有
一个+ b + c = 1000

代数,重新排列c到左
c = 1000 - (a + b)

插入c回到毕达哥拉斯
a 2 + b 2 =(1000 - (a + b))的2

乘出
一个2 + b 2 = 1000000 - 2000*(A + b)+(A + b)2

乘出
一个2 + b 2 = 1000000 - 2000*(A + b)+ A 2 + 2*a*b + b 2

重新排列2 + b 2以简化
0 = 1000000 - 2000*(a + b)+ 2*a*b

重新排列未知数到左
2000*(a + b) - 2*a*b = 1000000

简化,/ 2
1000*(a + b) - a*b = 500000

factorize
a(1000 - b)+ 1000*b = 500000

重新排列
a(1000 - b)= 500000 - 1000*b

a =(500000 - 1000*b)/(1000 - b)

现在输入b,计算a并测试a是否是Pythagorean Triples所要求的整数


Jas*_*Fry 5

TGarr,这是对 Xotic750 答案的解释。

我真的不明白你是如何创建这个算法的。为什么 a = (500000 - 1000 * b) / (1000 - b) ...

他从 a^2 + b^2 = c^2 和 a + b + c = 1000 开始,并将它们组合起来,因为投影仪上的问题表明只有 1 组数字同时满足这两个条件。以下是他如何将它们结合起来。他将第二个方程的 c 解为 c = 1000 - (a + b)。然后他将其代入第一个方程,使其变为 a^2 + b^2 = (1000 - (a + b))^2。他继续下去,直到他能够解出 a 的整个方程。一旦他能够做到这一点,他就能够制作一个for增加 b 的循环,这比许多其他选项更简单、更优雅。

为什么if语句的条件设置为Math.floor(a) === a?

这只是意味着“是a,向下舍入到最接近的整数,与a?相同” 换句话说,是a整数吗?(复制他的代码,并在语句console.log ( a );上方添加if。这可能会帮助你理解那段代码)由于他能够解出 a 的方程,他所要做的就是为 b 代入不同的数字,并且一旦结果是一个整数,他就会得到答案。或者至少他会知道什么ab c = 1000 - a - b;告诉他c是什么,这就是她写的全部。