ショッピングモール  コエンザイムQ10(CoQ10) クレンジング  コエンザイムQ10(CoQ10) 化粧水


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

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

 詳しくはこちら



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

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


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

No.3361

重複組合せの生成について
投稿者---未熟者(2005/01/27 10:22:59)


はじめまして。表題の件について教えてもらいたいです。
n個の文字から重複を許してr個取り出したいのですが、
nHrという事はわかるのですが、
それらの文字列をプログラムで生成したいです。
例えば入力に、n=3 r=4とすれば
aaaa
aaab
aaac
aabb
aabc
aacc
abbb
abbc
(以下略)
というように生成したいです。
どうか御教授よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:重複組合せの生成について 3362 REE 2005/01/27 10:46:41
<子記事> Re:重複組合せの生成について 3363 かずま 2005/01/27 11:59:13


No.3362

Re:重複組合せの生成について
投稿者---REE(2005/01/27 10:46:41)


>はじめまして。表題の件について教えてもらいたいです。
>n個の文字から重複を許してr個取り出したいのですが、
>nHrという事はわかるのですが、
>それらの文字列をプログラムで生成したいです。

自分で手作業でそれを行う時の手順を文章で表してみてください。

それが出来たら、あとはプログラムに置き換えるだけです。



この投稿にコメントする

削除パスワード

No.3363

Re:重複組合せの生成について
投稿者---かずま(2005/01/27 11:59:13)


#include <stdio.h>

int a[26], n, r;

void generate(int k, int m)
{
    if (k < r)
        for (a[k] = m; a[k] < n; a[k]++) generate(k+1, a[k]);
    else {
        int i;
        for (i = 0; i < r; i++) putchar('a' + a[i]);
        putchar('\n');
    }
}

int main(void)
{
    while (printf("> n, r: "), scanf("%d%*c%d", &n, &r) == 2 && n <= 26)
        generate(0, 0);
    return 0;
}



この投稿にコメントする

削除パスワード

No.3364

Re:重複組合せの生成について
投稿者---かずま(2005/01/28 02:51:50)


> int a[26], n, r;

>     while (printf("> n, r: "), scanf("%d%*c%d", &n, &r) == 2 && n <= 26)

a の要素数が 26 である必要はないので、次のように訂正します。

#define MAX_N  26
#define MAX_R  100

int a[MAX_R], n, r;

    while (printf("> n, r: "), scanf("%d%*c%d", &n, &r) == 2
            && n > 0 && n <= MAX_N && r > 0 && r <= MAX_R)



この投稿にコメントする

削除パスワード

No.3401

Re:重複組合せの生成について
投稿者---かずま(2005/02/02 03:04:41)


r だけではなく、n も 26 に制限する必要はありません。
#include <stdio.h>

#define CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@$"
#define MAX_N  (sizeof(CHARS) - 1)
#define MAX_R  100

int a[MAX_R], n, r;

void generate(int k, int m)
{
    if (k < r)
        for (a[k] = m; a[k] < n; a[k]++) generate(k+1, a[k]);
    else {
        int i;
        for (i = 0; i < r; i++) putchar(CHARS[a[i]]);
        putchar('\n');
    }
}

int main(void)
{
    while (printf("> n, r: "), scanf("%d%*c%d", &n, &r) == 2
            && n-1u < MAX_N && r-1u < MAX_R)
        generate(0, 0);
    return 0;
}
ところで、最初の質問者は、問題が解決したかどうかの報告をなぜしない
のでしょうか?


この投稿にコメントする

削除パスワード

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




掲示板提供:Real Integrity