题目介绍
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
示例 1:
输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: n = 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
提示:
- 2 <= n <= 58
题目分析
- 2 <= n <= 58
- k >= 2
由题目易知:k>=2
以n=10为例
- 分析k=2
10 = 1 + 9 = 2+8 = 3+7 =4+6 = 5+5
乘积,分别为:9 ,16, 21 ,24 ,25 ,最大为25 - 分析 k=3
10 = 1+1+8 = 1+2+7 =1+3+6=1+4+5
= 2+2+6 = 2+3+5 = 2+4+4
= 3+3+4
乘积分别为:8、14、20;24、30、32;36 。最大为36 - 分析 k=4
10 = 1+1+1+7 = 1+1+2+6 = 1+1+3+5 =1+1+4+4
= 1+2+2+5 = 1+2+3+4
= 1+3+3+3
= 2+2+2+4 = 2+2+3+3
乘积分别为:7、12、15、16;20、24;27;32、36。最大为36
. . . . . .
分析总结:
k = 2 时,最大值为25,因子是55,10/2=5 ,10%2=0,故 5 5
k = 3 时,最大值是36,因子是334,10/3=3,10%3=1,故 3 3 (3+1)
k = 4 时,最大值是36,因子是 2233,10/4=2,10%4=2,故2 2 (2+1)(2+1)
预测,k=5时,10/5=2,10%5=0,最大值的因子是22222,最大值为32
因此:
n%k为0时,最大值为pow(n/k,k)
n%k不等于0时,最大值为pow(n/k,k-n%k)*pow(n/k+1,n%k)
代码
class Solution {
public:
int integerBreak(int n) {
int k=2,m,max=0,temp=0;
for(;k<=n;k++){
m=n/k;
if(n%k==0){
temp=pow(m,k);
}else{
temp=pow(m+1,n%k)*pow(m,k-n%k);
}
if(temp>max)
max=temp;
}
return max;
}
};