給定一個正整數a,找到最小的正整數b,它的每一個數字相乘以後等於a

<?php
/*
 * 描述
 * 給定一個正整數a,找到最小的正整數b,它的每一個數字相乘以後等於a。
 * 若是沒有答案,或者答案超過了32位有符號整型的範圍,返回0。
 *
 * */

function factorization(int $input)
{
    //它的每一個數字相乘以後等於a,
    //因此分解的元素必須是1-9之間的數字,
    //1-9之間的數字能夠有1-9之間的質數相乘獲得
    $facts = [2=>0,3=>0,5=>0,7=>0];

    foreach ($facts as $fact=>$num) {
        while ($input%$fact ==0) {
            $input = $input/$fact;
            $facts[$fact]++;

            //已經分解到最底層了,結束遍歷
            if (isset($facts[$input])) {
                $facts[$input]++;
                break 2;
            }
        }
    }

    //最後沒法被個位數的質數分解,就是沒有答案
    if (!isset($facts[$input])) {
        return 0;
    }
    if ($facts[3]>1) {
        $facts[9] = intval($facts[3]/2);
        $facts[3] = $facts[3]%2;
    }
    if ($facts[2]>2) {
        $facts[8] = intval($facts[2]/3);
        $facts[2] = $facts[2]%3;
    }
    if ($facts[2]>1) {
        $facts[4] = intval($facts[2]/2);
        $facts[2] = $facts[2]%2;
    }
    if ($facts[2]==1 && $facts[3]==1) {
        $facts[2]=$facts[3]=0;
        $facts[6] = 1;
    }
    ksort($facts);
    $str = '';
    foreach ($facts as $fact=>$num) {
        $str .=str_repeat(strval($fact), $num);
    }
    return intval($str);
}

$param = $argv;
$input = intval($param[1]);
var_dump(factorization($input));
相關文章
相關標籤/搜索