求素数(质素)循环嵌套

求素数(质素)循环嵌套

题目:

求100~200间的全部素数(即质数),要求每行输出10个素数。下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。注意:请将修改正确后的完整源程序拷贝粘贴到答题区内。对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。当且仅当错误全部改正,且程序运行结果调试正确,才得满分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
main() 
{
int m,k,i,n;
for(m=101;m<=200;m+=2)
{
if(n%10==0)
printf("\n");
k=sqrt(m);
for(i= 1;i<=k;i++)
if(m%i==0)
continue;
if(i==m%10)
{
printf("%d ",m);
n++;
}
}
}

代码实现:

说实话我根本看不懂,于是我重新写了一份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <math.h>
int main()
{
int m, k, i, n = 0;
for (m = 101;m <= 200;m = m + 2)
{
if (n % 10 == 0 && n != 0)
printf("\n");
k = sqrt(m);
for (i = 3;i <= k;i++) {
if (m % i == 0) {
break;
}
if (i == k && m % i != 0) {
printf("%d ", m);
n++;
break;
}
if (m % i != 0) {
continue;
}
}

}
}

写的一坨,寥寥草草地交上去了,我后面重新修改了一下,使可读性高了些:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <math.h>
int main()
{
int m, k, i, n = 0;
for (m = 101;m <= 200;m = m + 2)
{
int is_prime_number = 1; //定义质数的判断标准
if (n % 10 == 0)
printf("\n");
k = sqrt(m); //k用来缩小范围
for (i = 3;i <= k;i++) {
if (m % i == 0) { //不是质数,打破循环
is_prime_number = 0;
break;
}
}
if (is_prime_number) { //判断是否是质数
printf("%d ", m);
n++;
}

}
}

找AI改了改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <math.h>
int main()
{
int m, k, i, n = 0;
for (m = 101;m <= 200;m += 2)
{
int is_prime = 1;
if (n % 10 == 0)
printf("\n");
k = sqrt(m);
for (i = 3;i <= k;i+=2) {
if (m % i == 0) {
is_prime = 0;
break;
}
}
if (is_prime) {
printf("%d ", m);
n++;
}
}
}
  1. i的步幅可以调整为2,与m的步伐相同

    因为m为奇数,奇数 ÷ 偶数 不可能为一个整数。

  2. is_prime_number改成is_prime

    更简洁好看~

我感觉已经很好了,但是我还是想把题目的改错案例搞清楚

于是乎我扔给了AI,结果发现题目给的案例依托答辩,根本无法修改,还是得自己写、

但因为不知道什么原因,我第一次写的速度奇慢无比,主要在纠结什么时候打破循环和什么时候打印。

因此以记之!


求素数(质素)循环嵌套
http://example.com/2025/11/22/求素数(质素)循环嵌套/
作者
王柏森
发布于
2025年11月22日
许可协议