1. 程式人生 > >整數劃分(C語言實現)

整數劃分(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); }