问题 - 找一个毕达哥拉斯三元组(a,b,c),使a + b + c = 1000。
这是代码,我是为Project Euler#9编写的。我知道这是一个非常低效的代码,但逻辑“应该”完成了这项工作。代码根本不产生输出。我不确定会出现什么问题。
#include<iostream>
using namespace std;
int main()
{
long long a,b,c;
for(a=1; a<335; a++)
{
for(b=1;b<335; b++)
{
c = 1000-a-b;
if(a*a + b*b - c*c == 0)
{
cout<<a*b*c;
}
}
}
}
答案 0 :(得分:1)
显然,考虑到if
和1 <= a < 335
,1 <= b < 335
条件中的多项式永远不会等于零。
a**2 + b**2 - (1000 - a - b)**2 == -2*a*b + 2000*a + 2000*b - 1000000
答案 1 :(得分:1)
我发现了错误。代码错误地指出三元组的所有3个数字必须小于334的条件。这是编辑过的代码。
#include<iostream>
using namespace std;
int main()
{
long long a,b,c;
for(a=1; a<998; a++)
{
for(b=1;b<998; b++)
{
c = 1000-a-b;
if(a*a + b*b - c*c == 0)
{
cout<<a*b*c;
}
}
}
}
谢谢大家的时间。
答案 2 :(得分:1)
您已选择较小的值作为循环终止条件(初始问题说明未指定a
,b
或c
可能位于的范围内)
如果你将它们增加到1000,你会看到输出:
31875000
如果您修改代码以打印单个a
,b
或c
值,您将获得:
200 375 425
答案 3 :(得分:0)
正如前面的答案所述,if条件中的多项式永远不会等于零,因为你没有给你的测试数字足够大的范围。尝试这样的事情:
#include<iostream>
using namespace std;
int main()
{
long long a,b,c;
for(a=1; a<1000; a++)
{
for(b=1;b<1000; b++)
{
c = 1000-a-b;
if(c < 0)
continue;
if(a*a + b*b - c*c == 0)
{
cout<<a*b*c;
}
}
}
}
在您的代码中,您认为a
,b
和c
值不应超过1000的三分之一,但它们是!这只是意味着您必须测试所有可能的情况,因为每个数字a
,b
和c
在技术上可以是0到1000之间的任何数字。但是,这可能会导致负数c
的值,并假设您的自然数必须为正数,您应该在c
变为负数时跳过,因此if(c < 0) continue;
位。 (它跳到最内层循环的下一次迭代)
答案 4 :(得分:-2)
#include <cmath>
const double EulerConstant = std::exp(1.0);
或欧拉的方法:看这里:eulers method。