我正在编写一些代码来计算勾股三元组,但是后来我得到了一些不是解决方案的值。这是代码:

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
int j, counter = 0;
double candidate, sqrnbr;
for (int i = 400; i <= 500; i++) //note that the range is only from 400-500 since I am still testing the code
{
    for (j = i; j <= 500; j++)
    {
        candidate = i*i+j*j;
        sqrnbr=sqrt(candidate);
        if (candidate/sqrnbr==sqrnbr)
        {
           cout << i << " and " << j << " and " << sqrnbr << endl;
           counter++;
        }
    }

}
cout << counter << endl;
system("pause");
return 0;
}

它提供的输出之一是408、410和578.415。有谁知道为什么会这样吗?

最佳答案

您计算double而不用检查它是否是整数值,因此得到double值。您不会得到更多,因为平方根通常无法表示为double,因此

candidate/sqrnbr == sqrnbr

对于candidate的许多值是false。

要生成勾股三重奏,请仅使用整数算法。还有比蛮力更好的方法,有一个经典的公式,所有毕达哥拉斯三胞胎的形式
d*(m^2 - n^2), d*2*m*n, d*(m^2 + n^2)

对于一些d, m, n

08-16 02:53