最优分解问题
设n是一个正整数,现在要求将n分解为若干个互不相同的自然数的和,使这些自然数的乘积最大。
输入 10
输出 30
#include <stdio.h>
void main()
{
int n,i,j;
int sum=1;
int a[10]={0};
a[0]=2;
printf("输入要分解的数:\n");
scanf("%d",&n);
i=1;
while(n>a[i-1]) //最初分配的因子
{
if(i==0)
n-=a[0];
a[i]=a[i-1]+1;
n-=a[i-1];
i++;
}
while(n>0) //剩下的数依次减一,加在已分配好的因子上
{
for(j=0;j<i;j++)
{
a[i-j-2]++;
n--;
if((i-j-2)==0)
{
j=0;
break;
}
if(n==0)
break;
}
}
j=0;
while(a[j+1]) //求最终的乘积
{
sum*=a[j];
j++;
}
printf("乘积最大的数为:%d\n",sum);
}
/*
思路:
因为要使乘积最大,所以要尽量分解为相似大小的数。
分解时,因数从2开始,每次加1,n=n-a[i],保证剩下的数比下一次的数大。
否则从后往前循环已经出现的数a[i],一次加1,知道n=0为止。
例如:
分解13
分解为 2 3 4 ,还剩下 4 ,不够继续分解的下一个数"5",就把 4 依次分配给前面的因子,
分配顺序是 4 => 3 => 2 。所以最终结果为 3 4 6,这就是最大乘积的因子。
(分配顺序为从大到小,如果还剩下,就继续从大到小分配)
*/