阶乘循环计算异常:为何需将while条件设为n≥2而非n≥1?
问题分析&解决
哎,这个问题我太熟了!咱们一点点拆解哈~
首先得揪出你代码里的核心问题——do-while循环的执行顺序!它是先跑一遍循环体里的代码,再去判断要不要继续循环,这和普通while循环先判断再执行完全不一样。
为什么原代码会算出0?
咱们拿输入n=10来走一遍流程:
- 初始factorial是1,先输出
10 * - 进入do循环:n减到9,factorial乘9,输出
* 9 - 重复这个过程,直到n变成1的时候——重点来了!
- 这时候依然会先执行do循环体:n减到0,factorial直接乘以0(这下结果彻底变0了),然后输出
* 0 - 再判断
n !=1,0不等于1,循环还会继续跑(n变成-1、-2...一直乘0,结果永远是0)
说白了,你的循环条件n !=1没拦住n=1的情况,反而让它触发了一次循环,把n搞成0坑了整个计算。
为什么改成n≥2就正常?
当你把循环条件改成while(n >=2)时:
- 还是到n=2的时候,进入do循环:n减到1,factorial乘1,输出
*1 - 然后判断
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




