1

该程序的目标是使用欧几里得公式 (a = m^2 -n^2, b = 2mn, c = m^2 + n^) 找到小于 500 的每个值 (a, b, c) 的所有毕达哥拉斯三元组2.)所以这是我的代码。

int main()
{
    clock_t start = clock()/ (CLOCKS_PER_SEC/1000);

    for (int m = 1; m <= 500; m++)
    {

        for (int n = 1; n <= 500; n++)
        {

            int a = (m*m)-(n*n);
            int b = 2*m*n;
            int c = (m*m)+(n*n);
            if (m > n && a + b == c)
            {
                cout << a << " + " << b << " = " << c << endl;
            }
        }
    }
    clock_t finish = clock()/ (CLOCKS_PER_SEC/1000);
cout << "completed in " <<clock() << " ms";
    return 0;
}

我试过这个,我的输出什么都没有。我认为它的工作方式是:对于每个小于/等于 500 并从 1 开始的整数 m,每次将 m 加一。n 同样的交易。然后将这些值代入公式,如果 a+b == c,它会打印这些值,从而找到我的三元组。但我没有得到任何输出。

4

4 回答 4

3
a + b = (m^2 + 2mn - n^2) = (m+n)^2 - 2n^2
c = m^2 + n^2 = (m+n)^2 - 2mn

你需要a + b = c

--> 2n^2 = 2mn
--> m = n

由于您还需要m > n,因此您找不到任何解决方案。

于 2014-02-20T16:01:30.833 回答
0

我解决了这个问题; 在程序的最后一次迭代中,我必须将 c 限制为 <= 500:

int main()
{
    clock_t start = clock()/ (CLOCKS_PER_SEC/1000);

    for (int n = 1; n <= 500; n++)
    {
        for (int m = n+1; m <= 500; m++)
        {
            int a = (m*m)-(n*n);
            int b = 2*m*n;
            int c = (m*m)+(n*n);
            if ((a*a) + (b*b) == (c*c) && c <= 500)
            {
                cout << a << " + " << b << " = " << c << endl;
            }
        }
    }
    clock_t finish = clock()/ (CLOCKS_PER_SEC/1000);
cout << "completed in " <<clock() << " ms";
    return 0;
}

这样程序就不会像我遇到问题那样持续太久。谢谢你们!

于 2014-02-20T16:33:22.437 回答
0

你的条件是错误的:你试图得到

(m^2 - n^2) + 2mn = (m^2 + n^2)

(m - n)^2 = m^2 + n^2

但对n > 0你来说,总是有以下严格的不等式:

(m - n)^2 < m^2 < m^2 + n^2

根据维基百科,您想检查平方和是否相等 -

(a^2 + b^2) == c^2

于 2014-02-20T16:04:28.377 回答
0

您在实现中犯了几个错误(请参阅下面的修复):

int main()
{
    for (int n = 1; n <= 500; ++n) // note the swap for the loops
    {
        for (int m = n + 1; m <= 500 && (m*m + n*n) <= 500; ++m) // note that m starts at n + 1
        {
            int a = (m*m)-(n*n);
            int b = 2*m*n;
            int c = (m*m)+(n*n);
            // Euclid already proved this, so there is no need to test it.
            std::cout << a << " + " << b << " = " << c << std::endl;
        }
    }
    return 0;
}
  1. 欧几里得公式需要m > n,因此无需检查不符合该标准的值
  2. 无论如何,你的测试(a + b) == c永远不会奏效。公式是a^2 + b^2 = c^2- 这并不意味着a + b = c
于 2014-02-20T16:06:10.133 回答