[ 簡単な説明 ]
組合せ生成ルーチンの使用例です。 出力結果は、 test2 5 3 と実行した結果です。showperm ルーチンは単に順列配列 p[ ] の内容を表示するだけです。 |
/* test2.c 組合せ(nCk)の生成 generation of combination */ #include <stdio.h> #include <time.h> #include <stdlib.h> #include <math.h> long count; int flag; void showcomb(int p[], int n, int k); void showcomb(int p[], int n, int k) { int i, *q; count++; if(flag == 0) { for(i = 0, q = p; i < k; i++) printf("%d ", *q++); putchar('\n'); } } main(int argc, char *argv[]) { clock_t start, Time; int *p; int i, j, k, n, ret; if(argc < 3) { fprintf(stderr, "Usage : %s n k [ flag ]\n", argv[0]); fprintf(stderr, " function : nCk\n"); fprintf(stderr, " flag : time check mode (any char.)\n"); exit(0); } n = atoi(argv[1]); k = atoi(argv[2]); if(k < 1 || k > n) { fprintf(stderr, "Error : illegal parameter input.\n"); exit(-1); } flag = (argc >= 4); p = (int *)malloc(n * sizeof(int)); if(p == NULL) { fprintf(stderr, "Error : out of memory.\n"); exit(-1); } count = 0; start = clock(); gencomb(p, n, k); Time = clock() - start; printf(" nCk(n=%d,k=%d) = %ld", n, k, count); if(flag) printf("( %f [sec] )", (double)Time / CLK_TCK); putchar('\n'); free((char *)p); return 1; } |
1 2 4 1 3 4 2 3 4 1 2 5 1 3 5 2 3 5 1 4 5 2 4 5 3 4 5 nCk(n=5,k=3) = 9 |