php 8.0 中求 gcd 和 lcm 最简洁可靠的方式是手动实现欧几里得迭代算法求 gcd,再用 lcm(a,b)=|a×b|÷gcd(a,b) 及 intdiv() 计算 lcm,支持负数、0 边界及类型安全。

PHP 8.0 中求最大公约数(GCD)和最小公倍数(LCM)最简洁可靠的方式是使用欧几里得算法(辗转相除法),并基于 GCD 推导 LCM。PHP 8.0 没有内置的 gcd() 或 lcm() 函数(这些在 PHP 8.1+ 才引入),因此需手动实现。
✅ 手写 GCD 函数(欧几里得递归/迭代)
推荐使用迭代写法,避免大数导致的栈溢出,且性能更稳定:
function gcd(int $a, int $b): int {
$a = abs($a);
$b = abs($b);
while ($b !== 0) {
$temp = $b;
$b = $a % $b;
$a = $temp;
}
return $a;
}- 自动取绝对值,兼容负数输入
- 用
!== 0严格比较,符合 PHP 8.0 类型安全要求 - 例如:
gcd(48, 18)返回 6
✅ 由 GCD 推导 LCM(适用于两个正整数)
公式:LCM(a, b) = |a × b| ÷ GCD(a, b)。注意整除需确保结果为整数,建议先做乘法再除(PHP 8.0 中整数除法用 intdiv() 更安全):
function lcm(int $a, int $b): int {
if ($a === 0 || $b === 0) return 0; // 数学上 LCM(0,x) 无定义,按惯例返回 0
return abs(intdiv($a * $b, gcd($a, $b)));
}-
intdiv()避免浮点误差,保证整数结果 - 例如:
lcm(48, 18)→abs(864 / 6) = 144 - 该函数仅适用于两个数;多个数可链式调用,如
lcm(lcm(12, 18), 24)
✅ 完整示例:计算两组数的 GCD 和 LCM
// 示例调用
var_dump(gcd(56, 42)); // int(14)
var_dump(lcm(56, 42)); // int(168)
<p>// 多个数的 LCM(扩展)
function lcm_of_array(array $numbers): int {
if (empty($numbers)) return 1;
$result = array_shift($numbers);
foreach ($numbers as $n) {
$result = lcm($result, $n);
}
return $result;
}
var_dump(lcm_of_array([12, 18, 24])); // int(72)</p>- 所有参数声明为
int,利用 PHP 8.0 的标量类型声明提升健壮性 - 错误输入(如非整数)会在运行时触发
TypeError,便于早期捕获 - 无需额外扩展或 Composer 包,纯原生代码
⚠️ 注意事项与边界情况
- 输入为 0 时:GCD(0, n) = |n|,LCM(0, n) 通常视为 0(按实际业务约定处理)
- 大整数(超
PHP_INT_MAX)可能溢出乘法,如需支持大数,请改用bcmul()/bcmod()(需启用 BCMath 扩展) - PHP 8.1+ 已内置
gmp_gcd()、gmp_lcm()或intdiv()+gmp扩展,但 PHP 8.0 不支持
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











