目标:编写一个 PHP 程序来查找给定自然数的所有不同因子(除数)。下面给出几个数字的约数:
Number: 10
除数: 1 2 5 10
Number: 15
除数: 1 3 5 15
Number: 100
除数: 1 2 4 5 10 20 25 50 100
方法1:使用迭代
基本方法之一是从1迭代到n 并在每次迭代中检查该数字是否整除 n。如果相除则打印它。
<?php
//打印数字的所有除数的函数
function printDivisors($n) {
echo "$n的所有除数: ";
for($i = 1; $i <= $n; $i++) {
if($n%$i == 0)
echo "$i ";
}
echo "\n";
}
printDivisors(10);
printDivisors(50);
printDivisors(100);
?>
上面的代码将给出以下输出:
10的所有除数: 1 2 5 10
50的所有除数: 1 2 5 10 25 50
100的所有除数: 1 2 4 5 10 20 25 50 100
方法2:优化代码
而不是检查给定数字从1到n的整除性,检查直到n的平方根。对于大于n的平方根的因子,必须在1到n的平方根的范围内存在已经检查过的更小的因子>.
<?php
//打印一个数字的所有除数的函数
function printDivisors($n) {
echo "$n的所有除数: ";
//从1循环到sqrt(n)
for($i = 1; $i <= sqrt($n); $i++) {
if($n%$i == 0) {
if($n/$i == $i)
echo "$i ";
else
echo $i." ".$n/$i." ";
}
}
echo "\n";
}
printDivisors(10);
printDivisors(50);
printDivisors(100);
?>
上面的代码将给出以下输出:
10的所有除数: 1 10 2 5
50的所有除数: 1 50 2 25 5 10
100的所有除数: 1 100 2 50 4 25 5 20 10
方法3:优化代码并排序结果
在上一个方法中,结果以不规则的方式产生(成对打印 - 小数字和大数字)。可以通过存储较大的数字来对结果进行排序并稍后打印它们。考虑下面的示例:
<?php
//打印一个数字的所有除数的函数
function printDivisors($n) {
echo "$n的所有除数: ";
//创建一个数组来存储更大的数字
$arr;
$j = 0;
//从1循环到sqrt(n)
for($i = 1; $i <= sqrt($n); $i++) {
if($n%$i == 0) {
if($n/$i == $i)
echo "$i ";
else {
echo "$i ";
//存储对的大数
$arr[$j++] = (int)($n/$i);
}
}
}
//打印存储的大量对
for ($i = count($arr) - 1; $i >= 0; $i--)
echo $arr[$i]." ";
echo "\n";
}
printDivisors(10);
printDivisors(50);
printDivisors(100);
?>
上面的代码将给出以下输出:
10的所有除数: 1 2 5 10
50的所有除数: 1 2 5 10 25 50
100的所有除数: 1 2 4 5 10 20 25 50 100
方法 4:另一个优化代码
生成得到排序后的结果,我们可以从 1 迭代到 n 的平方根,并打印除 n 的数字。之后我们可以迭代(以相反的顺序)并打印除n的所有数字的商。
<?php
//打印一个数字的所有除数的函数
function printDivisors($n) {
echo "$n的所有除数: ";
//从1循环到sqrt(n)
$i;
for($i = 1; $i <= sqrt($n); $i++) {
if($n%$i == 0)
echo "$i ";
//处理完全平方数
if($n/$i == $i) {
$i--;
break;
}
}
for(; $i >= 1; $i--) {
if($n%$i == 0)
echo $n/$i." ";
}
echo "\n";
}
printDivisors(10);
printDivisors(50);
printDivisors(100);
?>
上面的代码将给出以下输出:
10的所有除数: 1 2 5 10
50的所有除数: 1 2 5 10 25 50
100的所有除数: 1 2 4 5 10 20 25 50 100