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

C++: Program to find the largest prime factor of a number, what is wrong in my code?

本文关键字:我的 代码 问题 什么 程序 数字 一个 C++      更新时间:2023-10-16

这应该找到一个数字的最大质因数......但它不起作用。答案应该是 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;
}

提前感谢:(

除其他问题外,这将是大数字的问题:

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

unsigned long显然

在您的系统上是 32 位,所以num不会600851475143而是600851475143 mod 1<<32哪个是3851020999688543是这个数字中最大的素因数,所以看起来你的算法至少可以正常工作。

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

相关文章: