整数划分(C语言实现)

xiaoxiao2021-02-28  140

指把一个 正整数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); }
转载请注明原文地址: https://www.6miu.com/read-20835.html

最新回复(0)