Удалить из массива все элементы, встречающиеся более двух раз - C (СИ) (71944)
Формулировка задачи:
Условие задачи описано ниже, помогите пж найти ошибку в коде
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
/**
9. Дан целочисленный массив размера N. Удалить из массива все элементы, встречающиеся более двух раз,
и вывести размер полученного массива и его содержимое.
**/
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int n,i,j;
printf("Введите размер массива: ");
scanf("%d",&n);
int arr[n];
for(i=0;i<n;i++)
{
printf("A[%d]=",i);
scanf("%d",&arr[i]);
}
i=0;
while (i<n)
{
int k=1,p;
for (j=i+1;j<=n;j++)
{
if (arr[j]==arr[i])
k++;
}
if (k>2)
{
j=i;
int x=arr[i];
while (j<n-1)
{
if (arr[j]==x)
{
for (p=j;p<=n;p++)
{
arr[p]=arr[p+1];
n--;
}
}
else
j++;
}
}
else
i++;
}
if (n==0)
printf("Все элементы удалены");
else
{
printf("\n");
printf("Количество оставшихся элементов: %d",n);
printf("\n");
printf("Массив после сжатия: ");
for (i=0;i<n;i++)
printf("%d ",arr[i]);
}
return 0;
}Решение задачи: «Удалить из массива все элементы, встречающиеся более двух раз»
textual
Листинг программы
#include <stdio.h>
int pack(int arr[], const int size) {
int offs = 0, i, j, k, cnt;
for (i = 1; i < size; ++i) {
cnt = 0;
k = i - offs;
for (j = k - 1; 0 <= j; --j) {
cnt += (arr[i] == arr[j]);
}
if (cnt < 2) {
arr[k] = arr[i];
} else {
offs++;
}
}
return size - offs;
}
void print(const int arr[], const int size) {
if (0 < size) {
printf("%d ", *arr);
print(arr + 1, size - 1);
}
}
int main() {
int arr[] = {1, 3, 1, 1, 1, 2, 1, 2, 3, 1, 1, 2, 3, 3, 2, 3, 3, 3};
int size = sizeof(arr) / sizeof(*arr);
print(arr, size); putchar('\n');
size = pack(arr, size);
print(arr, size); putchar('\n');
return 0;
}
Объяснение кода листинга программы
- В функции pack() удаляются все элементы массива, которые встречаются более двух раз.
- В функции main() создается массив arr[] и инициализируется значениями.
- Размер массива arr[] хранится в переменной size.
- Функция print() выводит элементы массива на экран.
- В функции main() сначала выводится исходный массив на экран, затем вызывается функция pack(), которая удаляет повторяющиеся элементы, и после этого выводится измененный массив на экран.
- Результатом работы программы будет вывод на экран исходного массива, а затем массива без повторяющихся элементов.