给定一个正整数a找到最小的正整数b它的每个数字相乘之后等于a

10次阅读

共计 870 个字符,预计需要花费 3 分钟才能阅读完成。

<?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));

正文完
 0