C语言判断强数时for循环与while循环输出不同是什么原因?
问题根因
你对「for循环是while循环的简写」的认知是正确的,但你给出的两段代码逻辑本身并不等价,核心差异是循环变量i的初始化时机不一致。
两种循环的等价逻辑说明
标准的for循环结构:
for(初始化表达式; 循环条件; 迭代表达式) { 循环体 }
等价于以下while逻辑:
初始化表达式; while(循环条件) { 循环体; 迭代表达式; }
对应你代码中的for循环for(i = 1; i<=rem; i++),等价的while逻辑需要每一次进入内层循环前,都把i重置为1。
错误版本的问题点
你写的while版本代码,仅在整个程序最开始执行了一次i = 1的初始化,外层while(q != 0)每一轮处理新数位的时候,i都没有被重置:
- 例如处理第一个数位时,i会从1累加到
rem+1,到处理下一个数位时,i的初始值已经是上一轮的rem+1,如果新的数位比这个值小,内层while循环会直接不执行,阶乘计算完全错误,最终结果自然不符合预期。
修正方案
只需要在内层while循环执行前,加一行i的重置逻辑即可和for版本逻辑完全对齐:
while(q != 0){ rem = q%10; i = 1; // 新增:每次处理新数位前重置循环变量i while(i <= rem){ fac = fac*i; i++; } result = result + fac; fac = 1; q = q/10; }
内容的提问来源于stack exchange,提问作者Monkey Brain
相关产品推荐
相关产品推荐

