トップページに戻る    次のPHPのサンプルへ    前のPHPのサンプルへ

Cマガ電脳クラブ(第003回) 九つの数が9に

問題

185   96
--- + -- = 9
 37   24

上の左辺には1〜9の数字がすべて1字ずつ登場している。さて、これと同様に

???   ??
--- + -- = 9
 ??   ??

の式を、1〜9すべての数字を1回ずつ使って正しい式にしてください。
例を含めて解は何通りあるか、すべてみつけてください。


ソース

<?php error_reporting(E_ALL);
$Stk = new SplStack();
for ( $I = 1; $I <= 9; $I++) {
    $Stk->push(array($I));
}

while($Stk->isEmpty() == false){
    $Popped = $Stk->pop();

    if(count($Popped) == 9){
        if (IsOK($Popped)) PrintAnswer($Popped);
        continue;
    }

    for ( $I = 1; $I <= 9; $I++) {
        if(in_array($I,$Popped)) continue;
        $Stk->push(array_merge($Popped,array($I)));
    }
}

function IsOK($pIntList)
{
    /* A/B + C/Dとおく*/
    $wkA = $pIntList[0] * 100 + $pIntList[1] * 10 + $pIntList[2];
    $wkB = $pIntList[3] *  10 + $pIntList[4];
    $wkC = $pIntList[5] *  10 + $pIntList[6];
    $wkD = $pIntList[7] *  10 + $pIntList[8];

    //通分して加算
    $Bunbo  = $wkB * $wkD;
    $Bunshi = $wkA * $wkD + $wkC * $wkB;

    return $Bunshi == $Bunbo * 9;
}

function PrintAnswer($pIntList)
{
    static $AnswerCnt = 0;
    printf("Answer%2dは、", ++$AnswerCnt);
    printf("%d%d%d/%d%d + %d%d/%d%d = 9\n",
        $pIntList[0], $pIntList[1], $pIntList[2], $pIntList[3], $pIntList[4],
        $pIntList[5], $pIntList[6], $pIntList[7], $pIntList[8]);
}


実行結果

Answer 1は、763/98 + 51/42 = 9
Answer 2は、735/98 + 24/16 = 9
Answer 3は、612/78 + 45/39 = 9
Answer 4は、465/93 + 72/18 = 9
Answer 5は、376/84 + 95/21 = 9
Answer 6は、345/69 + 72/18 = 9
Answer 7は、297/54 + 63/18 = 9
Answer 8は、264/57 + 83/19 = 9
Answer 9は、185/37 + 96/24 = 9
Answer10は、184/26 + 75/39 = 9


解説

深さ優先探索で1から9の順列を列挙してます。

C#で解いたもの