teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

コードの改良

2020/04/23 07:28

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -95,5 +95,10 @@
95
95
 
96
96
  **追記2**
97
97
  上記のコードにはバグがありました。調査します。
98
+
98
99
  **追記3**
99
- j < n を j < N に修正しました。
100
+ j < n を j < N に修正しました。
101
+
102
+ **追記4**
103
+ 関数 generate の中の if (c == k) return; は、ここではなく、
104
+ 再帰呼出しの generate(i + 2); の直後に置いたほうが、効率が良くなります。

4

バグの修正

2020/04/23 07:27

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -68,7 +68,7 @@
68
68
  }
69
69
  }
70
70
  else {
71
- for (int j = i + 1; j < n; j++) {
71
+ for (int j = i + 1; j < N; j++) {
72
72
  int t = a[j];
73
73
  for (int k = j - 1; k > i; k--) a[k + 1] = a[k];
74
74
  a[i + 1] = t;
@@ -94,4 +94,6 @@
94
94
  ```
95
95
 
96
96
  **追記2**
97
- 上記のコードにはバグがありました。調査します。
97
+ 上記のコードにはバグがありました。調査します。
98
+ **追記3**
99
+ j < n を j < N に修正しました。

3

バグ発見

2020/04/23 02:03

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -91,4 +91,7 @@
91
91
  generate(0);
92
92
  }
93
93
  }
94
- ```
94
+ ```
95
+
96
+ **追記2**
97
+ 上記のコードにはバグがありました。調査します。

2

回答を追加

2020/04/23 01:57

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -39,4 +39,56 @@
39
39
  }
40
40
  ```
41
41
  n が大きい時は、表示に時間がかかるので、次のようにファイルに出力しましょう。
42
- $ echo 14 | ./a.out > result.txt
42
+ $ echo 14 | ./a.out > result.txt
43
+
44
+ **追記**
45
+ 意味が分かりました。
46
+ ```C
47
+ #include <stdio.h>
48
+
49
+ #define N 68
50
+
51
+ int k; // 繰返し回数(kaisu)
52
+ int n; // 要素の番号(number)
53
+ int c; // 生成個数(count)
54
+ int a[N]; // 要素の列(array)
55
+
56
+ void generate(int i)
57
+ {
58
+ if (c == k) return;
59
+ if (i == N) {
60
+ if (++c == k) {
61
+ int p; // ペアの相手
62
+ for (i = 0; i < N; i += 2) {
63
+ printf(" (%d,%d)", a[i], a[i + 1]);
64
+ if (a[i + 1] == n) p = a[i];
65
+ else if (a[i] == n) p = a[ i + 1];
66
+ }
67
+ printf("\n %d の相手は %d\n\n", n, p);
68
+ }
69
+ }
70
+ else {
71
+ for (int j = i + 1; j < n; j++) {
72
+ int t = a[j];
73
+ for (int k = j - 1; k > i; k--) a[k + 1] = a[k];
74
+ a[i + 1] = t;
75
+ generate(i + 2);
76
+ for (int k = i + 1; k < j; k++) a[k] = a[k + 1];
77
+ a[j] = t;
78
+ }
79
+ }
80
+ }
81
+
82
+ int main(void)
83
+ {
84
+ while (1) {
85
+ printf("繰返し回数: ");
86
+ if (scanf("%d", &k) != 1) return 1;
87
+ printf("要素の番号: ");
88
+ if (scanf("%d", &n) != 1 || n < 1 || n > N) return 2;
89
+ for (int i = 0; i < N; i++) a[i] = i + 1;
90
+ c = 0;
91
+ generate(0);
92
+ }
93
+ }
94
+ ```

1

for文の修正

2020/04/23 01:45

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -21,7 +21,7 @@
21
21
  else {
22
22
  for (int j = i + 1; j < n; j++) {
23
23
  int t = a[j];
24
- for (int k = j; k > i + 1; k--) a[k] = a[k - 1];
24
+ for (int k = j - 1; k > i; k--) a[k + 1] = a[k];
25
25
  a[i + 1] = t;
26
26
  generate(i + 2);
27
27
  for (int k = i + 1; k < j; k++) a[k] = a[k + 1];