有初学者问我:怎么把一串数字的每一位单独拎出来再加到一起?
比如14597,就算1+4+5+9+7=26。
这个需求在开发里挺常见,比如校验、银行校验、或者某些算法题里都会用到。
核心思路
用取余运算。
任何一个整数除以10,余数就是它的个位数。然后把原数除以10(取整),原来的十位数就变成了新的个位数。重复这个动作,直到数字变成0。
这个过程不需要知道数字有几位,循环次数取决于数字长度。
代码示例
<?php
$num = 14597;
$sum = 0;
$rem = 0;
for ($i = 0; $i <= strlen($num); $i++) {
$rem = $num % 10; // 取出当前个位数
$sum = $sum + $rem; // 累加到总和
$num = $num / 10; // 去掉个位数,注意PHP会自动转为浮点数
}
echo "数字14597的各位总和是:" . $sum;
?>
输出:数字14597的各位总和是:26
个人经验:这段代码有个隐蔽问题
上面这个写法,在代码号学习编程的初学者很容易踩坑。
$num = $num / 10 这一步,PHP里整数除以10会变成浮点数,比如14597/10=1459.7。下一轮循环对这个浮点数取余,结果会出乎意料。
实际跑起来可能得到奇怪的结果。有时候刚好对,有时候不对,看数字和运行环境。
更稳妥的写法:用 intdiv($num, 10) 或者 floor($num / 10) 确保整数除法。
改进后的稳定版本
<?php
$num = 14597;
$sum = 0;
while ($num > 0) {
$rem = $num % 10; // 取个位
$sum += $rem; // 累加
$num = intdiv($num, 10); // 整数除法去掉个位
}
echo "数字14597的各位总和是:" . $sum;
?>
用 while 比用 for 更直观,因为不需要提前知道字符串长度。而且避免了对浮点数取余的坑。
知识点拆解
| 运算 | 说明 |
|---|---|
% 取模运算符 |
得到除法余数,用于提取个位 |
intdiv() 函数 |
整数除法,舍弃余数,用于去掉个位 |
| 累加器变量 | 每轮循环把取出的数字加进去 |
换几个例子跑一遍
示例1:更小的数字
数字:502
第一轮:502%10=2,sum=2,num=intdiv(502,10)=50
第二轮:50%10=0,sum=2+0=2,num=intdiv(50,10)=5
第三轮:5%10=5,sum=2+5=7,num=intdiv(5,10)=0
循环结束,结果7。
示例2:单位数字
数字:8
第一轮:8%10=8,sum=8,num=intdiv(8,10)=0
结束,结果8。
示例3:带零的
数字:10101
按同样逻辑,得到1+0+1+0+1=3。
本节课程知识要点
-
取模运算
%是提取数字某一位的核心工具 -
整数除法
intdiv()配合取模可以逐位处理数字 -
循环终止条件是原数字变为0,不是靠字符串长度判断
-
注意PHP的除法默认返回浮点数,处理整数时要显式转换
适用场景
-
数字根计算
-
校验位计算(比如Luhn算法的一部分)
-
数字拆解后做其他运算
我个人建议刚接触这块的开发者,先用 while + intdiv() 把逻辑跑通,再考虑优化。 for 循环配合字符串长度那个写法,在数字负数的场景下也会出问题,除非你提前处理了负数。
如果需要处理负数的各位之和,取模前先取绝对值 abs($num)。