整数划分(C语言实现)

指把一个 正整数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);
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值