You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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循环,但都没有解决问题。

错误原因分析
  1. 质数判断逻辑严重缺失:当前只检查了数字是否是2或3的倍数,完全没考虑其他质数的情况(比如5、7、11等),而且逻辑运算符优先级混乱——||和&&混用未加括号,导致判断逻辑出错,很多非质数会被误判为质数。
  2. 循环更新逻辑错误:每次循环用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:42:48