小蒜想将正整数 nnn 拆分为若干个互不相等的自然数之和,问如何拆分可以使得它们的乘积最大?
输入
格式一个正整数 n。
n≤10000。
输出
格式一行,包含若干个互不相等的自然数——乘积最大的一种拆分方案。这些自然数需从小到大输出,两个自然数之间用单个空格隔开。
#include <iostream>
using namespace std;
int main() {
int n,a[10000]; //这里要开大一点,防止不够
cin>>n;
int sum=0;
int num=0;
if(n==1){
cout<<1;
return 0;
}
for(int i=2;i<=n;i++){ //先减去i,但可能剩余的数小于i,再从前往后分配
if(n>=i){
n-=i;
a[num]=i;
num++;
}
}
for(int i=num-1;i>=0;i--){ //从后往前依次加1
if(n>0){
a[i]++;
n--;
}
}
if(n){ //如果还有剩余,让最后一个加1
a[num-1]++;
}
for(int i=0;i<num;i++){
cout<<a[i]<<' ';
}
return 0;
}