Удалить из массива все элементы, встречающиеся более двух раз - C (СИ) (72205)

Узнай цену своей работы

Формулировка задачи:

Все массивы создаются динамически. Ввод и вывод массива осуществлять в одну строку. Серия - последовательность одинаковых элементов в массиве. Один элемент - это тоже серия длиной равной единице. Под удалением элементов из массива следует понимать изменение размера массива посредством изменения переменной, хранящей размер массива (например, n), а не создание нового массива. Задан целочисленный массив размера N. Удалить из массива все элементы, встречающиеся более двух раз. И второй вопрос: Вычислить сумму ряда (приближенное значение функции ln для |x|<1) с точностью eps. Значения x и eps вводятся с клавиатуры. Полученный результат и значение библиотечной функции ln вывести на экран.
Вот что сам смог по первому, но не работает как нужно
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int n;
  6. scanf("%d",&n);
  7. int m[n];
  8. for (int i=0;i<n;i++) scanf("%d",&m[i]);
  9. for (int i=0;i<n;i++)
  10. for (int j=0;j<n;j++)
  11. if (m[i]==m[j]){
  12. for (int k=0;k<n;k++)
  13. if(m[i]==m[k]){
  14. int l=k;
  15. for(l;l<n;l++){
  16. m[l]=m[l+1];
  17. }
  18. n=n-1;
  19. }
  20. }
  21. for(int i=0;i<n;i++) printf("%d ",m[i]);
  22. system("PAUSE");
  23. return 0;
  24. }
И, да, если в цикле заменить на int j = i + 1 и k = j + 1 все равно появляются лишние значения

Решение задачи: «Удалить из массива все элементы, встречающиеся более двух раз»

textual
Листинг программы
  1. int main()
  2. {
  3.     int n;
  4.     scanf("%d",&n);
  5.      // В стандартом C нельзя объявлять переменные после исполняемых операторов
  6.      // И так массивы объявлять нельзя.
  7.     int m[n];
  8.     for (int i=0;i<n;i++) scanf("%d",&m[i]);
  9.     for (int i=0;i<n;i++)
  10.         for (int j=0;j<n;j++)
  11.             if (m[i]==m[j]){
  12.                 for (int k=0;k<n;k++)
  13.                     if(m[i]==m[k]){
  14.                         int l=k;
  15.                         for(l;l<n;l++){
  16.                             m[l]=m[l+1];
  17.                         }
  18.                         n=n-1;
  19.                     }
  20.             }
  21.     for(int i=0;i<n;i++) printf("%d ",m[i]);
  22.  
  23.     system("PAUSE");
  24.     return 0;
  25. }

Объяснение кода листинга программы

В этом коде сначала запрашивается размер массива (n) и затем создается массив m размером n. Затем в цикле происходит чтение n чисел и запись их в массив m. Далее начинается процесс удаления дубликатов. В цикле два внутренних цикла сравнивают каждый элемент массива с каждым другим элементом. Если находятся одинаковые числа, то во внутреннем цикле (с k) начинается процесс переноса всех элементов (начиная с k+1), пока не будет найден элемент, который не равен текущему. Затем во внутреннем цикле (с l) элементы массива сдвигаются на одну позицию вправо, начиная с нуля, и при этом удаляется последний элемент массива (т.е. его длина уменьшается на 1). В конце программы выводится на экран полученный массив. Код не оптимален, и на больших массивах может работать медленно, так как имеет квадратичную сложность.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы