今天看到一个将正整数n划分成一系列正整数之和,n=n1+n2+...+nk,其中n1>=n2>=...>=nk>=1,k>=1 正整数n的划分数p(n)=q(n,n) 利用递归算法可以得到:
/*author: LI CANYU*/
/*date: 16/07/2010*/
#include <stdio.h>
#include <stdlib.h>
int Parti(int x, int y)
{
if((x<1)||(y<1))
{
return 0;
}
if((x==1)||(y==1))
{
return 1;
}
if(x<y)
{
return Parti(x,x);
}
if(x==y)
{
return Parti(x,x-1)+1;
}
if((x>y)&&(y>1))
{
return (Parti(x,y-1)+Parti(x-y,y));
}
}
int main(void)
{
int p;
int q;
int t;
scanf("%d %d", &p, &q);
t=Parti(p,q);
printf("%d/n", t);
system("pause");
return 0;
}
还有一种划分问题,将数字分为连续的两个自然数之和,例如9=4+5等等在这种划分中,设分成的连续自然数中最小的一个为n,可以分为m个自然数之和,则最大的一个自然数为n+m-1
/*author: LI CANYU*/
/*date: 16/07/2010*/
#include <stdio.h>
#include <stdlib.h>
int spli(int n)
{
int i,j=0,s=0,t=0,p;
p=0;
for(i=1;((i-1)*i/2)<n;i++)
{
t=(i*(i-1))/2;
j=(n-t)/i;
// printf("%d/n", j);
if(((n-t)%i)==0)
{
// printf("%d/n", j);
p++;
// printf("%d/n", j);
for(s=0;s<=i-1;s++)
{
printf("%d/n", j+s);
}
}
}
printf("%d/n", p); return p;
}
int main(void)
{
printf("continuous partication number: %d/n", spli(15));
system("pause");
return 0;
} 可以解决该问题。
//未经允许,不得转载