【问题描述】
一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。
现在你的任务是将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。
【输入】
只一个正整数n,(3≤n≤10000)。
【输出】
第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。
第二行是最大的乘积。
【样例】
输入:
10
输出:
2 3 5
30
这道题可以用dp做,也可以找出规律,那么就是一个数如果尽量的拆分成从2+3+4+5......这样的格式,
可以推出n可以从2加到几,这里我是解了一个二次方程,设从n=2加到k,那么(2+k)*(k-1)/2=n,那么把k解出来就行了,不知道如何解二次方程的自行百度。
然后有可能从2加到k不是刚好等于n,那么剩下的,就及有先后面的加数的方法平均分配。
1 #include <cmath> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 int n=0,tot=0,sum[10003]; 9 int ans[251],che[251]; 10 11 12 int main( ){ 13 scanf("%d",&n); 14 double gs=(double)n*2+2;gs=(double)1+4*gs;gs=sqrt(gs);gs=(-1+gs)/2; 15 int tot=(int)gs; 16 int fen=n-((tot+2)*(tot-1)/2); 17 int jia=fen/(tot-1),sy=fen-(tot-1)*jia; 18 for(int x=2;x<=tot;x++)sum[x]=x+jia; 19 for(int x=tot;x>tot-sy;x--)sum[x]++; 20 ans[0]=1,ans[1]=1; 21 for(int x=2;x<=tot;x++){ 22 cout<<sum[x]<<" "; 23 memset(che,0,sizeof(che)); 24 for(int y=1;y<=ans[0];y++)che[y]=ans[y]*sum[x]; 25 int cnt=1; 26 while(1){ 27 if(cnt>ans[0]&&che[cnt]==0)break; 28 ans[cnt]=che[cnt]%10; 29 che[cnt+1]+=che[cnt]/10; 30 cnt++; 31 } 32 ans[0]=cnt-1; 33 }cout<<endl; 34 for(int x=ans[0];x>=1;x--)cout<<ans[x]; 35 36 }