题意描述:将一个正整数分解成至少两个正整数数字之和的形式,求所有组合中因子乘积最大的分解,并返回该最大乘积。比如:n=2, return 1(2=1+1); n=10, return 36(10=3+3+4)
解题思路:先找规律
4=2+2,return 4
5=3+2,return 6
6=3+3,return 9
7=3+4,return 12
8=3+3+2,return 18
9=3+3+3,return 27
10=3+3+4,return 36
11=3+3+3+2,return 54
……
总结规律:2=1+1,乘积为1小于本身;3=1+2,乘积为2小于本身;4=2+2,乘积为4等于本身;5=2+3,乘积为6大于本身;6=2+2+2=3+3,乘积最大为9大于本身……
(1)可以发现4是分界点,比4小的数字不再分得到的乘积肯定比本身小,而比4大的数字分解会得到更大的乘积;
(2)分解因子全为2和3时乘积最大,同时要尽可能多的3;(3)当n%3==0时,因子全为3且3的个数为(n/3)乘积最大;当n%3==1时,因子3的个数为(n/3)-1,余数为4,乘积最大;当n%3==2时,因子3的个数为(n/3),余数为2,乘积最大;
于是有以下代码:
int integerBreak(int n) {
if(n < 2) return 0;
else if(n == 2)
return 1;
else if(n == 3)
return 2;
int mod = n % 3; 先得到模3的余数
int product = 1; 最终的乘积
int count = 0; 因子3的个数
if(mod == 1)
count = n/3 - 1;
else count = n/3;
while(count > 0){
product *= 3;
--count;
}
if(mod == 1) product *= 4;
else if(mod == 2) product *= 2;
return product;
}
上面的代码虽然充分反应了整个思路,但过于冗长繁杂,所以优化为以下代码:
int integerBreak(int n) {
if(n < 4)
return n-1;
int product = 1;
while(n > 4){
product *= 3;
n -= 3;
}
return product * n;
}