c語言實現排列組合


1.求排列組合結果總數

    組合:采用遞歸算法,根據下面第二行公式。

     

int sumzuhe(int N, int K) { if (K == 0) return 1; if (N == K) return 1; return sumzuhe(N - 1, K - 1) + sumzuhe(N - 1, K); }

    排列:采用遞歸。思想來自:https://blog.csdn.net/u012814856/article/details/73863086。

int sumpailie(int N,int K) { if (K ==1) return N; return  sumpailie(N - 1, K - 1)*N; }

2.展示排列,組合結果。

    排列:首先從(N)個中取一個數,再在剩余的一次次取一個數,每取一個數就把這位標記為取過了,以免下次再取。取夠K個數之后,把K個數輸出,展示結果(所以需要提前有一個數組來存                 放結果)。然后再取尋找別的第K個數,依次在不斷尋找別的第(K-1),(K-2),,,,,個數。取完一個數把標記位設為未取過。

void  pailie(int a[],int N,int K,int level)//(K==N)時為全排列 { if (level>=K) { for (int j = 0; j < level; j++) printf("%d ", result[j]); printf("\n"); return; } for (int i = 0; i < N; i++) { if (flag[i] == false)//該位未取過 { flag[i] = true; result[level++] = a[i];//取出修改標記位 pailie(a, N, K , level);//在未被使用過的里面再選擇一個
            level--;//重新取別的位 flag[i] = false; } } }

 

       組合:組合與排列不同的是:不分順序。我們可以假設一直是從前往后選數,那么前面作為開頭的數,后面就不可以再作為開頭。比如:A,B,C,D。當我第一次選擇第一個數為A的話,把以A為頭的數選完之后,下一次選第一個數決不能是A。所以需要有一個變量來控制所選擇的第一個數(下面的程序為Index)。然后再在第一個數(比如選擇A)之后的數中挑選接下來的數。選擇接下來的數與上面排列類似。

void  zuhe(int a[], int N, int K,int index,int deep) { if (deep >= K) { for (int i = 0; i < K; i++) { printf("%d ", result[i]); } printf("\n"); return; } for (int i = index; i <N; i++) { result[deep] = a[i]; deep++; zuhe(a, N, K, index + 1, deep); deep--; index++; } }

完整程序:

#include "stdio.h"
#define Max  10
#define length 10
typedef enum bool{ true,false}bool;
char flag[10] ;
int  result[10];
int sumzuhe(int N, int K)
{
	if (K == 0)
		return 1;
	if (N == K)
		return 1;
	return sumzuhe(N - 1, K - 1) + sumzuhe(N - 1, K);
}
void  pailie(int a[],int N,int K,int level)
{
     if (level>=K)
        { 
		for (int j = 0; j < level; j++)
			printf("%d ", result[j]);
		printf("\n");
		return;
	}
	for (int i = 0; i < N; i++)
	{
		if (flag[i] == false)
		{
			flag[i] = true;
			result[level++] = a[i];
			pailie(a, N, K , level);//在未被使用過的里面再選擇一個
			level--;
			flag[i] = false;
		}
	}
}
void  zuhe(int a[], int N, int K,int index,int deep)
{
	if (deep >= K)
	{
		for (int i = 0; i < K; i++)
		{
			printf("%d ", result[i]);
		}
		printf("\n");
		return;
	}
	for (int i = index; i <N; i++)
	{
		result[deep] = a[i];
		deep++;
		zuhe(a, N, K, index + 1, deep);
		deep--;
		index++;

	}
}

int sumpailie(int N,int K)
{
	if (K ==1)
		return N;
	return sumpailie(N - 1, K - 1)*N;

}
void main()
{
	int a[5] = { 1,2,3,4,5};
	memset(flag, false, sizeof(flag));
	printf("排列結果數(5,3):\n");
	printf("%d ", sumpailie(5, 3));
	printf("\n");
	printf("排列結果(5,3):\n");
	pailie(a, 5, 3, 0);
	printf("全排列結果:\n");
	pailie(a, 5, 5, 0);

	printf("組合結果數(5,3):\n");
	printf("%d ", sumzuhe(5, 3));
	printf("\n");
	printf("組合結果(5,3):\n");
	zuhe(a, 5, 3, 0, 0);
	printf("\n");
	
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM