【问题标题】:PHP array product combinationsPHP数组产品组合
【发布时间】:2013-02-08 12:16:23
【问题描述】:

我已经生成了一个数的质因数数组——这应该是最难的部分!但是,为了创建相同数量的除数列表,需要以各种可能的方式组合素因数。我正在努力用 php 做的事情。

例如我有一个数组:

2
2
2
3
3
41
53

...对于数字 156456;将它们全部相乘,你就可以得到这个数字。我需要做的是将所有二重奏相乘,例如2x2、2x3、2x53 等,然后将所有三元组加在一起,以此类推,直到我最终将 7 个 6 块相乘。

如您所见,这将给出一个非常大的数组,其中包含 4、6、8、9、12 等中的所有除数,并带有许多重复项。我似乎无法从上面的数组中得到我想要的这个除数数组。这是一个将数组中所有可能的元素组合相乘的情况,是否有一个php函数,我的搜索到目前为止没有结果?

【问题讨论】:

  • 使用array_unique 删除重复项
  • 官方没有这样的PHP函数。您将不得不编写自己的算法。或者您可以尝试寻找一个开源实现。
  • 谁能给我一个正确的方向,我的猜测是我找出数组中有多少个元素然后循环,所以对于上面我会有6个循环,我带来了二重奏in 然后三元组等,但仍然不确定如何实现
  • 我看不到你想要什么。你是什​​么意思二重奏,三胞胎,七块六?也许你可以澄清那段?

标签: php arrays multiplication


【解决方案1】:

阅读此页面后:http://mathcentral.uregina.ca/QQ/database/QQ.02.06/joe1.html,我尝试构建一些可能有效的东西,它可能不是最有效的解决方案,并且它也仅限于 32 位系统上的count($primes) <= 32。如果您需要更多,请随时使用Bitset

$primes = Array(2, 2, 2, 3, 3, 41, 53);
$num_primes = count($primes); // 7, if this is over 32, it won't work on 32bit systems
$divisors = Array();

// number of possible combinations
$limit = pow(2, $num_primes) - 1; // 127

// count a number up and use the binary 
// representation to say which index is
// part of the current divisor
for($number = 0; $number <= $limit; $number++) {
    $divisor = 1;
    // only multiply activated bits in $number to the divisor
    for($i = 0; $i < $num_primes; $i++) {
        $divisor *= ($number >> $i) & 1 ? $primes[$i] : 1;
    }
    $divisors[] = $divisor;
}

echo implode(", ", array_unique($divisors));

这导致以下除数:

1, 2, 4, 8, 3, 6, 12, 24, 9, 18, 36, 72, 41, 82, 164, 328, 123, 246, 492,
984, 369, 738, 1476, 2952, 53, 106, 212, 424, 159, 318, 636, 1272, 477,
954, 1908, 3816, 2173, 4346, 8692, 17384, 6519, 13038, 26076, 52152, 19557,
39114, 78228, 156456

要找到所有除数,您需要在每个可能的组合中将每个质因数相乘。为此,我计算了可能组合的数量 ($limit)。如果您现在将一个数字计数到此限制,则二进制表示形式如下所示:

7 bit
<----->
0000000    0
0000001    1
0000010    2
0000011    3
0000100    4
0000101    5
0000110    6
0000111    7
0001000    8
0001001    9
...
1111110  126
1111111  127

$number的当前二进制表示表示$primes的哪些索引用于计算当前$divisor。为了更好地展示这一点,让我们说$number = 5,它是二进制的0000101$divisor 的计算结果是 2 * 1 * 2 * 1 * 1 * 1 * 1 = 4。仅设置了第一位和第三位,因此仅使用数组中的第一个和第三个元素进行计算。

我希望这能让它更清楚一点。

【讨论】:

  • 我能说什么,完美。我会看看第一个数字是什么,有超过 32 个质因数,但除此之外它已经很好地回答了这个问题。谢谢。
  • ...实际上它必须是 2^33,即 8,589,934,592,这是我需要的最高值,问题解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
相关资源
最近更新 更多