|
发表于 2023-6-30 22:33:09
|
显示全部楼层
这个代码是用来计算10000以内素数个数的,但存在一点小错误。你需要将判断 flag 是否为 true 的部分放在内部循环结束之后,而不是放在外部循环中。这是因为 flag 只有在检查完所有小于 i/2 的数之后才能确认 i 是否为素数。这是修正后的代码:
- #include <stdio.h>
- int main()
- {
- int count = 2; // 已知2和3是素数
- int i, j;
- _Bool flag;
- for (i = 5; i < 10000; i++)
- {
- flag = 1;
- for (j = 2; j <= i / 2; j++)
- {
- if (i % j == 0)
- {
- flag = 0;
- break;
- }
- }
- if (flag)
- {
- count++;
- }
- }
- printf("10000以内共有%d个素数!\n", count);
- return 0;
- }
复制代码
另外,这个代码中的素数判断算法并不是最高效的。我们知道,一个合数一定可以表示为两个自然数的乘积,如果这两个数相等,那么它们就是这个合数的平方根;如果它们不相等,那么其中一个数小于平方根,另一个大于平方根。所以,只要小于或等于这个数的平方根的数(从2开始)不能整除这个数,那么这个数就是质数。
以下是改进后的代码:
- #include <stdio.h>
- #include <math.h>
- int main()
- {
- int count = 2; // 已知2和3是素数
- int i, j;
- _Bool flag;
- for (i = 5; i < 10000; i++)
- {
- flag = 1;
- for (j = 2; j <= sqrt(i); j++)
- {
- if (i % j == 0)
- {
- flag = 0;
- break;
- }
- }
- if (flag)
- {
- count++;
- }
- }
- printf("10000以内共有%d个素数!\n", count);
- return 0;
- }
复制代码
这个代码比原来的代码运行得更快。 |
|