整数最优分解问题

Description设n是一个正整数。现要求将n分解为若干个自然数的和,且使这些自然数的乘积最大。 对于给定的正整数n,编程计算最优分解方案。Input第1行是正整数n。(n<10000)Output将计算出的最大乘积输出

Sample Input

10

Sample Output

36




#include<stdio.h>
long b[160]={0};
long calculate(int m,int n)
{
long k;
long i,j,d=0,p=0,t;
b[0]=3;
for(i=1;i<m+n;i++)
{
if(i<m)t=3;
else t=2;
for(j=0;j<160;j++)
{
k=b[j]*t+d;
b[j]=k%10000000000;
d=k/10000000000;
}
if(d)b[j]=d;
}
for(i=159;i>=0;i--)
if(b[i]){p=i;break;}
return p;
}
void main()
{
long k1,k2;
long i,p,n;
scanf("%ld",&n);
if(n<4)printf("%ld",n-1);
else if(n==4)printf("4");
else
{
if(n%2==0)k1=n/6*2,k2=n%6/2;
else k1=(n-3)/6*2+1,k2=(n-3)%6/2;
p=calculate(k1,k2);
printf("%ld",b[p]);
for(i=p-1;i>=0;i--)
{
if(b[i]>999999999){printf("%ld",b[i]);continue;}
if(b[i]>99999999){printf("0%ld",b[i]);continue;}
if(b[i]>9999999){printf("00%ld",b[i]);continue;}
if(b[i]>999999){printf("000%ld",b[i]);continue;}
if(b[i]>99999){printf("0000%ld",b[i]);continue;}
if(b[i]>9999){printf("00000%ld",b[i]);continue;}
if(b[i]>999){printf("000000%ld",b[i]);continue;}
if(b[i]>99){printf("0000000%ld",b[i]);continue;}
if(b[i]>9){printf("00000000%ld",b[i]);continue;}
printf("000000000%ld",b[i]);
}
}
printf("\n");
}

转载于:https://www.cnblogs.com/zhang20115330/p/3151628.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值