Cのアルゴリズムで

[戻る]
てっちゃん 2003/09/02(火) 13:48:43
C言語であるプログラムを作っているのですが

(例)
1,2,3,4,5,6,7
という数字の中から3つ選んだときの全部の組み合わせをすべて示す

といった感じのものです
全部でいくつ組み合わせがあるかではなくすべての組み合わせを出力するというもので
す
実際に作っているのは数字は可変でいくつ選ぶのかも可変です
1,2,3,4,5       の中から 3つ
1,2,3,4,5,6,7,8,9 の中から 5つ
といった具合です

1,2,3,4,5       の中から 3つ
の例だと
1,2,4と4,1,2といった組み合わせは同じものと考えます
ただ作るだけだったらできるのですが、何かいいアルゴリズムはないでしょうか?

たいちう 2003/09/02(火) 15:11:34
> ただ作るだけだったらできるのですが、何かいいアルゴリズムはないでしょうか?

てっちゃんさん(さんはいらんか)が作ってものをここに載せてはいかがですか?

たいちう 2003/09/02(火) 16:06:54
> てっちゃんさん(さんはいらんか)が作ってものをここに載せてはいかがですか?

と思ったけど、思いついたので作りました。

#include <stdio.h>

#define M 9
#define N 5

int NUM[M];

void Perm(int n, int a)
{
    int i;
    static int c;
    if (n==N) {
        printf("%4d : ", ++c);
        for (i=0;i<N;i++)
            printf("%3d", NUM[i]);
        printf("\n");
        return;
    }

    for (i=a+1;i<=M;i++) {
        NUM[n] = i;
        Perm(n+1, i);
    }
}

int main()
{
    Perm(0, 0);
    return 0;
}

たいちう 2003/09/02(火) 16:11:35
と思ったけど、関数名が間違いですね。
順列(Permutation)でなく組合せ(Combination)でした。

てっちゃん 2003/09/02(火) 22:14:03
[[解決]]
作ったプログラムは削除してしまったので・・・
再帰使わずにカウンタを回すようなイメージで作ったのですがみにくくなってしまったので消し
ました
↑のだとすっきりしててわかりやすいです
僕の作ったのは人が見てもすぐにわかるものじゃなかったので
レスありがとうございました

古いスレッドには追加発言できません。