C语言如何遍历整数各位数字?模10运算原理及代码示例
逐位遍历整数的核心原理
模10运算为什么能拿到最后一位数字
我们日常使用的十进制整数,本质是按10的幂次组合的数值结构:比如123 = 1*100 + 2*10 + 3*1。按照数学上带余除法的规则,任意整数模10得到的结果,是该数除以10后的非负余数。而由于所有高位部分都是10的整数倍,除以10不会产生余数,只有最右侧的个位数会贡献这个余数,因此模10的运算结果必然等于整数的最后一位数字。
实际运算验证:
456 % 10 = 6,和最后一位完全一致7890 %10 =0,和最后一位为0的实际情况匹配
如何配合整数除法实现完整遍历
拿到最后一位数字后,我们需要把已经处理过的位从原数上去掉,才能继续处理前一位。这里用到C语言的整数除法规则:正整数做除法时会直接截断小数部分(向0取整),比如123 /10 =12,相当于把最后一位3删掉,剩下的12就是原数去掉最后一位后的高位部分。
完整的遍历逻辑就是循环执行两个操作,直到原数变为0:
- 用模10取出当前的最后一位数字
- 用整数除以10删掉已经处理过的最后一位
你现有代码的问题定位
你的代码完全没有输出,核心是循环逻辑存在两处关键错误,直接导致程序卡死:
- x的更新逻辑写错了:你在循环内写的是
x = x %10,这一步会直接把整个x替换成最后一位的个位数,根本不是删掉最后一位的操作。比如x=123的时候,第一次循环跑完x就变成了3,后面不管循环多少次,3模10的结果永远是3,会一直满足x>0的循环条件,直接陷入无限循环,程序永远跑不到后面的输出语句,自然啥输出都没有。 - 累加的逻辑也不对:你是把整个x的值直接往计数器上加,根本没有单独把每一位数字拆出来累加,就算循环能正常跑完,算出来的结果也完全不对。
修正后的可运行代码
下面的代码严格使用基础运算实现逐位求和,没有任何复杂高阶操作:
#include <stdio.h> int main(void) { printf("Enter a value.\n"); int x = 0; scanf("%d", &x); // 输入合法性校验:仅处理非负整数 while (x < 0) { printf("Enter another integer please.\n"); scanf("%d", &x); } int counter = 0; // 逐位遍历求和 while (x > 0) { // 取出当前最后一位数字 int current_digit = x % 10; counter = counter + current_digit; // 删掉已经处理完成的最后一位 x = x / 10; } printf("The total sum of the integer's digits are %d\n", counter); return 0; }
运行流程示例
以输入1234为例,循环执行过程为:
- 第1轮:x=1234,取最后一位4,counter累计为4,x更新为123
- 第2轮:x=123,取最后一位3,counter累计为7,x更新为12
- 第3轮:x=12,取最后一位2,counter累计为9,x更新为1
- 第4轮:x=1,取最后一位1,counter累计为10,x更新为0,退出循环
最终输出各位和为10,和手动计算的结果一致。如果输入为0,循环不会进入,counter保持初始值0,也符合0的各位和的实际情况。
内容的提问来源于stack exchange,提问作者Shah Jacob
相关产品推荐
相关产品推荐

