

风回小院庭芜绿,柳眼春相续
#include <stdio.h> #include <stdlib.h> void prt_num(int *num, int n) { int i; for(i = 0; i < n; i++) if(num[i]) putchar(i + 'a'); printf(" "); } int check(int *num, int n, int m) { int i, flag = 0; for(i = 0; i < n - m; i++) if(num[i]) flag = 1; return flag; } void comb_num(int *num, int n, int m) { int i, j, count; prt_num(num, n); for(;;) { count = 0; for(i = 0; i < n - 1; i++) { if(num[i] == 1 && num[i + 1] == 0) { num[i] = 0; num[i + 1] = 1; break; } if(num[i]) count++; } for(j = 0; j < i; j++) { if(j < count) num[j] = 1; else num[j] = 0; } prt_num(num, n); if(!check(num, n, m)) break; } } int main(void) { int n, m, *num, i; if((scanf("%d %d", &n, &m)) != 2 || m <= 0 || n <= m) return 1; if(!(num = malloc(sizeof(int) * n))) return 1; for(i = 0; i < n; i++) { if(i < m) num[i] = 1; else num[i] = 0; } comb_num(num, n, m); puts(""); return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> void comb(char *s, int n, int m) { int i, j, k, t; int total = 1 << n; char **new = NULL; if(!(new = malloc(total * sizeof(char*)))) exit(EXIT_FAILURE); for(i = 0; i < total; i++) if(!(new[i] = calloc(n + 1, sizeof(char)))) exit(EXIT_FAILURE); if(n == 0) return; for(i = 1; i < total; i++) { for(k = 0, j = 0; j < n; j++) { t = i; if(t & (1 << j)) { new[i][k++] = *(s + j); } } } for(i = 1; i < total; i++) if(strlen(new[i]) == m) printf("%s\t", new[i]); for(i = 0; i < total; i++) free(new[i]); free(new); } int main(void) { char s[] = "12345"; int n = strlen(s), m = 3; comb(s, n, m); return 0; }
#include <stdio.h> #include <string.h> #define N 3 #define M 5 int combination[N+1] = {0}; void recursion(int m, int depth); int main(void) { recursion(1, 1); getchar(); return 0; } void recursion(int m, int depth) { int i, j, k; for (i = m; i <= M; i++) { combination[depth] = i; if (depth == N) { for (j = 1; j <= N; j++) { printf("%d ", combination[j]); } printf("\n"); } else { recursion(i+1, depth+1); } } }