掲示板利用宣言

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

 私は

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

掲示板2

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

No.27096

N個の数字の全並び方を出力するプログラム
投稿者---sbr(2006/06/07 18:48:24)


N個の数字の全並び方を出力するプログラムを作りたいのですが、うまくいきません。
とりあえず簡単なところから始めようと思い、N=4として以下のようなプログラムを作成し、これはうまくいきました。

#include<stdio.h>
#include<stdlib.h>

#define N 4

int int_comp(const void *_a, const void *_b);

int main()
{
  int i,j,count1=0,count2=0;
  int code[N],s_code[N-1];
  int keep;
  int sousuu=1;
  FILE *fp;

  for(i=0; i<N; i++){
    code[i] = i;
  }

  for(i=N; i>0; i--){
    sousuu *= i;
  }
  
  fp = fopen("souatari_4.dat", "w");

  for(i=0; i<sousuu; i++){
    for(j=0; j<N; j++){
      fprintf(fp, "%d", code[j]);
    }
    fprintf(fp, "\n");

    count1++;
    count2++;

    if(count1 == 2){
      for(j=N-2; j<N; j++){
        if(code[N-3]+1 == code[N-4]){
          if(code[N-3]+2 == code[j]){
            keep = code[N-3];
            code[N-3] = code[j];
            code[j] = keep;
          }
        }
        else{
          if(code[N-3]+1 == code[j]){
            keep = code[N-3];
            code[N-3] = code[j];
            code[j] = keep;
          }
        }
      }
      count1=0; 
    }
    if(count2 == 6){
      for(j=N-3; j<N; j++){
        if(code[N-4]+1 == code[j]){
          keep = code[N-4];
          code[N-4] = code[j];
          code[j] = keep;
        }
      }
      for(j=N-3; j<N; j++){
        s_code[j-1] = code[j];
      }
      qsort(s_code, N-1, sizeof(int), int_comp);
      for(j=1; j<N; j++){
    code[j] = s_code[j-1];
      } 
      count2 = 0;
    }
    else{
      keep = code[N-2];
      code[N-2] = code[N-1];
      code[N-1] = keep;
    }
  }
  
  fclose(fp);

  return 0;
}


int int_comp(const void *_a, const void *_b)
{
  int a = *(int *)_a;
  int b = *(int *)_b;
  
  if (a < b) {
    return -1;
  } else if (a > b) {
    return 1;
  } else {
    return 0;
  }
}



しかし汎用性がなく、N=5などにしてしまうともうできなくなってしまいます。
理想としてはNの値を変えるだけでできるようなプログラムを作りたいのですが、どのように変更していけばいいのか、ご教授いただければ幸いです。
よろしくお願い致します。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:N個の数字の全並び方を出力するプログラム 27099 かずま 2006/06/07 20:48:10


No.27099

Re:N個の数字の全並び方を出力するプログラム
投稿者---かずま(2006/06/07 20:48:10)


> しかし汎用性がなく、N=5などにしてしまうともうできなくなってしまいます。
> 理想としてはNの値を変えるだけでできるようなプログラムを作りたいのですが、
> どのように変更していけばいいのか、

すみません。どのように変更していけばいいのかはすぐに思いつかないので、
別のプログラムを示します。
読んで理解してもらって、解説していただけるとうれしくなります。
短いプログラムだから大丈夫でしょう。
どうしても分からないところがあれば、質問していただくと、私が解説する
かもしれません。
#include <stdio.h>

#define N  100

int next_perm(int *a, int n)
{
    int r;
    for (r = n ; --r >= 0; ) {
        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; ) a[i-1] = a[i];
        a[n-1] = t;
    }
    return 0;
}

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

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



この投稿にコメントする

削除パスワード

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