在php中查找数组中的所有因子对

时间:2016-07-26 23:54:00

标签: php optimization

考虑一个数组(2,3,4,5)

我需要制作像

这样的组合

(2,60),(6,20),(24,5),(10,12),(30,4) (8,15) =因子对120

一种解决方案是使用for loop。一个从0currentPos,另一个从currentPosN(其中N是因子数组的计数,在这种情况下为4)

for($i=$pos;$i>=0;$i--)
{
  $p1 = $p1 * $factorArr[$i];
}
for($j=$pos;$j<=$N;$j++)
{
  $p2 = $p2 * $factorArr[$j];
}

$ pos增加的地方

有谁知道在PHP中更好的方法吗?

2 个答案:

答案 0 :(得分:1)

以下代码将获得所有组合而不重复:

$factor = 5;
$arr = range(1, $factor); // (1,2,3,4,5)
$f = array_product($arr);
$pairs = array();
$unique = array();
for($i = 1; $i < $f/2; $i++){ // only need to check until half (the other half would repeat the values
    // if not divisable / already found
    if($f % $i != 0 || isset($unique[$i]) || isset($unique[$f/$i])){
        continue;
    }
    $pairs[] = array( $i, $f/$i );
    $unique[$i] = true;
}

结果($pairs):

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 120
        )

    [1] => Array
        (
            [0] => 2
            [1] => 60
        )

    [2] => Array
        (
            [0] => 3
            [1] => 40
        )

    [3] => Array
        (
            [0] => 4
            [1] => 30
        )

    [4] => Array
        (
            [0] => 5
            [1] => 24
        )

    [5] => Array
        (
            [0] => 6
            [1] => 20
        )

    [6] => Array
        (
            [0] => 8
            [1] => 15
        )

    [7] => Array
        (
            [0] => 10
            [1] => 12
        )

)

在行动here中查看。

如果您在问题中需要它,可以使用以下代码:

$p = array();
foreach($pairs as $pair){
    $p[] = sprintf('(%s,%s)', $pair[0], $pair[1]);
}

结果($p):

Array
(
    [0] => (1,120)
    [1] => (2,60)
    [2] => (3,40)
    [3] => (4,30)
    [4] => (5,24)
    [5] => (6,20)
    [6] => (8,15)
    [7] => (10,12)
)

旁注:您可以在第一个代码中执行此操作 - 无需为此创建另一个循环(在$pairs[] = array( $i, $f/$i );之后,您可以使用$p[] = sprintf('(%s,%s)', $i, $f/$i);

答案 1 :(得分:0)

你只需要一个循环。如果您已经拥有所有因素,那么您需要的只是阵列上的foreach循环。这是一个输出对的示例,但您可以将除法运算中的值分配给另一个变量或另一个数组等。如果您需要发现这些因素,它只是略有不同,但是是一个不同的问题。

$number = 120;
$factors = [1,2,3,4,5,8,10];

foreach($factors as $factor){
    echo "($factor," . $number/$factor . ")\n</br>";
}