思路:
1.先把1~n中的所有的质数找出来,以减少列表长度。将这所有质数相乘得到初始值S。列表list中剩下的全是非质数。
2.依次读出列表list的值作为当前值i,因为i是非质数,所以我们要找出组成这个非质数的最小质数j
3.使用三元式公式得到新的S的值:新的S = 初始值S能否整除当前值i ? 初始值S : 初始值S * 组成i的最小质数j
4.循环2.3步,最后得到最小倍数。
php代码示例:
$n = 20;
$prime = [];
$unPrime = [];
// 初始值
$s = 1;
// 分离出n以内的素数和非素数
for ($i = 2; $i < $n; $i++) {
$tmp = sqrt($i);
$isPrime = true;
for ($j = 2; $j <= $tmp; $j++) {
if ($i % $j == 0) {
$isPrime = false;
break;
}
}
if ($isPrime) {
$s *= $i;
$prime[] = $i;
} else {
$unPrime[] = $i;
}
}
echo "1~{$n}中的素数为:" . join(' ', $prime);
echo "<br/>";
foreach($unPrime as $v) {
if ($s % $v === 0) {
continue;
}
// 找到非素数中的最小素数
foreach($prime as $p) {
if ($v % $p === 0) {
$s *= $p;
break;
}
}
}
echo "能被1~{$n}中所有正整数都整除的最小整数是:{$s}";