整數劃分(C語言實現)
阿新 • • 發佈:2019-01-07
指把一個正整數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);
}
|