<?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));
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。