回答編集履歴

3

重複除去とソートの話を追記

2021/01/29 08:59

投稿

fana
fana

スコア11990

test CHANGED
@@ -149,3 +149,69 @@
149
149
  printf( "\n" );
150
150
 
151
151
  ```
152
+
153
+
154
+
155
+ ---
156
+
157
+
158
+
159
+ 値の種類が少ないことを利用すれば,「重複を除去して昇順に」の話も同じ考えでやれる.
160
+
161
+
162
+
163
+ ```C++
164
+
165
+ #define ARRAY_SIZE 10
166
+
167
+
168
+
169
+ int main(void)
170
+
171
+ {
172
+
173
+ //元の配列
174
+
175
+ const int SrcArray[ARRAY_SIZE] = { 5, 8, 4, 3, 7, 9, 7, 9, 5, 1 };
176
+
177
+ //結果配列用
178
+
179
+ int ResultArraySize = 0;
180
+
181
+ int ResultArray[ARRAY_SIZE] = { 0,0,0,0,0, 0,0,0,0,0 };
182
+
183
+
184
+
185
+ //1~10の各値が元の配列に存在するか調べる
186
+
187
+ unsigned char CheckResult[10] = { 0,0,0,0,0, 0,0,0,0,0 };
188
+
189
+ for( int i=0; i<ARRAY_SIZE; ++i ){ CheckResult[ SrcArray[i]-1 ] = 1; }
190
+
191
+ //調べた結果から,結果配列を作る
192
+
193
+ for( int i=0; i<10; ++i )
194
+
195
+ {
196
+
197
+ if( CheckResult[i] ){ ResultArray[ ResultArraySize++ ] = i+1; }
198
+
199
+ }
200
+
201
+
202
+
203
+ //結果表示
204
+
205
+ printf( "重複を取り除いてソートした結果(%d 個になった)\n", ResultArraySize );
206
+
207
+ for( int i=0; i<ResultArraySize; ++i ){ printf( "%d ", ResultArray[i] ); }
208
+
209
+ printf( "\n" );
210
+
211
+
212
+
213
+ return 0;
214
+
215
+ }
216
+
217
+ ```

2

bitがどうのを使わないパターンを追加

2021/01/29 08:58

投稿

fana
fana

スコア11990

test CHANGED
@@ -95,3 +95,57 @@
95
95
  }
96
96
 
97
97
  ```
98
+
99
+
100
+
101
+ 「bitがどうの」的な話が嫌なら,
102
+
103
+ 配列1の調査結果と配列2の調査結果を別個に持てばいい.
104
+
105
+ 調査結果データの表現方法が異なるだけで,やってることは一緒.
106
+
107
+
108
+
109
+ ```C++
110
+
111
+ //調べる処理
112
+
113
+ unsigned char CheckResult1[10] = { 0,0,0,0,0, 0,0,0,0,0 };
114
+
115
+ unsigned char CheckResult2[10] = { 0,0,0,0,0, 0,0,0,0,0 };
116
+
117
+ for( int i=0; i<ARRAY1_SIZE; ++i ){ CheckResult1[ Array1[i]-1 ] = 1; }
118
+
119
+ for( int i=0; i<ARRAY2_SIZE; ++i ){ CheckResult2[ Array2[i]-1 ] = 1; }
120
+
121
+
122
+
123
+ //結果表示
124
+
125
+ printf( "共通 : " );
126
+
127
+ for( int i=0; i<10; ++i )
128
+
129
+ {
130
+
131
+ if( CheckResult1[i] && CheckResult2[i] ){ printf( "%d ", i+1 ); }
132
+
133
+ }
134
+
135
+ printf( "\n" );
136
+
137
+
138
+
139
+ printf( "どっちかにある : " );
140
+
141
+ for( int i=0; i<10; ++i )
142
+
143
+ {
144
+
145
+ if( CheckResult1[i] || CheckResult2[i] ){ printf( "%d ", i+1 ); }
146
+
147
+ }
148
+
149
+ printf( "\n" );
150
+
151
+ ```

1

コード例追記

2021/01/29 08:45

投稿

fana
fana

スコア11990

test CHANGED
@@ -19,3 +19,79 @@
19
19
  unsigned char CheckFlag[10] = { 0,0,0,0,0, 0,0,0,0,0 };
20
20
 
21
21
  ```
22
+
23
+
24
+
25
+ ---
26
+
27
+
28
+
29
+ こんな感じで.
30
+
31
+
32
+
33
+ ```C++
34
+
35
+ #define ARRAY1_SIZE 10
36
+
37
+ #define ARRAY2_SIZE 10
38
+
39
+
40
+
41
+ int main(void)
42
+
43
+ {
44
+
45
+ //配列1と配列2
46
+
47
+ const int Array1[ARRAY1_SIZE] = { 5, 8, 4, 3, 7, 9, 7, 9, 5, 1 };
48
+
49
+ const int Array2[ARRAY2_SIZE] = { 7, 6, 1, 5, 9, 9, 10, 8, 4, 3 };
50
+
51
+
52
+
53
+ //調べる処理
54
+
55
+ unsigned char CheckFlag[10] = { 0,0,0,0,0, 0,0,0,0,0 };
56
+
57
+ for( int i=0; i<ARRAY1_SIZE; ++i ){ CheckFlag[ Array1[i]-1 ] |= 0x01; }
58
+
59
+ for( int i=0; i<ARRAY2_SIZE; ++i ){ CheckFlag[ Array2[i]-1 ] |= 0x02; }
60
+
61
+
62
+
63
+ //結果表示
64
+
65
+ printf( "共通 : " );
66
+
67
+ for( int i=0; i<10; ++i )
68
+
69
+ {
70
+
71
+ if( CheckFlag[i]==0x03 ){ printf( "%d ", i+1 ); }
72
+
73
+ }
74
+
75
+ printf( "\n" );
76
+
77
+
78
+
79
+ printf( "どっちかにある : " );
80
+
81
+ for( int i=0; i<10; ++i )
82
+
83
+ {
84
+
85
+ if( CheckFlag[i] ){ printf( "%d ", i+1 ); }
86
+
87
+ }
88
+
89
+ printf( "\n" );
90
+
91
+
92
+
93
+ return 0;
94
+
95
+ }
96
+
97
+ ```