【问题标题】:divisors of divisors of a number一个数的除数的除数
【发布时间】: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' 是一个非常奇怪的术语。您是指“主要因素”吗?

标签: php algorithm numbers


【解决方案1】:

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

试试

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 

【讨论】:

  • 不,这不是我想要的。我提供了例子来澄清。还是谢谢
  • @user1320006 那么如果输入数字为 20,您需要的输出是什么?
  • 我已经提供了你想要的。
【解决方案2】:

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

y = x + 1 限制 -> n

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

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

祝你好运;D

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      相关资源
      最近更新 更多