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

Q06 長方形から作る正方形


PHPのソース

<?php

//作成される正方形の数を返す
function DeriveSquareCnt($pX,$pY){
    if($pX > $pY){
        $Save = $pX;
        $pX = $pY;
        $pY = $Save;
    }
    if($pX === $pY) return 1;

    $ModVal = $pY % $pX;

    if ($ModVal === 0) return $pY / $pX;
    return ($pY - $ModVal) / $pX + DeriveSquareCnt($pX , $ModVal);
}

function Solve($pMaxLen,$NeedSquareCnt){
    $AnsweCnt = 0;
    for($X = 1 ; $X <= $pMaxLen ; $X++){
        for($Y = $X ; $Y <= $pMaxLen ; $Y++){
            $CurrSquareCnt = DeriveSquareCnt($X,$Y);
            if ($CurrSquareCnt !== $NeedSquareCnt) continue;

            //echo "横{$X},縦{$Y}での正方形は、{$CurrSquareCnt}個";
            //echo PHP_EOL;
            $AnsweCnt++;
        }
    }
    echo "最大長さ{$pMaxLen}での解は、{$AnsweCnt}通り";
    echo PHP_EOL;
}
Solve(   8, 5);
Solve(1000,20);


実行結果

最大長さ8での解は、8通り
最大長さ1000での解は、26882通り


解説

メモ化したら遅くなったので、メモ化しないようにしました。