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

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

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

Все массивы создаются динамически. Ввод и вывод массива осуществлять в одну строку. Серия - последовательность одинаковых элементов в массиве. Один элемент - это тоже серия длиной равной единице. Под удалением элементов из массива следует понимать изменение размера массива посредством изменения переменной, хранящей размер массива (например, n), а не создание нового массива. Задан целочисленный массив размера N. Удалить из массива все элементы, встречающиеся более двух раз. И второй вопрос: Вычислить сумму ряда (приближенное значение функции ln для |x|<1) с точностью eps. Значения x и eps вводятся с клавиатуры. Полученный результат и значение библиотечной функции ln вывести на экран.
Вот что сам смог по первому, но не работает как нужно
#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 j = i + 1 и k = j + 1 все равно появляются лишние значения

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

textual
Листинг программы
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). В конце программы выводится на экран полученный массив. Код не оптимален, и на больших массивах может работать медленно, так как имеет квадратичную сложность.

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


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

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

8   голосов , оценка 4.125 из 5
Похожие ответы