C ++:程序找到一个数字的最大素数因子,我的代码有什么问题?

时间:2013-10-10 14:43:46

标签: c++

这应该找到一个数字的最大素数因子..但它不起作用.. 答案应该是6857,但它返回688543 ..

int isPrime(unsigned long int n)
{
    for(unsigned long int i=2;i*i<(n);i++)
    {
        if(n%i==0)
        {
            return 0;
            break;
        }
    }
    return 1;
}

int main()
{
    unsigned long int num=600851475143;
    unsigned long int max=2, i=2;
    while(num!=1)
    {
        if(num%i==0 && isPrime(i))
        {
            max=i;
            num/=i;
            i--;
        }

        i++;
    }
    cout<<max;
    return 0;
}

提前致谢:)

2 个答案:

答案 0 :(得分:0)

unsigned long显然是您系统上的32位,因此num不会是600851475143,而是600851475143 mod 1<<32,即3851020999688543是此数字的最大素数因子,因此您的算法似乎至少可以正常工作。

在编译器/系统组合中查找类型的最大范围,然后选择合适的范围。

答案 1 :(得分:0)

在其他问题中,这将是一个大数字的问题:

for(unsigned long int i=2;i*i<(n);i++)

i*i对于大数字会溢出unsigned long(在您编译的系统上似乎是32位)。

您可以通过切换来修复它:

for (unsigned long int i = 2; i <= sqrt(n); ++i)

只要n没有溢出,sqrt(n)就会有效。但是,如果要使用非常接近32位整数边界的数字,我仍然建议切换到使用unsigned long long