编写一个在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