如何找到最大的素数因子600851475143?

时间:2013-10-14 12:29:27

标签: c

#include <stdio.h>
main()
{
    long n=600851475143;
    int i,j,flag;
    for(i=2;i<=n/2;i++)
    {
        flag=1;
        if(n%i==0)//finds factors backwards
        {
            for(j=2;j<=(n/i)/2;j++)//checks if factor is prime
            {
                if((n/i)%j==0)
                    flag=0;
            }
            if(flag==1)
            {
                printf("%d\n",n/i);//displays largest prime factor and exits
                exit(0);
            }
        }    
    }
}

上述代码适用于n = 6008514751。但是,它对n = 600851475143不起作用,即使该数字仍在long的范围内。 我能做些什么才能让它发挥作用?

5 个答案:

答案 0 :(得分:5)

一个潜在的问题是,ijint,并且可能会因大n而溢出(假设intlong更窄通常是这样的。)

另一个问题是,对于n = 600,851,475,143,你的程序做了很多工作(最大的因素是6857)。期望花费很长时间才能完成是不合理的。

答案 1 :(得分:3)

使用long代替int s。更好的是,使用自C99以来定义的uint64_t(承认Zaibis)。它是所有平台上的64位无符号整数类型。 (你拥有的代码会在某些平台上溢出)。

现在我们需要让您的算法更快地运行:

你的素数测试效率低下;你不需要迭代所有偶数。只是迭代素数;达到并等于您正在测试的数字的平方根(不是您目前所做的一半)。

你从哪里获得素数?好吧,递归调用你的函数。虽然实际上我很想将素数缓存到65536.

答案 2 :(得分:1)

来自ISO / IEC 9899:TC3

  

5.2.4.2.1整数类型的大小

[...]

  

它们的实现定义值的大小(绝对值)应与所示值相等或更大,且符号相同。

[...]

  

- long int

类型的对象的最小值      

LONG_MIN -2147483647 // - (2 ^ 31 - 1)

     

- long int

类型的对象的最大值      

LONG_MAX +2147483647 // 2 ^ 31 - 1

编辑:

抱歉,我忘了添加这个应该告诉你的内容。

要点很长,甚至不需要能够保持你提到的值,因为标准说它必须能够保持至少4个字节的符号,这样你的机器才有可能只能在long类型的变量中保存最多2147483647的值。

答案 3 :(得分:1)

在32位计算机上long范围从-2,147,483,6482,147,483,647,在64位计算机上,其范围从-9,223,372,036,854,775,8089,223,372,036,854,775,807注意:这不是C标准规定的,可能因编译器而异。) 正如OP在评论中所说,他是32位,600851475143超出范围,因为它不适合long的范围。

答案 4 :(得分:0)

尝试将n更改为long long int ..并将i,j更改为长

编辑:像这样定义n:

long long int n = 600851475143LL;

LL - 是强制执行long long类型的后缀......