組合せ生成ルーチン 使用例



[ 簡単な説明 ]

組合せ生成ルーチンの使用例です。
出力結果は、

          test2   5   3

と実行した結果です。showperm ルーチンは単に順列配列 p[ ] の内容を表示するだけです。

プログラム・ソース("test2.c")           top (先頭に戻る)
/*		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;
}

出力結果           top (先頭に戻る)
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