Description
问题描述:设n是一个正整数。
(1)现在将n分解为若干个互不相同的自然数之和,且使这些自然数的乘积最大。
(2)现在将n分解为若干个自然数之和,且使这些自然数的乘积最大。
编程任务:对于给定的正整数n,编程计算问题(1)和(2)的最优分解的最大乘积。
注意:
这里的自然数不含0但包含1。
特别地,当整数n无法分解为若干互不相同的加数时,即自身视为单独的一个加数,比如输入2,问题(1)的解输出为2。
而如果整数n可以分解为若干互不相同的加数时,不考虑自身为单独加数的情况,比如4,问题(1)的解输出为3,而非4。
输入格式
只有一个正整数n(1<=n<=100)。
输出格式
输出待解问题(1)和(2)的最大乘积,中间空格相连,这两个数可能较大请用64位整数。
如,输入n为10,若加数互不相同,则n=2+3+5,此时最大乘积为2*3*5=30。
若加数可相同,则n=2+2+3+3,此时最大乘积为2*2*3*3=36。
输入样例
10
输出样例
30 36
#include<stdio.h>
__int64 fun1(__int64 n)
{
__int64 a[101];
__int64 i,j,k,flag,total=1;
if(n==1||n==2)return n;
if(n==3||n==4)return n-1;
for(a[0]=2,n=n-2,i=1;n>a[i-1];i++)
{
a[i]=a[i-1]+1;
n=n-a[i];
}
flag=i;
if(n!=0)
{
if(n>i)
{
k=n/i;
for(j=0;j<i;j++)a[j]=a[j]+k;
n=n-i;
}
for(i=i-1;n>0;i--)
{
a[i]++;
n--;
}
}
i=flag;
for(j=0;j<i;j++)total=total*a[j];
return total;
}
__int64 fun3(__int64 a,__int64 b)
{
__int64 c=1;
while(b>0)
{
c=c*a;
b--;
}
return c;
}
__int64 fun2(__int64 n)
{
if(n%3==0)
return fun3(3,n/3);
else if(n%3==1)
return 4*fun3(3,(n-4)/3);
else if(n%3==2)
return 2*fun3(3,(n-2)/3);
}
__int64 main()
{
__int64 n;
scanf("%I64d",&n);
printf("%I64d %I64d",fun1(n),fun2(n));
}