C#素数打印程序输入≥3时中途冻结无输出问题求助
打印前N个素数程序输入≥3时冻结的问题修复
问题现象
输入N=2时程序正常输出2、3;输入N=3时打印3后程序冻结,无输出也不报错;仅输入N<3时运行正常。
问题根源
- 未重置素数标记:
isPrimeFlag变量初始化后,每次检查新数字前没有重置状态。当处理数字4时,因4能被2整除,isPrimeFlag被设为0;后续处理数字5时,该标记仍为0,导致5被误判为非素数,count始终停在2,while (count <= n)条件永久成立,程序进入死循环。 - 素数检查效率低下:原代码循环检查从2到
number-1的所有数,无提前终止逻辑,浪费计算资源。
修复后的代码
int n; Console.WriteLine("input: "); n = Convert.ToInt32(Console.ReadLine()); int count = 1; int number = 2; while (count <= n) { bool isPrime = true; // 每次检查新数字时重置素数标记 // 优化:仅检查到number的平方根,且找到因子后立即退出循环 for (int i = 2; i <= Math.Sqrt(number); i++) { if (number % i == 0) { isPrime = false; break; } } if (isPrime) { Console.WriteLine("number: " + number); Console.WriteLine("count: " + count); count++; } number++; } Console.WriteLine("n: " + n); Console.WriteLine("count: " + count);
关键修复点说明
- 重置素数标记:将素数标记改为
bool类型(语义更清晰),每次检查新数字时初始化为true,确保每个数字的素数判断独立。 - 优化素数检查逻辑:
- 循环条件改为
i <= Math.Sqrt(number),减少循环次数——若number存在大于其平方根的因子,必然对应一个小于平方根的因子。 - 找到能整除的因子后立即
break退出循环,避免无效计算。
- 循环条件改为
内容的提问来源于stack exchange,提问作者megamega
相关产品推荐
相关产品推荐

