|
发表于 2021-11-2 00:55:17
|
显示全部楼层
本帖最后由 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>
复制代码 |
|