如果我们试图找到一个数 N 的所有除数 D(array),那么 D 中每个 d 的除数也会在 D 的计算中自动计算出来。有没有办法可以找到一个数 N 的所有除数通过找到其所有除数的除数,然后最后将它们相加。显然,有一种方法,但我想要一种没有重复计算的方法。我认为这可以通过递归来完成,但我不知道如何进行。我正在提供计算数字 N 的所有除数的实现。我想以某种方式扩展它,在计算 N 的除数时,我还计算所有除数的除数(并保存它们)。最后,我可以把它们加起来,得到我想要的。但在整个过程中,好处是我也得到了所有除数的除数,而不需要任何额外的努力(即,
function divisors_of_a_number($n)//returns all the divisors of a number in an unsorted array
{
$i=1;
$s=bcsqrt($n);
while($i<=$s)
{
if(!(bcmod($n,$i)))
{
$a[]=$i;
if($i!=$s)
$a[]=bcdiv($n,$i);
}
++$i;
}
return $a;
}
这是一个澄清这一点的示例 - 假设 N 是 6。所以 N 的除数是 - {1,2,3,6}。现在,'3' 是 N 的除数。这意味着除以 '3' 的数(即它的除数)也将除 N。因此,我们可以说 '3' 的除数将除 N。同样,对于N 的每个除数 d,我们可以说 d 的除数也是 N 的除数。因此,当我们计算 N 的除数时,我们计算其每个除数 d 的所有除数。我想要一种方法,在计算 N=6 的除数时,我也得到 {1}、{2}、{3} 的除数(并保存它们)而无需额外计算(因为它们都已经被计算为 6) .
作为一个活生生的例子,如果 N=20,我希望我的函数在某种意义上工作,它返回一个数组数组。现在外部数组包含键作为 20 的除数,即键将是 {20,10,5,4,2,1}。现在,与这些键关联的是数组。这些数组中的每一个都是它们各自键的除数。现在,如果我取所有内部数组的元素的交集,我将得到 20 的除数。这意味着,即使我只计算 20 的除数,也会计算所有元素。但是,我想得到所需的输出无需任何额外计算。额外的计算意味着我显然可以计算 20 的除数的除数并返回数组数组。但是,我不想这样做,因为我知道“所有 20 的除数的除数都是自己计算的,而 20 的除数的计算”。