除数的除数除数

时间:2012-04-09 09:28:18

标签: php algorithm numbers

如果我们试图找到一个数字N的所有除数D(数组),那么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的除数时计算出来的”。我希望这能澄清所有的事情。

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

以下是列出数字除数的算法:

y = x + 1 lim - &gt; Ñ

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

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

祝你好运; D

答案 2 :(得分:0)

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

有一种方法可以看出,这比任何其他方法都要多得多,需要注意的是,从你想要的输出中可以很容易地推导出它(例如,你知道主要因素,因为它们只有两个因素,并且然后可以检查是否有更高的权力是除数。)