回答編集履歴

5

コードの改良

2020/04/23 07:28

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -192,6 +192,16 @@
192
192
 
193
193
  上記のコードにはバグがありました。調査します。
194
194
 
195
+
196
+
195
197
  **追記3**
196
198
 
197
199
  j < n を j < N に修正しました。
200
+
201
+
202
+
203
+ **追記4**
204
+
205
+ 関数 generate の中の if (c == k) return; は、ここではなく、
206
+
207
+ 再帰呼出しの generate(i + 2); の直後に置いたほうが、効率が良くなります。

4

バグの修正

2020/04/23 07:27

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -138,7 +138,7 @@
138
138
 
139
139
  else {
140
140
 
141
- for (int j = i + 1; j < n; j++) {
141
+ for (int j = i + 1; j < N; j++) {
142
142
 
143
143
  int t = a[j];
144
144
 
@@ -191,3 +191,7 @@
191
191
  **追記2**
192
192
 
193
193
  上記のコードにはバグがありました。調査します。
194
+
195
+ **追記3**
196
+
197
+ j < n を j < N に修正しました。

3

バグ発見

2020/04/23 02:03

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -185,3 +185,9 @@
185
185
  }
186
186
 
187
187
  ```
188
+
189
+
190
+
191
+ **追記2**
192
+
193
+ 上記のコードにはバグがありました。調査します。

2

回答を追加

2020/04/23 01:57

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -81,3 +81,107 @@
81
81
  n が大きい時は、表示に時間がかかるので、次のようにファイルに出力しましょう。
82
82
 
83
83
  $ echo 14 | ./a.out > result.txt
84
+
85
+
86
+
87
+ **追記**
88
+
89
+ 意味が分かりました。
90
+
91
+ ```C
92
+
93
+ #include <stdio.h>
94
+
95
+
96
+
97
+ #define N 68
98
+
99
+
100
+
101
+ int k; // 繰返し回数(kaisu)
102
+
103
+ int n; // 要素の番号(number)
104
+
105
+ int c; // 生成個数(count)
106
+
107
+ int a[N]; // 要素の列(array)
108
+
109
+
110
+
111
+ void generate(int i)
112
+
113
+ {
114
+
115
+ if (c == k) return;
116
+
117
+ if (i == N) {
118
+
119
+ if (++c == k) {
120
+
121
+ int p; // ペアの相手
122
+
123
+ for (i = 0; i < N; i += 2) {
124
+
125
+ printf(" (%d,%d)", a[i], a[i + 1]);
126
+
127
+ if (a[i + 1] == n) p = a[i];
128
+
129
+ else if (a[i] == n) p = a[ i + 1];
130
+
131
+ }
132
+
133
+ printf("\n %d の相手は %d\n\n", n, p);
134
+
135
+ }
136
+
137
+ }
138
+
139
+ else {
140
+
141
+ for (int j = i + 1; j < n; j++) {
142
+
143
+ int t = a[j];
144
+
145
+ for (int k = j - 1; k > i; k--) a[k + 1] = a[k];
146
+
147
+ a[i + 1] = t;
148
+
149
+ generate(i + 2);
150
+
151
+ for (int k = i + 1; k < j; k++) a[k] = a[k + 1];
152
+
153
+ a[j] = t;
154
+
155
+ }
156
+
157
+ }
158
+
159
+ }
160
+
161
+
162
+
163
+ int main(void)
164
+
165
+ {
166
+
167
+ while (1) {
168
+
169
+ printf("繰返し回数: ");
170
+
171
+ if (scanf("%d", &k) != 1) return 1;
172
+
173
+ printf("要素の番号: ");
174
+
175
+ if (scanf("%d", &n) != 1 || n < 1 || n > N) return 2;
176
+
177
+ for (int i = 0; i < N; i++) a[i] = i + 1;
178
+
179
+ c = 0;
180
+
181
+ generate(0);
182
+
183
+ }
184
+
185
+ }
186
+
187
+ ```

1

for文の修正

2020/04/23 01:45

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -44,7 +44,7 @@
44
44
 
45
45
  int t = a[j];
46
46
 
47
- for (int k = j; k > i + 1; k--) a[k] = a[k - 1];
47
+ for (int k = j - 1; k > i; k--) a[k + 1] = a[k];
48
48
 
49
49
  a[i + 1] = t;
50
50