掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

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

No.24587

組み合わせを求めるプログラム
投稿者---ツカちゃん(2005/12/07 19:01:16)


C言語で33個以上の組み合わせを求めるアルゴリズムってありませんか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:組み合わせを求めるプログラム 24588 円零 2005/12/07 19:33:21


No.24588

Re:組み合わせを求めるプログラム
投稿者---円零(2005/12/07 19:33:21)


数がいくつだろうと組み合わせを求めるアルゴリズムは変わらんでしょう。
と言うか普通言語とアルゴリズムは直接関係ないので、
「C言語で33個以上の組み合わせを求めるアルゴリズム」というのは非常に間違った質問ですね。

桁の大きな整数の計算のアルゴリズム、と言うことであれば
「多倍長整数」で調べてみてはどうですか。

ここは基本的に丸投げに回答は与えないことになってるので、まず自分である程度作ってみてください。


この投稿にコメントする

削除パスワード

No.24589

Re:組み合わせを求めるプログラム
投稿者---ツカちゃん(2005/12/07 20:42:46)


すみません。ちょっと丸投げすぎでした。
nCmでnが33以上の時の組み合わせを求めるときです。
「C言語によるアルゴリズム辞典」にあるビットを使用するアルゴリズムを使っていたのですが、C言語だと32ビットまでの変数しか宣言できないので、33以上の場合が求められないのです。いいアルゴリズムがないか検索はしてみたのですが、見つけられませんでした。もし心当たりございましたら教えていただきたいのですが。
参考にしたプログラムは↓です。
/***********************************************************
gencomb.c -- 組合せの生成
***********************************************************/
#include <stdio.h>
#include <stdlib.h>
#define N 8
#define K 4
typedef unsigned int set;
#define first(n) ((set) ((1U << (n)) - 1U))

set nextset(set x)
{
set smallest, ripple, new_smallest, ones;

smallest = x & -x;
ripple = x + smallest;
new_smallest = ripple & -ripple;
ones = ((new_smallest / smallest) >> 1) - 1;
return ripple | ones;
}

void printset(set s)
{
int i;

for (i = 1; i <= N; i++) {
if (s & 1) printf(" %d", i);
s >>= 1;
}
printf("\n");
}

int main()
{
int i;
set x;

i = 1; x = first(K);
while (! (x & ~first(N))) {
printf("%4d:", i); printset(x);
x = nextset(x); i++;
}
return EXIT_SUCCESS;
}



この投稿にコメントする

削除パスワード

No.24592

Re:組み合わせを求めるプログラム
投稿者---RAPT(2005/12/07 21:41:22)


ビットにこだわらず、配列でやればいいのでは?


この投稿にコメントする

削除パスワード

No.24596

★★★ソースの添付は字下げしてくださるようにお願いします
投稿者---管理人(2005/12/07 22:23:55)


投稿上の注意をお読みの上、字下げをしたプログラムを再投稿してくださるようお願いいたします。

#こちらは参考になるかと思われます。
http://www5.airnet.ne.jp/tomy/cpro/pe2.htm




この投稿にコメントする

削除パスワード

No.24602

Re:組み合わせを求めるプログラム
投稿者---かずま(2005/12/08 02:36:32)


次の 2つのプログラムの違いは何だと思いますか?

----------------------------------------------------------------
#include <stdio.h>

#define N 100

int a[N], n, r;

void comb(int i)
{
for (a[i] = a[i-1] + 1; a[i] <= n; a[i]++)
if (i == r) {
for (i = 0; i < r; ) printf(" %d", a[++i]);
printf("\n");
} else comb(i+1);
}

int main(void)
{
while (printf("> "), scanf("%d%d", &n, &r) == 2 && n >= r && r < N)
comb(1);
return 0;
}
----------------------------------------------------------------
#include <stdio.h>

#define N 100

int a[N], n, r;

void comb(int i)
{
    for (a[i] = a[i-1] + 1; a[i] <= n; a[i]++)
        if (i == r) {
            for (i = 0; i < r; ) printf(" %d", a[++i]);
            printf("\n");
        } else comb(i+1);
}

int main(void)
{
    while (printf("> "), scanf("%d%d", &n, &r) == 2 && n >= r && r < N)
        comb(1);
    return 0;
}
----------------------------------------------------------------



この投稿にコメントする

削除パスワード

No.24610

Re:組み合わせを求めるプログラム
投稿者---ツカちゃん(2005/12/08 13:31:41)


>管理人さん
失礼しました。
ありがとうございます。

>かずまさん
読みやすさでしょうか。
そこらへんの配慮を怠ってしまいました。すみません。


この投稿にコメントする

削除パスワード

No.24637

Re:組み合わせを求めるプログラム
投稿者---nop(2005/12/09 12:44:52)


> C言語だと32ビットまでの変数しか宣言できないので、

32bitで足りないのでしたら、
2つ合わせて擬似的に64bitにすればよいのでは?


この投稿にコメントする

削除パスワード

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