n全排列输出和 n个数的组合(数字范围a~b)
n全排列输出:
int WPermutation(int num, bool bRepeat)
num表示num全排列
bRepeat标志是否产生反复元素的序列。
int Permutation(int n, int* A, int cur, bool bRepeat) { static int number = 0; if(cur == n) { number++; for(int i = 0; i< n; i++) { printf("%d ", A[i]); } printf("\n"); } else { for(int i = 1; i <= n; i++) { int ok = 1; for(int j = 0; j < cur; j++) { if(!bRepeat) { if(A[j] == i) { ok = 0; } } } if(ok) { A[cur] = i; Permutation(n, A, cur + 1, bRepeat); } } } return number; } int WPermutation(int num, bool bRepeat) { printf("%d permutation(%s): %d ~ %d\n", num, bRepeat?"repeat mode":"single mode", 1, num); int n = num; int *A = (int*)malloc(n*sizeof(int)); memset(A, 0, sizeof(n*sizeof(int))); int cur = 0; int number = Permutation(n, A, cur, bRepeat); delete [] A ; A = NULL; printf("over!\n"); return number; }
n个数的组合(数字范围st~en),考虑反复元素:
int Wpermutation(int st, int en, int n, bool bRepeat);
n表示n个数字组合
每一个数字范围:st~en
bRepeat标志是否产生反复元素的序列。
int Permutation(int st, int en, int n, int* A, int cur, bool bRepeat) { static int number = 0; if(cur == n) { number++; for(int i = 0; i< n; i++) { printf("%d ", A[i]); } printf("\n"); } else { for(int i = st; i <= en; i++) { int ok = 1; for(int j = 0; j < cur; j++) { if(!bRepeat) { if(A[j] == i) { ok = 0; } } } if(ok) { A[cur] = i; Permutation(st, en, n, A, cur + 1, bRepeat); } } } return number; } int Wpermutation(int st, int en, int n, bool bRepeat) { printf("%d permutation(%s): %d ~ %d\n", n, bRepeat?"repeat mode":"single mode", st, en); int num = en - st + 1; if(n > num) { bRepeat = true; printf("too many number, to be repeat mode:\n"); } int *A = (int*)malloc(n*sizeof(int)); memset(A, 0, sizeof(n*sizeof(int))); int cur = 0; int number = Permutation(st, en, n, A, cur, bRepeat); delete [] A ; A = NULL; printf("over!\n"); return number; }