配列の表示と組み合わせについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
lambo

配列の表示と組み合わせについて

#1

投稿記事 by lambo » 7年前

C言語で1~10の数字を使用し、[5][20]の配列内で数字を被ることなく全ての組み合わせを表示させるプログラムを組もうと考えているのですがどのようにすればいいのか分かりません。ご教授ください。

例としてはこのような感じです。
12345678910**********
*12345678910*********
**12345678910********
***12345678910*******
****12345678910******

*12345678910*********
**12345678910********
***12345678910*******
****12345678910******
*****12345678910*****


(*は空白の意)

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: 配列の表示と組み合わせについて

#2

投稿記事 by Dixq (管理人) » 7年前

出題内容がよくわかりません。
「全ての組み合わせ」とはどういうものですか?通常の順列組み合わせだと思えばいいのでしょうか?
要素20の文字が5組になっている関係性はどのようなものですか?

******12345678910****
*******12345678910***
********12345678910**
*********12345678910*
**********12345678910

ここまで行ったら次はどうなるんでしょうか?ループするのですか?

*******12345678910***
********12345678910**
*********12345678910*
**********12345678910
10**********123456789

*******12345678910**
********12345678910*
*********12345678910
10*********123456789
910*********12345678

こんな感じですか?
10だけ2文字なのがきになりますが、0じゃなく10ですか?

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: 配列の表示と組み合わせについて

#3

投稿記事 by Dixq (管理人) » 7年前

私が想像している仕様でしたらこんな感じでしょうか・・。

コード:

#include <stdio.h>

const static int NUM = 5;
const static int LEN = 20;

void displace(char arr[LEN]) {
    char tmp = arr[LEN-1];
    for (int i = LEN-1; i > 0; i--) {
        arr[i] = arr[i - 1];
    }
    arr[0] = tmp;
}

void initialize(char arr[NUM][LEN]) {
    char *str = "1234567890          ";
    for (int i = 0; i < NUM; i++) {
        for (int j = 0; j < LEN; j++) {
            arr[i][j] = str[j];
        }
    }
    for (int i = 0; i < NUM; i++) {
        for (int j = NUM - i; j < NUM; j++) {
            displace(arr[i]);
        }
    }
}

void show(char arr[NUM][LEN]) {
    for (int i = 0; i < NUM; i++) {
        for (int j = 0; j < LEN; j++) {
            printf("%c", arr[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int main() {
    char arr[NUM][LEN];
    initialize(arr);
    for (int s = 0; s < LEN; s++) {
        show(arr);
        for (int i = 0; i < NUM; i++) {
            displace(arr[i]);
        }
    }
}
実行結果

コード:

1234567890
 1234567890
  1234567890
   1234567890
    1234567890

 1234567890
  1234567890
   1234567890
    1234567890
     1234567890

  1234567890
   1234567890
    1234567890
     1234567890
      1234567890

   1234567890
    1234567890
     1234567890
      1234567890
       1234567890

    1234567890
     1234567890
      1234567890
       1234567890
        1234567890

     1234567890
      1234567890
       1234567890
        1234567890
         1234567890

      1234567890
       1234567890
        1234567890
         1234567890
          1234567890

       1234567890
        1234567890
         1234567890
          1234567890
0          123456789

        1234567890
         1234567890
          1234567890
0          123456789
90          12345678

         1234567890
          1234567890
0          123456789
90          12345678
890          1234567

          1234567890
0          123456789
90          12345678
890          1234567
7890          123456

0          123456789
90          12345678
890          1234567
7890          123456
67890          12345

90          12345678
890          1234567
7890          123456
67890          12345
567890          1234

890          1234567
7890          123456
67890          12345
567890          1234
4567890          123

7890          123456
67890          12345
567890          1234
4567890          123
34567890          12

67890          12345
567890          1234
4567890          123
34567890          12
234567890          1

567890          1234
4567890          123
34567890          12
234567890          1
1234567890

4567890          123
34567890          12
234567890          1
1234567890
 1234567890

34567890          12
234567890          1
1234567890
 1234567890
  1234567890

234567890          1
1234567890
 1234567890
  1234567890
   1234567890

かずま

Re: 配列の表示と組み合わせについて

#4

投稿記事 by かずま » 7年前

Dixq (管理人) さんが書きました:私が想像している仕様でしたらこんな感じでしょうか・・。
表示が規則正しいものなので、内部で配列を持た
なくてもよければ、これで済んでしまいます。

コード:

#include <stdio.h>

int main(void)
{
    const char *s = "1234567890          ";
    for (int i = 21; --i > 0; putchar('\n'))
        for (int k = i, j = 5; --j >= 0; --k < 0 && (k += 20))
            printf("%s%.*s\n", s + k, k, s); 
}

返信

“C言語何でも質問掲示板” へ戻る