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