【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20653

組み合わせと順列を組み合わせたプログラム
投稿者---Cを勉強しはじめたばかり(2005/04/17 14:53:24)


はじめまして。
いきなりですが下のプログラムはn個の中からr個だけ
取り出してその組み合わせを全て列挙するようなプログラムです。
ですが、自分が考えているのはその列挙された組み合わせの
順列を列挙するようなプログラムを組みたいと思っています。
ぜひアドバイスやヒントなど頂きたいと思っています。
よろしくお願いします。

#include <stdio.h>

void comb(int n, int r)
{
    int a[100], i = 1, j;

    for (a[0] = 0; ; i++)
        for (a[i] = a[i-1] + 1; ; a[i]++) {
            if (i == r) {
                for (j = 1; j <= r; j++) printf(" %d", a[j]);
                printf("\n");
            }
            if (a[i] < n) break;
            if (--i == 0) return;
        }
}

int main(void)
{
    int n, r;

    while (printf("n r ? "), scanf("%d%d", &n, &r) == 2) comb(n, r);
    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:組み合わせと順列を組み合わせたプログラム 20664 たいちう 2005/04/18 10:30:30


No.20664

Re:組み合わせと順列を組み合わせたプログラム
投稿者---たいちう(2005/04/18 10:30:30)


> ですが、自分が考えているのはその列挙された組み合わせの
> 順列を列挙するようなプログラムを組みたいと思っています。

何をしたいのかわかりません。
とりあえず、小さなnとrについての出力例を書いてもらえますか?


この投稿にコメントする

削除パスワード

No.20666

Re:組み合わせと順列を組み合わせたプログラム
投稿者---Cを勉強しはじめたばかり(2005/04/18 16:32:02)


すみません。分かりにくかったでしょうか。
例としてはnに5、rに3をいれたときには
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
のようになります。
しかし自分が考えているのは1 3 2や2 3 1などの順列も
出力できるようなプログラムにしたいと思っています。
説明不足で申し訳ないです。



この投稿にコメントする

削除パスワード

No.20671

Re:組み合わせと順列を組み合わせたプログラム
投稿者---かずま(2005/04/19 00:58:55)


> 例としてはnに5、rに3をいれたときには
> 1 2 3
> 1 2 4
 ...
> 3 4 5
> のようになります。

それは、組合わせの出力ですね。順列の出力を書かないのはなぜですか?
プログラムが分からないのではなく、何を出力すればよいかが分かっていな
いのではありませんか?
プログラムを書く前に、期待する出力を自分で書いてみることで、その規則
性が発見でき、プログラムが書けるようになるはずです。
#include <stdio.h>

#define N  100

int next_perm(int *a, int n, int r)
{
    for ( ; r > 0; r--) {
        int i = r, t = a[r];
        while (++i <= n)
            if (a[i] > t) { a[r] = a[i]; a[i] = t; return 1; }
        for (i = r; i < n; i++) a[i] = a[i+1];
        a[n] = t;
    }
    return 0;
}

int main(void)
{
    int a[N], n, r, i;

    while (printf("n r? "), scanf("%d%d", &n, &r) == 2)
        if (n < N && r <= n) {
            for (i = 1; i <= n; i++) a[i] = i;
            do {
                for (i = 1; i <= r; i++) printf(" %d", a[i]);
                printf("\n");
            } while (next_perm(a, n, r));
        }
    return 0;
}



この投稿にコメントする

削除パスワード

No.20672

Re:組み合わせと順列を組み合わせたプログラム
投稿者---Cを勉強しはじめたばかり(2005/04/19 17:45:23)


かずまさん、ありがとうございました。
プログラムを組むことにあまり慣れていなくて
どうすれば自分が思うようなプログラムを組めるのか
悩んでいました。
どのような出力をしたいのか
かずまさんの書いて頂いたプログラムを参考に
よく考えてみます。お世話になりました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧