把一个整数划分为比他小的正整数之和共有多少种方法:
代码1:
#include<stdio.h>
int main(void)
{
int m,n;
unsigned long long a[505][505];
int i;
for(i=0;i<=500;++i)
{
a[i][0]=0;
a[0][i]=1;//初始化。
}
for(n=1;n<=500;++n)
{
for(m=1;m<=n;++m)
{
if((n-m)<m) a[n-m][m]=a[n-m][n-m];
a[n][m]=a[n-m][m]+a[n][m-1];//分为用m和不用m。
}
}
scanf("%d",&n);
while(n)
{
printf("%llu\n",a[n][n]);
scanf("%d",&n);
}
return 0;
}
代码2:
#include<stdio.h>
int q(int n,int m)
{
if((n<1)||(m<1)) return 0;
if((n==1)||(m==1)) return 1;
if(n<m) return q(n,n);
if(n==m) return q(n,m-1)+1;
return q(n,m-1)+q(n-m,m);
}
int main(void)
{
int n,m;
int result;
while(scanf("%d",&n)==1&&n!=0)
{
m=n;
result=q(n,m);
printf("%d\n",result);
}
return 0;
}
其中1比2更优化。