C# while循环退出条件失效:质数求和程序陷入死循环
问题描述
我刚开始学习C#,正在编写一个计算用户输入的两个数字之间所有质数之和的程序。但无论怎么尝试,程序总是卡在3或5的状态。已经卡了两天毫无头绪,希望能得到错误原因的解释及修复方法。
代码如下:
using System; public class MainClass { public static void Main() { int startValue = int.Parse(Console.ReadLine()); int endValue = int.Parse(Console.ReadLine()); int number = startValue; int primeNumber = 1; int sum = 0; while (number < endValue) { if (((number % 2 == 0) && (number != 2)) || ((number % 3 == 0) && (number != 3)) && (number > 1)) //looking for a prime number { } else { primeNumber = number; sum = sum + primeNumber; } number = primeNumber + 1; Console.WriteLine($"{sum} and {primeNumber}"); } Console.WriteLine($"Sum of the prime numbers= {sum}"); } }
我经验不足,尝试过修改代码位置、将while循环换成for循环,但都没有解决问题。
错误原因分析
- 质数判断逻辑严重缺失:当前只检查了数字是否是2或3的倍数,完全没考虑其他质数的情况(比如5、7、11等),而且逻辑运算符优先级混乱——
||和&&混用未加括号,导致判断逻辑出错,很多非质数会被误判为质数。 - 循环更新逻辑错误:每次循环用
number = primeNumber + 1更新数值,一旦遇到非质数,primeNumber不会被更新(保持上一个质数的值),比如当number=4时,4不是质数,else分支不执行,primeNumber还是3,下一次number又变成4,直接陷入无限循环,这就是程序卡住的核心原因。
修复方法
1. 实现正确的质数判断逻辑
单独写一个IsPrime方法,按质数定义判断:
- 小于2的数不是质数
- 2是唯一的偶质数
- 从3开始,只检查奇数到该数的平方根(若n有大于sqrt(n)的因数,必然对应一个小于sqrt(n)的因数,减少计算量)
2. 修正循环更新逻辑
循环中让number每次自增1,遍历startValue到endValue之间的所有数,不再依赖primeNumber更新。
3. 处理边界情况
如果startValue小于2,直接从2开始计算,因为质数的定义是大于1的自然数。
修复后的完整代码
using System; public class MainClass { public static void Main() { int startValue = int.Parse(Console.ReadLine()); int endValue = int.Parse(Console.ReadLine()); int sum = 0; // 确保起始值不小于质数的最小范围 int currentNumber = Math.Max(startValue, 2); while (currentNumber < endValue) { if (IsPrime(currentNumber)) { sum += currentNumber; Console.WriteLine($"当前质数:{currentNumber},累计和:{sum}"); } currentNumber++; } Console.WriteLine($"质数之和 = {sum}"); } // 判断是否为质数的工具方法 private static bool IsPrime(int num) { if (num < 2) return false; if (num == 2) return true; // 偶数直接排除 if (num % 2 == 0) return false; // 检查从3到sqrt(num)的所有奇数 for (int i = 3; i <= Math.Sqrt(num); i += 2) { if (num % i == 0) return false; } return true; } }
内容的提问来源于stack exchange,提问作者Vlad Mikhalkin
相关产品推荐
相关产品推荐

