将一个整数 n 拆分成乘积最大的形式(和为 n ,互不相同)。
求解过程是一个贪心的过程,将整数尽可能多的去分解。
原理:个数尽可能多的拆分(即从二开始累分),不够构成新数的部分均匀分在已知数的后边(从后往前加),这样能保证所得序列乘积是最大的。
#include<iostream>
#include<math.h>
using namespace std;
int ans[10000];
int main(){
for(int i=0;i<10000;i++){
ans[i]=i;
}
int n;
cin>>n;
int sum=0;
int i;
for(i=2;i<10000;i++){
sum+=ans[i];
if(sum>n) {
sum-=ans[i];
break;
}
}
i--;
int len=i;
int count=n-sum;
for(;count>0;count--){
ans[i]++;
i--;
if(i==1) i=len;
}
cout<<ans[2];
for(i=3;i<=len;i++){
cout<<" "<<ans[i];
}
cout<<endl;
return 0;
}