统计指定数量质数时C语言程序陷入无限循环问题求助
质数统计程序无限循环的问题修复
你的程序陷入无限循环的核心原因是flag变量未在每次检查新数字时重置:
- 第一次遇到非质数(比如4)时,flag被设为1,之后这个值再也没被改回0
- 后续所有数字都会被判定为非质数,ctr无法增长到输入的n,外层循环的
ctr != n条件永远成立,导致无限循环
修复后的代码
#include <stdio.h> int main (){ int n; printf("Enter size N: "); scanf("%d", &n); int i, j, ctr = 0, flag; for (i = 2; ctr != n; i++){ flag = 0; // 每次检查新数字前重置flag,确保判断独立 // 优化:内层循环只需检查到sqrt(i),减少不必要的计算 for (j = 2; j * j <= i; j++){ if (i % j == 0){ flag = 1; break; } } if (flag != 1){ ctr++; printf("%d ", i); // 可选:打印找到的质数,方便验证结果 } } return 0; }
关键修复点
- 重置flag变量:将
flag = 0移到外层循环内部,每次开始检查新数字i时重置标记,保证每个数字的质数判断不受之前结果影响 - 优化内层循环范围:把
j < i改为j * j <= i,因为若i存在大于其平方根的因数,对应的另一个因数必然小于平方根,这样能大幅减少循环次数,提升程序效率
内容的提问来源于stack exchange,提问作者Daniel Gilbert Dela Peña
相关产品推荐
相关产品推荐

