编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,并输出计算结果总是100的所有可能性。

最近看到这个“算法”题,其实在解题过程中并没有发现过多算法。

解题思路: 在1,2...9 插入运算符(+ - 或者没有),1到9有8个空位,每个空位有三种可能性,也就是3^8种。

运用PHP的弱类型特性,以及强大的数组, 我们只需要将每个有运算符的数字放入数组中即可。

比如: ["1," "+23", "-45", "678", "-9"], 不同的运算符就组合成类似的数组,最后magic函数 array_sum。

$a = [[1]];
$l = 1;
$t = microtime(true);
while($l < 9) {
    $c = [];
    foreach($a as $k => $d) {
        $e = count($d);
        $f = [$d, $d, $d];
        $f[0][$e-1] = $f[0][$e-1] . ($l + 1);
        $f[1][] = '+'. ($l + 1);
        $f[2][] = '-' . ($l + 1);

        $c = array_merge($c, $f);
    }
    $a = $c;
    $l++;
}
foreach($a as $v) {
    if (array_sum($v) == 100) {
        echo implode('', $v) .' = 100' . PHP_EOL;
    }
}

$t2 = microtime(true);
echo ($t2 - $t) .PHP_EOL;

 

输出结果:

123+45-67+8-9 = 100
123+4-5+67-89 = 100
123-45-67+89 = 100
123-4-5-6-7+8-9 = 100
12+3+4+5-6-7+89 = 100
12+3-4+5+67+8+9 = 100
12-3-4+5-6+7+89 = 100
1+23-4+56+7+8+9 = 100
1+23-4+5+6+78-9 = 100
1+2+34-5+67-8+9 = 100
1+2+3-4+5+6+78+9 = 100
0.22899389267

 

posted on 2017-08-28 15:20  技术员  阅读(1155)  评论(0编辑  收藏  举报

导航