|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
附上答案,我看不懂,不太理解这题的思路。- #include <stdio.h>
- #include <math.h>
- int main()
- {
- long long i, j, k, l, num = 600851475143;
- _Bool flag = 1;
- for (i = 2, j = num/i; flag != 0; i++, j = num/i, flag = 1)
- {
- if (i * j == num)
- {
- k = sqrt((double)j);
- for (l = 2; l <= k; l++)
- {
- if (j % l == 0)
- {
- flag = 0;
- break;
- }
- }
- if (flag)
- {
- break;
- }
- }
- }
- printf("%lld\n", i);
- return 0;
- }
复制代码
本帖最后由 jackz007 于 2022-11-5 10:43 编辑
i 从 2 开始循环,如果 num 能被 i 整除,那就判断 num / i 是不是一个素数,如果是,那就结束,否则,i ++ 继续,直到找到这个素数为止。
- #include <stdio.h>
- #include <math.h>
- int main()
- {
- long long i, j, k, l, num = 600851475143;
- _Bool flag = 1;
- for (i = 2, j = num/i; flag != 0; i++, j = num/i, flag = 1) // 从 i = 2 开始循环枚举 num 所有可能的因子
- {
- if (i * j == num) // 如果 num 能够被 i 整除,j 的值是 num / i
- {
- k = sqrt((double)j);
- for (l = 2; l <= k; l++) // 在 2 ~ sqrt(j) 的范围内枚举 j 的因子
- {
- if (j % l == 0) // 如果 j 可以被 l 整除,那就说明 j 不是一个素数
- {
- flag = 0 ; // 修改标志变量的值
- break; // 退出内层循环
- }
- }
- if (flag) // 内层循环结束,如果 flag 的值依然是 1,说明 j 是一个素数
- {
- break; // 那就不用继续找了,直接结束外层循环
- }
- }
- }
- printf("%lld\n", i); // 【错误】:这里应该打印输出的是 j
- return 0;
- }
复制代码
这是我写的代码,谨供楼主参考
- #include <stdio.h>
- int main(void)
- {
- long long i , m = 600851475143 ;
- for(i = 2 ; i <= m / i ;) {
- if(! (m % i)) m /= i ;
- else i ++ ;
- }
- printf("%I64d\n" , m) ;
- }
复制代码
编译运行实况:
- D:\[00.Exerciese.2022]\C>g++ -o x x.c
- D:\[00.Exerciese.2022]\C>x
- 6857
- D:\[00.Exerciese.2022]\C>
复制代码
|
-
|