我尝试解决this problem
恰好存在一个毕达哥拉斯三重态,其中a + b + c = 1000。
我使用欧几里德的公式:
我的解决方案是:
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
但是如果我使用你在我的代码中看到的检查(被注释掉的部分)我的代码永远运行。
那我的错是什么?
答案 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)
a
和b
在公式a^2 + b^2 = c^2
中完全等效(与c
不同,后者扮演着不同的角色)。保持算法不变,并在获得算法后在结果中交换a
和b
,如果它们恰好处于“错误”的顺序。
从形式上讲,鉴于任何a
,b
和c
属于毕达哥拉斯三元组,除了因为a < b
不属实,而b < a
是,b
,a
和c
是毕达哥拉斯三重奏。
答案 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
只是在返回之前交换a
和b
。< / p>
最后,正如另一位回答者指出的那样,这可能找不到你正在寻找的毕达哥拉斯三重奏。对于任何a²+b²=c²,ka²+kb²=kc²也是正确的,结果可能是pa + pb + pc = 1000(其中p²= k)......
解释数学:
对于真实的m,n。
(m-n)² ≥ 0
所以m²-2mn-n² ≥ 0
和m²-n² ≥ 2mn
。
(第一个结果)
然后(第二个结果)
m²+n² ≥ m²-n²
由于m²≥0且n²≥0,对于实m和n是微不足道的。