确定平方根是否为整数

在我的程序中,我试图找到数字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

上一篇: Determining if square root is an integer

下一篇: Finding square root without using sqrt function?