ページ 1 / 1
配列の表示と組み合わせについて
Posted: 2017年11月15日(水) 13:21
by lambo
C言語で1~10の数字を使用し、[5][20]の配列内で数字を被ることなく全ての組み合わせを表示させるプログラムを組もうと考えているのですがどのようにすればいいのか分かりません。ご教授ください。
例としてはこのような感じです。
12345678910**********
*12345678910*********
**12345678910********
***12345678910*******
****12345678910******
*12345678910*********
**12345678910********
***12345678910*******
****12345678910******
*****12345678910*****
…
(*は空白の意)
Re: 配列の表示と組み合わせについて
Posted: 2017年11月15日(水) 21:41
by Dixq (管理人)
出題内容がよくわかりません。
「全ての組み合わせ」とはどういうものですか?通常の順列組み合わせだと思えばいいのでしょうか?
要素20の文字が5組になっている関係性はどのようなものですか?
******12345678910****
*******12345678910***
********12345678910**
*********12345678910*
**********12345678910
ここまで行ったら次はどうなるんでしょうか?ループするのですか?
*******12345678910***
********12345678910**
*********12345678910*
**********12345678910
10**********123456789
*******12345678910**
********12345678910*
*********12345678910
10*********123456789
910*********12345678
こんな感じですか?
10だけ2文字なのがきになりますが、0じゃなく10ですか?
Re: 配列の表示と組み合わせについて
Posted: 2017年11月15日(水) 22:01
by Dixq (管理人)
私が想像している仕様でしたらこんな感じでしょうか・・。
コード:
#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: 配列の表示と組み合わせについて
Posted: 2017年11月23日(木) 03:52
by かずま
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);
}