-1

如果我们试图找到一个数 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 的除数的计算”。

4

3 回答 3

3

我不确定你想要什么,但我认为这个简单的脚本可以帮助你..让我知道它是否足够

尝试

function arrayOfDivisors($x) {
    $divisors = array ();
    for($i = 1; $i < $x; $i ++) {
        if ($x % $i == 0) {
            $divisors [] = $i;
        }
    }
    return $divisors;
}

$divisors = arrayOfDivisors ( 20 );
var_dump ( $divisors ); // List Divisors
var_dump ( array_sum ( $divisors ) )  // Total

输出

array
  0 => int 1
  1 => int 2
  2 => int 4
  3 => int 5
  4 => int 10


int 22   // Total 
于 2012-04-09T10:01:03.233 回答
1

这是列出一个数字的除数的算法:

y = x + 1 限制 -> n

z = (ny)%((n+y)%n)

如果 z = 0,y 是 n 的除数。

祝你好运;D

于 2013-03-25T02:58:17.203 回答
0

您想要的输出的一种简单方法是首先计算原始数字的素数分解,然后使用它来枚举所有除数(及其所有除数)。

看到这不能比任何其他方法更有效的一种方法是注意从您想要的输出中很容易得出这个(例如,您知道主要因素,因为它们恰好有两个因素,然后可以检查是否有更高的权力是除数)。

于 2013-03-25T03:28:57.373 回答