Удалить из массива все элементы, встречающиеся более двух раз - C (СИ) (72205)
Формулировка задачи:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int m[n];
for (int i=0;i<n;i++) scanf("%d",&m[i]);
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
if (m[i]==m[j]){
for (int k=0;k<n;k++)
if(m[i]==m[k]){
int l=k;
for(l;l<n;l++){
m[l]=m[l+1];
}
n=n-1;
}
}
for(int i=0;i<n;i++) printf("%d ",m[i]);
system("PAUSE");
return 0;
}Решение задачи: «Удалить из массива все элементы, встречающиеся более двух раз»
int main()
{
int n;
scanf("%d",&n);
// В стандартом C нельзя объявлять переменные после исполняемых операторов
// И так массивы объявлять нельзя.
int m[n];
for (int i=0;i<n;i++) scanf("%d",&m[i]);
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
if (m[i]==m[j]){
for (int k=0;k<n;k++)
if(m[i]==m[k]){
int l=k;
for(l;l<n;l++){
m[l]=m[l+1];
}
n=n-1;
}
}
for(int i=0;i<n;i++) printf("%d ",m[i]);
system("PAUSE");
return 0;
}
Объяснение кода листинга программы
В этом коде сначала запрашивается размер массива (n) и затем создается массив m размером n. Затем в цикле происходит чтение n чисел и запись их в массив m. Далее начинается процесс удаления дубликатов. В цикле два внутренних цикла сравнивают каждый элемент массива с каждым другим элементом. Если находятся одинаковые числа, то во внутреннем цикле (с k) начинается процесс переноса всех элементов (начиная с k+1), пока не будет найден элемент, который не равен текущему. Затем во внутреннем цикле (с l) элементы массива сдвигаются на одну позицию вправо, начиная с нуля, и при этом удаляется последний элемент массива (т.е. его длина уменьшается на 1). В конце программы выводится на экран полученный массив. Код не оптимален, и на больших массивах может работать медленно, так как имеет квадратичную сложность.