|
[ 簡単な説明 ]
組合せ生成ルーチンの使用例です。 出力結果は、 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 |