题目描述:
设n是一个正整数,现在要求将n分解为若干个互不相同的自然数的和,使这些自然数的乘积最大。
输入 10
输出 30
题目类型:贪心算法
题目分析:
该题是将正整数进行分解,而且互不相同,a+b大于2倍的根号下a*b,所以分解成的数字越接近越好。整体思路是,将该整数分解成从2开始依次递增的数字,直到不能分解为止,将剩余的数字从后往前往返依次加1。
例如:19
分解为2,3,4,5
由于是依次递增,所以剩余5不能再分解,这4个数字全部加1,还剩1,最后一位加1即可。
代码如下:
#include<stdio.h>
int main()
{
int j,k,n,count;
int index=0,sum=0;
int i=2;
int a[100]={0};
a[2]=2;
scanf("%d",&n);
while(n-sum>=i) { //从2开始,对n进行分解
sum+=i;
a[i]=i;
i++;
index++;
}
int p=(n-sum)/index; //整体全部累加
int q=(n-sum)%index; //只从后往前,加最后剩余的
for(j=i-1;j>=2;j--) {
a[j]+=p;
}
for(k=i-1;k>i-1-q;k--) {
a[k]++;
}
for(j=2;j<index+2;j++) {
printf("%d ",a[j]);
}
}