C++求数字各位之和程序for循环输出错误while循环正常原因求解
问题原因分析
- for循环终止条件逻辑错误
你编写的for(int i = 0; i < n; i++)存在根本性逻辑缺陷:循环判断条件中使用的n会在循环体内被n = n / 10不断修改减小,而计数变量i是持续递增的,二者数值交叉时循环会提前终止,导致最高位的数字未被计入总和。
举输入123的执行过程验证:
初始值:n=123,sum=0,i=0
第1次循环:i=0 < 123,取个位3 sum=3,n更新为12,i自增为1
第2次循环:i=1 < 12,取个位2 sum=5,n更新为1,i自增为2
第3次判断:i=2 < 1 不成立,循环直接终止,最高位的1未被累加,最终输出5,与你的错误结果完全吻合。
你提到的输入0235输出8的问题同理:int类型读取输入时会自动忽略前导0,实际读到的n是235,循环执行两次后i=2,n=2,判断2 < 2不成立终止,最高位的2未被累加,得到错误结果8。
- while循环正确的原因
while(n>0)的判断逻辑只校验当前是否还有未处理的数位,不需要依赖计数变量,只要n不为0就会继续执行循环处理剩余数位,自然可以累加所有位的数字得到正确结果。
修复方案
如果需要保留for循环写法,不需要额外引入计数变量i,直接把循环条件调整为和while逻辑一致即可,正确代码如下:
#include <iostream> using namespace std; int main() { int n, m, sum = 0; cin >> n; for(; n > 0; n = n / 10) { m = n % 10; sum += m; } cout << sum; return 0; }
如果需要保留输入的前导0参与求和,不能用int类型存储输入,需要改为字符串类型读取后逐位转换为数字累加,int类型会自动丢弃数值前的所有前导0。
内容的提问来源于stack exchange,提问作者Swaraj
相关产品推荐
相关产品推荐

