peko さんが書きました:int a[20]={0,2,20,14,40,5,3,1,16,0,44,6,10,0,7,15,10,16,0,8};
ソート後
int a[20]={0,2,20,14,40,5,3,1,16,6,10,7,15,10,8,0,0,0,0};
ソート後の個数が 19 になっていますよ。
すみません。質問の値が間違っていました。
44 が 2つ。すなわち、40以上の値が 3個ある場合
について質問しているつもりでした。
int a[20]={0,2,20,14,
40,5,3,1,
16,0,
44,6,10,0,7,15,
44,
16,0,8};
重複または 40以上の値が 3個ある場合、
2個目だけを 0 に変え、3個目は残すんですか?
それとも、3個目も 0 に変えるんですか?
また、0 に変えるといっても、
その変えた 0 は最後に持っていくんだから、
単に 2個目以降の重複したものを削除し、
後ろに 0 を追加する、でいいのですか?
次のプログラムでいいんでしょうか?
コード:
#include <stdio.h>
int main(void)
{
int a[20] = {0,2,20,14,40,5,3,1,16,0,44,6,10,0,7,15,44,16,0,8};
int i, j, k;
int has40 = 0;
for (i = 0; i < 20; i++)
printf(i ? ",%d" : "%d", a[i]);
putchar('\n');
for (j = i = 1; i < 20; i++) {
int copy = 1;
if (a[i] == 0) copy = 0; // 0 はコピーしない
if (a[i] >= 40) {
if (has40) copy = 0; // 40以上は既にあるのでコピーしない
has40 = 1; // 40以上があった
}
else {
for (k = 0; k < i; k++)
if (a[i] == a[k]) break;
if (k < i) copy = 0; // 重複はコピーしない
}
if (copy) a[j++] = a[i]; // コピーする
}
while (j < 20)
a[j++] = 0;
for (i = 0; i < 20; i++)
printf(i ? ",%d" : "%d", a[i]); //並び替えた結果
putchar('\n');
return 0;
}
実行結果
コード:
0,2,20,14,40,5,3,1,16,0,44,6,10,0,7,15,44,16,0,8
0,2,20,14,40,5,3,1,16,6,10,7,15,8,0,0,0,0,0,0
continue を使うと copyフラグが要らなくなるんですが、
continue を使わないほうが初級者にはわかりやすい
と思って、このようにしました。