Chinaunix首页 | 论坛 | 博客
  • 博客访问: 426470
  • 博文数量: 103
  • 博客积分: 5010
  • 博客等级: 大校
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-11 17:22
文章分类
文章存档

2008年(77)

2007年(26)

我的朋友

分类: C/C++

2008-04-15 12:36:37

将正整数n表示成一系列正整数之和,n=n1+n2+...+nk,其中n1>=n2>=...>=nk,k>=1.
将最大加数n1不大于m的划分个数记做:q(n, m).
1.q(n, 1) = 1, n>=1.
2.q(n, m) = q(n, n),m>=n.
3.q(n, n) = 1+q(n, n-1).
4.q(n, m) = q(n, m-1)+q(n-m, m),n>m>1,即:正整数的最大加数n1不大于m的划分有n1=m的划分和n1<=m-1的划分组成。

#include <stdio.h>

static int division(int n, int m);
int main(int argc, char **argv)
{
        int n;
        int num;

        scanf("%d", &n);
        getchar();

        num = division(n, n);
        printf("num = %d\n", num);

        return 0;
}

static int division(int n, int m)
{
        if((n < 1) || m < 1){
                return 0;
        }

        if((n == 1) || m == 1){
                return 1;
        }

        if(n < m){
                return division(n, n);
        }

        if(n == m){
                return (1 + division(n, n-1));
        }

        return (division(n, m-1) + division(n-m, m));
}

[xxxx@localhost graph]$ ./a.out
6
num = 11


阅读(914) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~