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

#include  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的范围内。
我能做些什么才能让它发挥作用?

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

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

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

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

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

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

来自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。

在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范围。

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

编辑:像这样定义n:

 long long int n = 600851475143LL; 

LL – 是强制执行long long类型的后缀…