能否将for循环实现的1到n素数打印程序改为do-while循环?
用do-while循环实现打印n以内素数的可行性与修正方案
当然可行!用do-while循环完全可以实现打印n以内素数的功能,你的思路方向是对的,但代码里有几个逻辑问题导致没达到预期效果。咱们一步步来梳理:
你的代码存在的问题
- 内层循环的
j初始化位置错误:你把j=2放在了内层do-while循环的内部,这会导致每次内层循环执行时,j都会被重置为2,永远满足j <= i/2的条件,陷入无限循环。 - 素数判断逻辑错误:你在内层循环里只要一次
i%j != 0就直接判定是素数并打印,这会导致同一个数被多次打印(比如i=3时,j=2时满足条件就打印一次,j递增后又会进入循环重新判断),而且只要有一个j能整除i,就会把isPrime设为0,但后续的j循环又可能把它改回1,逻辑混乱。 - 未初始化
isPrime变量:局部变量如果不初始化,会包含随机的垃圾值,可能影响最终的判断结果。 main函数不符合标准:标准C中main函数应该声明为int main(),并返回一个整数值。
修正后的do-while版本代码
#include <stdio.h> int main() { int i, j, n, isPrime; printf("Enter n\n"); scanf("%d", &n); i = 2; // 外层循环遍历2到n的所有数 do { isPrime = 1; // 先假设当前数是素数 j = 2; // 内层循环判断是否为素数 do { if (i % j == 0) { isPrime = 0; // 找到能整除的数,标记为非素数 break; // 一旦找到就跳出内层循环,不用继续判断 } j++; } while (j <= i / 2); // 循环到i的一半即可 if (isPrime == 1) { printf("%4d", i); // 是素数就打印 } i++; } while (i <= n); return 0; }
代码逻辑说明
- 外层
do-while循环负责遍历从2到n的每一个数,和原for循环的逻辑一致。 - 每次遍历一个数时,先把
isPrime设为1(假设是素数),然后用内层do-while循环检查是否有能整除它的数。 - 内层循环中,只要找到一个能整除的j,就把
isPrime设为0并跳出循环,避免不必要的计算。 - 内层循环结束后,根据
isPrime的值判断是否打印当前数。
这样改写后的代码就和原for循环版本的功能完全一致了,证明用do-while实现是完全可行的。
内容的提问来源于stack exchange,提问作者Abhijit Singh
相关产品推荐
相关产品推荐

