You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

阶乘循环计算异常:为何需将while条件设为n≥2而非n≥1?

问题分析&解决

哎,这个问题我太熟了!咱们一点点拆解哈~

首先得揪出你代码里的核心问题——do-while循环的执行顺序!它是先跑一遍循环体里的代码,再去判断要不要继续循环,这和普通while循环先判断再执行完全不一样。

为什么原代码会算出0?

咱们拿输入n=10来走一遍流程:

  1. 初始factorial是1,先输出10 *
  2. 进入do循环:n减到9,factorial乘9,输出 * 9
  3. 重复这个过程,直到n变成1的时候——重点来了!
  4. 这时候依然会先执行do循环体:n减到0,factorial直接乘以0(这下结果彻底变0了),然后输出 * 0
  5. 再判断n !=1,0不等于1,循环还会继续跑(n变成-1、-2...一直乘0,结果永远是0)

说白了,你的循环条件n !=1没拦住n=1的情况,反而让它触发了一次循环,把n搞成0坑了整个计算。

为什么改成n≥2就正常?

当你把循环条件改成while(n >=2)时:

  1. 还是到n=2的时候,进入do循环:n减到1,factorial乘1,输出 *1
  2. 然后判断n >=2?1肯定不满足,循环直接停止,完美避开了把n搞成0的操作,结果自然正确。

关于你的疑问:为啥循环条件不用n-1相关值?

其实不是不能用,只是要匹配do-while的执行逻辑。比如你要是想写和n-1相关的条件,得提前预判循环体对n的修改。不过更直观的写法是换用普通while循环,或者调整do-while的终止条件,比如改成while(n >1),这样逻辑更清晰,不容易踩边界坑。

修正后的代码示例

给你改了个更靠谱的版本,顺便把输出里多余的*也修了:

class Program { 
    static void Main(string[] args) { 
        int n = int.Parse(Console.ReadLine()); 
        decimal factorial = 1; 
        // 先输出第一个数,避免开头或结尾多星号
        Console.Write(n);
        
        do { 
            factorial *= n;
            n--;
            // 只有还剩要乘的数时才输出星号
            if(n >= 1) {
                Console.Write(" * " + n); 
            }
        } while (n > 1); // 当n大于1时继续循环,n=1就停
        
        Console.WriteLine(" = " + factorial); 
    } 
}

或者用普通while循环,逻辑更直白:

class Program { 
    static void Main(string[] args) { 
        int n = int.Parse(Console.ReadLine()); 
        decimal factorial = 1; 
        Console.Write(n);
        
        while(n > 1) {
            n--;
            factorial *= n;
            Console.Write(" * " + n);
        }
        
        Console.WriteLine(" = " + factorial);
    } 
}

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

火山引擎 最新活动