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

C#质数检查器异常:仅输入数字4时无法正常工作

问题分析与解决方案

嘿,作为C#新手能写出跑起来的质数检查器已经超棒了!咱们来拆解下输入4时出问题的原因,以及怎么修复它~

核心问题点

  • 错误使用浮点数类型:你用了float来存储整数(质数、除数都是整数),浮点数的精度误差会导致模运算(%)的结果不符合预期。比如理论上4/2=2.0,2.0%1应该是0,但浮点数的存储偏差或者循环逻辑的滞后,会让程序没及时捕捉到这个关键判断。
  • 循环逻辑顺序混乱:你的代码先打印checker再重新计算,而且divisor递减的时机不对,导致第一次循环没检查到最关键的除数(比如4的除数2)。
  • 未完善终止判断:你的while语句没写完,但大概率是想判断checker%1 != 0,但这种逻辑会在遇到第一个能整除的数时就该停止循环并判定结果,而不是继续执行无用的步骤。

修复后的代码

咱们把变量换成整数类型,调整循环逻辑,让它更准确且高效:

Console.WriteLine("请输入一个整数:");
if (int.TryParse(Console.ReadLine(), out int number))
{
    // 特殊情况提前处理:小于2的数不是质数
    if (number < 2)
    {
        Console.WriteLine($"{number} 不是质数");
        return;
    }

    bool isPrime = true;
    // 优化循环范围:只检查到输入数的平方根即可
    int maxDivisor = (int)Math.Sqrt(number);
    
    for (int divisor = 2; divisor <= maxDivisor; divisor++)
    {
        if (number % divisor == 0)
        {
            isPrime = false;
            break; // 找到除数就直接退出循环,不用做无用功
        }
    }

    Console.WriteLine(isPrime ? $"{number} 是质数" : $"{number} 不是质数");
}
else
{
    Console.WriteLine("请输入有效的整数!");
}

关键改进点

  • 用int处理整数运算:完全避免浮点数的精度问题,模运算%能准确判断是否整除。
  • 特殊情况前置:直接处理小于2的数,符合质数的数学定义。
  • 缩小循环范围:只检查到输入数的平方根,因为如果n有大于平方根的因数,对应的另一个因数肯定小于平方根,能大幅提升效率。
  • 直观的状态标记:用isPrime变量记录结果,找到除数就立刻跳出循环,逻辑清晰易懂。

为什么你的原始代码处理4会出问题?

在你的代码里,输入4时:

  1. 初始divisor = 3,checker = 4/3 ≈1.333,打印后重新计算(这里重复计算了),然后divisor变成2。
  2. 接下来计算checker=4/2=2.0,这时候checker%1=0,如果你的while条件是checker%1 !=0,循环会停止,但你没有在这个时候判断“能整除,所以不是质数”,导致程序没输出正确结果。

换成整数运算后,4%2=0,立刻就能判定不是质数,逻辑清晰又准确~

内容的提问来源于stack exchange,提问作者killakrab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:33:30