整数划分(C语言实现)

来源:互联网 发布:网络棋牌室平台代理 编辑:程序博客网 时间:2024/06/05 23:02
指把一个正整数n写成多个大于等于1且小于等于其本身的整数的和,则其中各加数所构成的集合为n的一个划分。这是一个典型的递归算法。
所谓整数划分,是指把一个正整数n写成为
其中,
为正整数,并且
为n的一个划分。
如果
中的最大值不超过m,即
,则称它属于n的一个m划分。
这里我们记n的m划分的个数为
例如,当n=4时,有5个划分,即
注意:
被认为是同一个划分。
根据n和m的关系,考虑一下几种情况:
(一)当
时,无论m的值为多少
,只有一种划分,即
(二)当
时,无论n的值为多少,只有一种划分,即n个1,
(三)当
时,根据划分中是否包含n,可以分为以下两种情况:
(1)划分中包含n的情况,只有一个,即
(2)划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有
划分。
因此
(四)当
时,由于划分中不可能出现负数,因此就相当于
(五)当
时,根据划分中是否包含最大值m,可以分为以下两种情况:
(1)划分中包含m的情况,即
,其中
的和为n-m,因此这种情况下为
(2)划分中不包含m的情况,则划分中所有值都比m小,即n的
划分,个数为
因此
C语言实现
#include<stdio.h>
  
void main()
{
    int equation(int n,int m);
    int n,m;
    printf("Please input 'n'(0<n<100):");
    scanf("%d",&n);
    printf("Please input 'm'(0<m<=n):");
    scanf("%d",&m);
    printf("quantity:%d\n",equation(n,m));
}
  
int equation(int n,int m)
{
    if(n==1||m==1)
        return (1);
    else if(n<m)
        return equation(n,n);
    else if(n==m)
        return 1+equation(n,n-1);
    else
        return equation(n-m,m)+equation(n,m-1);
}
0 0
原创粉丝点击