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)
这是一个解决方案
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
毕达哥拉斯
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所要求的整数
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 代入不同的数字,并且一旦结果是一个整数,他就会得到答案。或者至少他会知道什么a并b c = 1000 - a - b;告诉他c是什么,这就是她写的全部。