最优自然数分解问题

来源:互联网 发布:人工智能5.4ppt 编辑:程序博客网 时间:2024/04/27 16:19

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){__int64a[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));   }


0 0
原创粉丝点击