确定平方根是否为整数
在我的程序中,我试图找到数字600851475143中最大的素数因子。我已经为循环确定了该数字的所有因子,并将它们存储在矢量数组中。 我遇到的问题是我不知道如何确定该因子是否可以平方根,并给出一个整数而不是小数。 我的代码到目前为止是:
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
vector <int> factors;
int main()
{
double num = 600851475143;
for (int i=1; i<=num; i++)
{
if (fmod(num,i)==0)
{
factors.push_back(i);
}
}
for (int i=0; i<factors.size(); i++)
{
if (sqrt(factor[i])) // ???
}
}
有人能告诉我如何通过我的if语句来确定一个数字是否可以平方根?
int s = sqrt(factor[i]);
if ((s * s) == factor[i])
正如霍布斯在评论中指出的那样,
假设double是通常的64位IEEE-754双精度浮点数,对于小于2 ^ 53的值,一个double和下一个可表示double的差值小于或等于1.高于2 ^ 53,精度为差于整数。
所以如果你的int是32位的,你是安全的。 如果您必须处理大于2 ^ 53的数字,则可能会出现一些精度错误。
以下应该工作。 它利用整数截断。
if (int (sqrt(factor[i])) * int (sqrt(factor[i])) == factor[i])
它的工作原理是非平方数的平方根是小数。 通过转换为整数,您可以删除双精度的小数部分。 一旦你做出这一点,它不再等于原来的平方根。
与cero相比,您还必须考虑到舍入误差。 如果你的编译器支持c ++ 11,你可以使用std :: round,如果没有,你可以自己做(这里)
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
vector <int> factors;
int main()
{
double num = 600851475143;
for (int i=1; i<=num; i++)
{
if (round(fmod(num,i))==0)
{
factors.push_back(i);
}
}
for (int i=0; i<factors.size(); i++)
{
int s = sqrt(factor[i]);
if ((s * s) == factor[i])
}
}
链接地址: http://www.djcxy.com/p/86639.html