如果产品具有多个因子对,如何按产品分组因子并显示?

时间:2017-03-30 07:28:59

标签: php grouping elements multiplication factors

使用预定义的数字数组,我如何使用PHP生成一个多维数组,该数组按产品对所有因子对进行分组?

输入数组:

app.directive('format', ['$filter', '$compile', function($filter, $compile) {
    return {
      require: 'ngModel',
      scope: {
        val: '=val'
      },
      link: function(scope, elem, attrs, ctrl) {

        if (!ctrl) return;
        ctrl.$formatters.unshift(function(a) {

          if (attrs.symbol == '$')
            return $filter(attrs.format)(ctrl.$modelValue, '$')
          else
            return $filter(attrs.format)(ctrl.$modelValue)
        });

                scope.$watch(function() {
            return elem.val()
        }, function(newVal, oldVal) {
          var a = newVal;
          var plainNumber = a.split('.').filter(function(e) {
            return (e.length > 0);
          }).join('.');
          var i = 0;
          if (isNaN(parseFloat(plainNumber))) {
            i = (attrs.symbol == '$') ? 1 : 3;
          }
          var num = plainNumber.substring(i, plainNumber.length).replace(/,/g, '');
          if (attrs.symbol == '$')
            elem.val($filter('currency')(num, attrs.symbol));
          else
            elem.val($filter('currency')(num));
          var n = parseFloat(num);
          scope.val = Number(n);
          if (!scope.$$phase) {
            $compile(elem.contents())(scope)
          }
        });
      }
    };

    // controller 
  }])
  • 我想显示每个具有多个因子对的产品组的所有因子对。

  • 如果没有产品组具有多个因子对,则应显示$array = array(1,2,3,4,5,6,7,8);

鉴于上述输入,这是我的预期结果:

No pairs Found

*请注意,当输入数组的大小增加时,输出将显示每组超过两个因子对。

这是我的C ++代码:

1 6 and 2 3  // product group = 6
1 8 and 2 4  // product group = 8
2 6 and 3 4  // product group = 12
3 8 and 4 6  // product group = 24

4 个答案:

答案 0 :(得分:1)

最简单的解决方案可以很好地使用像您的示例一样的小数组,但会使用大量内存来获得更大的输入。基本上,首先使用嵌套循环计算所有产品。对于每个产品,请创建生成产品的输入列表。请注意,获得某个结果可能有两种以上的方式,因此您可能会获得类似1 12 and 2 6 and 3 4的输出来获取更大的列表。

对于大小为N的输入,您需要在内存中存储((N-1)* N)/ 2个元组,以便记住这一点。

$input = [1, 2, 3, 4, 5, 6, 7, 8];

$products = [];

foreach ($input as $index1 => $value1) {
    // Assuming you only want unique combinations, only combine this value with the other values coming after it
    for ($index2 = $index1 + 1; $index2 < count($input); $index2++) {
        $value2 = $input[$index2];
        $product = $value1 * $value2;

        // Make sure there is an entry in the $products array for adding this input to
        if (!isset($products[$product])) {
            $products[$product] = [];
        }

        // Add this input (formatted) to the list of possible inputs resulting in this product
        $products[$product][] = sprintf('%d %d', $value1, $value2);
    }
}

// Print all inputs resulting in the same products, if there are more than 1 way to produce the same output
foreach ($products as $inputs) {
    if (count($inputs) > 1) {
        echo implode(' and ', $inputs), PHP_EOL;
    }
}

将输出

1 6 and 2 3
1 8 and 2 4
2 6 and 3 4
3 8 and 4 6

答案 1 :(得分:1)

PHP code demo

<?php
ini_set("display_errors", 1);
$result=array();
$array = array(1,2,3,4,5,6,7,8);
$counter=0;
$noOfPairs=3;
while (count($result)!=$noOfPairs)
{
    shuffle($array);
    getPair($array);
}
print_r($result);
function getPair($array)
{
    global $result;
    $product=$array[0]*$array[1];
    if(isset($result[$product]))
    {
        return false;
    }
    $result[$product][]=array($array[0],$array[1]);
    unset($array[0]);
    unset($array[1]);
    foreach($array as $key1 => $value1)
    {
        foreach($array as $key2 => $value2)
        {
            if($value1*$value2==$product)
            {
                $result[$product][]=array($value1,$value2);
                break;
            }
        }
         if(count($result[$product])==2)
        {
            break;
        }
    }
    if(count($result[$product])==1)
    {
        unset($result[$product]);
    }
}

答案 2 :(得分:1)

这是你的C ++代码“翻译”到PHP(主要通过搜索和替换)。

90%的翻译是通过删除变量类型并使用$添加变量名来实现的。 array PHP类型是数组,列表和映射(也称为哈希,字典)的混合,可以用于$H及其包含的值(值对)。

function findPairs(array $arr, $n)
{
    $found = false;
    $H = array();
    for ($i=0; $i<$n; $i++)
    {
        for ($j=$i+1; $j<$n; $j++)
        {
            // If product of pair is not in hash table,
            // then store it
            $prod = $arr[$i]*$arr[$j];
            if (! array_key_exists($prod, $H))
                $H[$prod] = array($i,$j);

            // If product of pair is also available in
            // then print current and previous pair
            else
            {
                $pp = $H[$prod];
                echo $arr[$pp[0]], " ", $arr[$pp[1]]
                     , " and ", $arr[$i], " ", $arr[$j], "\n";
                $found = true;
            }
        }
    }
    // If no pair find then print not found
    if ($found == false)
        echo "No pairs Found\n";
}

$array = array(1,2,3,4,5,6,7,8);
findPairs($array, count($array));

这是它的输出:

1 6 and 2 3
1 8 and 2 4
2 6 and 3 4
3 8 and 4 6

答案 3 :(得分:0)

我没有加速测试我的方法,但我认为它更直接,更容易阅读。
基本上,它会生成完整的多维数组,然后过滤掉只有一对的子数组,如果剩下子阵列,则显示它们。简单。

我的方法在没有任何count()调用的情况下执行,并且不增加关键变量。它使用非常快的isset()调用来过滤结果数组,使用array_walk()来迭代和implode()符合条件的子数组。

作为奖励功能,我使用range()动态生成输入数组,输入数组是通过输入数组的最高值来确定的。当然,如果您想找到[3,4,5]的对,那么您必须修改此过程或简单地恢复原始样式 - 这取决于您的项目期望。

代码:(Demo

function findPairs($maxfactor){
    $array=range(1,$maxfactor); // spare yourself having to write out the array
    foreach($array as $v1){
        $array=array_slice($array,1); // shrink array as you go to avoid needless iterations
        foreach($array as $v2){
            $result[$v1*$v2][]="$v1 $v2";  // generate multi-dim output array using products as outer keys
        }
    }
    $result=array_filter($result,function($a){return isset($a[1]);});  // remove elements with < 2 pairs
    if(!$result){
        echo "No pairs found";
    }else{
        array_walk($result,function($a){echo implode(' and ',$a),"\n";});
    }
}
findPairs(8);

输出:

1 6 and 2 3
1 8 and 2 4
2 6 and 3 4
3 8 and 4 6