我正在编写一些代码来计算勾股三元组,但是后来我得到了一些不是解决方案的值。这是代码:
#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
。