← PHP面试常考程序题合集(含代码示例) 奇数偶数判断:PHP取模运算的两种写法 →

数字拆解求和:PHP循环取余法完整拆解

原创 2026-05-21 PHP 已有人查阅

有初学者问我:怎么把一串数字的每一位单独拎出来再加到一起?

比如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。

本节课程知识要点

  1. 取模运算 % 是提取数字某一位的核心工具

  2. 整数除法 intdiv() 配合取模可以逐位处理数字

  3. 循环终止条件是原数字变为0,不是靠字符串长度判断

  4. 注意PHP的除法默认返回浮点数,处理整数时要显式转换

适用场景

  • 数字根计算

  • 校验位计算(比如Luhn算法的一部分)

  • 数字拆解后做其他运算

我个人建议刚接触这块的开发者,先用 while + intdiv() 把逻辑跑通,再考虑优化。 for 循环配合字符串长度那个写法,在数字负数的场景下也会出问题,除非你提前处理了负数。

如果需要处理负数的各位之和,取模前先取绝对值 abs($num)

← PHP面试常考程序题合集(含代码示例) 奇数偶数判断:PHP取模运算的两种写法 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号