找出正整数k的所有可能倍数(n的大小)

时间:2018-07-22 04:28:57

标签: algorithm combinations

输入1:

64

输出:(大小为3)

1 x 1 x 64  =64
1 x 2 x 32  =64
1 x 4 x 16  =64
1 x 8 x 8   =64
2 x 2 x 16  =64
2 x 4 x 8   =64
4 x 4 x 4   =64

输入2:

6

输出:(大小为2)

1 x 6  =6
2 x 3  =6

我尝试使用完全二叉树,但是没有得到所有可能的组合

这是:

                             64

                    32                  2

              16          2         2       1

           8     2     1    2     1   2   1    1

如果按级别跟踪元素只有某些组合可用

64 x 1 X 1
32 X 2 X 1
16 x 2 x 2
8  x 2 x 2 x 2( limit > 3 )

问题是我需要所有可能的组合

1 个答案:

答案 0 :(得分:0)

您可以使用递归方法。考虑以下PHP代码(我想您可以将其转换为所需的每种语言):

    function comb($num, $cnt, $prefix, $minDiv) {
        if ($cnt == 0)
        {
                if ($num == 1)
                        return rtrim($prefix,",");
                else return false;
        }
        $arrs = array();
        for ($i=$minDiv; $i <= $num; $i++) {
                if ($num % $i == 0) { // if num modulo i equal 0
                        $ans = comb($num/$i, $cnt-1, $prefix . $i . ",", $i );
                        if ($ans) // if valid combination add it
                                $arrs[] = $ans;
                }
        }
        return $arrs;
}


$ans = comb(64,3, "",1);
echo "ANSWER:\n";
echo print_r($ans);

此代码将为comb(6,2,“”,1)产生以下答案:

1,6
2,3