这个看似无害的代码不会产生任何输出

时间:2017-02-21 17:13:37

标签: c++

问题 - 找一个毕达哥拉斯三元组(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;
            }
        }
    }
}

5 个答案:

答案 0 :(得分:1)

显然,考虑到if1 <= a < 3351 <= 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)

您已选择较小的值作为循环终止条件(初始问题说明未指定abc可能位于的范围内)

如果你将它们增加到1000,你会看到输出:

  

31875000

如果您修改代码以打印单个abc值,您将获得:

  

200 375 425

Live demo

答案 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;
            }
        }
    }
}

在您的代码中,您认为abc值不应超过1000的三分之一,但它们是!这只是意味着您必须测试所有可能的情况,因为每个数字abc在技术上可以是0到1000之间的任何数字。但是,这可能会导致负数c的值,并假设您的自然数必须为正数,您应该在c变为负数时跳过,因此if(c < 0) continue;位。 (它跳到最内层循环的下一次迭代)

答案 4 :(得分:-2)

你正在寻找这个:

#include <cmath>
const double EulerConstant = std::exp(1.0);

或欧拉的方法:看这里:eulers method