本帖最后由 jackz007 于 2021-11-2 01:36 编辑
我帮你修改了一下,我发现只要循环变量 i 从 600851475143 / 2 开始就会进入死循环,具体原因我也不清楚,而只要把循环起点的 i 值改成 sqrt(600851475143) ,则很快就能得到结果(600851475143 的最大素数因子)。
#include<stdio.h>
int main()
{
int a ;
long long i , j , k , x = 600851475143 , z ;
for(k = 2 ; k * k < x ; k ++) ; // 获取能使 k * k >= 600851475143 的最小 k 值,这个值原来用的是 600851475143 / 2
for(i = k ; i > 1 ; i --) {
if(x % i == 0) {
for(a = 1 , j = 2 ; j * j <= i ; j ++) { // a 是用来判定素数的,所以,对于每一个 i 值,都必须重新初始化为 1
if(i % j == 0) {
a = 0 ;
break ;
}
}
if(a) break ;
}
}
printf("%I64d\n" , i) ;
return 0 ;
}
下面的代码可以一次性找出 600851475143 的所有素数因子#include <stdio.h>
int main(void)
{
unsigned long long c , d , e , x = 600851475143 ;
for(c = 0 , e = 2 , d = x ; d >= e ;) {
if(! (d % e)) {
if(! c) printf("%I64u = %I64u" , x , e) ;
else printf(" * %I64u" , e) ;
d /= e ;
c ++ ;
} else e ++ ;
}
}
编译、运行实况:D:\00.Excise\C>g++ -o x x.c
D:\00.Excise\C>x
600851475143 = 71 * 839 * 1471 * 6857
D:\00.Excise\C>
|