編寫一個在1,2,…,9(順序不能變)數字之間插入+或-或什麼都不插入,並輸出計算結果老是100的全部可能性。

最近看到這個「算法」題,其實在解題過程當中並無發現過多算法。算法

解題思路: 在1,2...9 插入運算符(+ - 或者沒有),1到9有8個空位,每一個空位有三種可能性,也就是3^8種。數組

運用PHP的弱類型特性,以及強大的數組, 咱們只須要將每一個有運算符的數字放入數組中便可。函數

好比: ["1," "+23", "-45", "678", "-9"], 不一樣的運算符就組合成相似的數組,最後magic函數 array_sum。spa

$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;

 

輸出結果:code

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.22899389267blog

相關文章
相關標籤/搜索