PHP
语言,进行编码测试,
编码之前要进行思路分析,避免无头苍蝇,走一步看一步
最后,希望后期面试顺利!欢迎指摘 .
编程题:
有⼀堆糖果,其数量为n,
现将糖果分成不同数量的堆数(每堆数量均为整数,最少为1),
请算出糖果堆对应数量的最⼤乘积是多少,并给出对应的分配⽅案;
举例:糖果数量为8,可以得到的乘积最⼤为18,对应的分配⽅案为【2,3,3】;
初始测试数据比较小,可以在草稿纸上穷举分配方案,寻找规律,发现:
**
* 有⼀堆糖果,其数量为n,现将糖果分成不同数量的堆数
* @param int $z_number 糖果数量
* @return string 检测结果
*/
public function zingFunc($z_number = 0){
//检验数据规范性
$res_msg = '分配数字为:'.$z_number;
//最大乘积
$max_result = 1;
//方案分配
$option_msg = '';
if (is_int($z_number)&& $z_number > 0){
if ($z_number < 5){
$max_result = $z_number;
$option_msg = $z_number;
}else{
//整数大于5,详细分析
//取商的整数
$count = intval($z_number/3);
//除3取模
$mod = $z_number%3;
$arr_option = [];
if ($mod == 0){
//此时正好是统一分配
for ($i=0;$i<$count;$i++){
$max_result*=3;
$arr_option[] = 3;
}
}elseif ($mod == 1){
//对其中的一个分配数加1
for ($i=0;$i<$count-1;$i++){
$max_result*=3;
$arr_option[] = 3;
}
$max_result *=4;
$arr_option[] = 4;
}else{
//余数为2的时候,可以对前面取两堆,分别加1
for ($i=0;$i<$count-2;$i++){
$max_result*=3;
$arr_option[] = 3;
}
$max_result *=4;
$max_result *=4;
$arr_option[] = 4;
$arr_option[] = 4;
}
$option_msg = implode(',',$arr_option);
}
$res_msg .= ',最大乘积为:'.$max_result.',方案分配为:【'.$option_msg.'】';
}else{
$res_msg .= ',数据输入不是正整数';
}
//echo('<br>'.$res_msg);
return $res_msg;
}