【发布时间】:2012-04-09 09:28:18
【问题描述】:
如果我们试图找到一个数 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 的除数的计算”。我希望这可以澄清所有事情。
【问题讨论】:
-
请放一些输出数组并解释你想从他们那里得到什么。
-
我完全不知道你真正想要什么。你能澄清一下吗?
-
@heyanshukla 我提供了示例。
-
@DanielFischer 我提供了示例。
-
'Divisors of divisors' 是一个非常奇怪的术语。您是指“主要因素”吗?