Предмет: Информатика, автор: Valery2020vs2021

Напишите программу которая выделяе в другой массив все элементы исходного массива,которые встречаются более одного раза,с++,не писать свой код,а изменить мой, учтите что тесты могут быть
5
1 1 1 1 1
И тогда программа должна вывести лишь одну единицу
5
1 2 2 1 3
Вывод
1 2


Valery2020vs2021: Вот именно,я про это и говорила,я не знаю какой иф написать,но если идти с конца то там будет проблемка если четное или нечётное количество чисел
stglupa: еще и циклы перебираешь i = 0 -> n и j = 0 -> n и сравниваешь элементы на i и j позициях, то есть каждый элемент ты сравниваешь с самим собой и удивляешься почему всегда равенство выдает))
Valery2020vs2021: Черт,не ту фотку выставила
Valery2020vs2021: Я ща новый вопрос задам
stglupa: Ну и наконец, у тебя цикл i до n, когда i достигнет значения (n-1), то зайдя в условие он будет сравнивать ar[n-1] и ar[n], которого не существует => получишь ошибку переполнения (segmentation fault)
stglupa: Так что тебе здесь не ошибка, а полностью неверное решение, начиная с логики, которое надо переписывать с нуля )
stglupa: у тебя*
Valery2020vs2021: Потом отправлю переделанное
stglupa: и почитай про асимптотический анализ алгоритма, полезно будет. Начнешь понимать почему для задачи с N < 10^5 решение, где фор в форе до N = смерть. Понимаю, что для 8-9 класса это будет не очень понятно, но если не вдаваться в детали, то там ничего сложного нет: просто подсчитываешь кол-во итераций, которые будет совершать твой алгоритм
stglupa: ладно, лови решение и как бонус код ревью от светила науки ))

Ответы

Автор ответа: Omikami
0

Ответ в прикрепленном файле.

Приложения:

Valery2020vs2021: Задача №112309. Выбрать повторяющиеся
Напишите программу, которая выделяет в другой массив все элементы исходного массива, которые встречаются более одного раза.

Входные данные
Первая строка содержит размер массива N . Во второй строке через пробел задаются N чисел – элементы массива. Гарантируется, что 0 < N ≤ 10000 .
Valery2020vs2021: Выходные данные
Программа должна вывести содержимое полученного массива: все элементы исходного массива, которые встречаются более одного раза, в том же порядке. Если таких нет, нужно вывести число 0.
Omikami: Уважаемые, школьники! Данный код является полностью авторским и каждый символ написан лично мной. Ваш же код со скриншота - полнейшая степень бездарности, которую "кодом" даже назвать нельзя. И редактировать то, что априори не работает и выглядит как мусор, никому не понравится.
Omikami: К тому же если вы уточняете задание в комментариях, а не непосредственно в вопросе - это сугубо ваши проблемы ;]
stglupa: Насчет бездарности и размытого тз солидарен) Ну ладно, судя по заданию, вряд ли они даже среднюю школу закончили, да и на программистов, думаю, они не пойдут, поэтому простительно. Только вот непонятно к чему было условие точечного изменения нерабочего кода...
Valery2020vs2021: Окей,мы учимся в 6классе
Valery2020vs2021: С++-как факультатив
Valery2020vs2021: И да, вектор ещё не проходили
Valery2020vs2021: Та девочка которая писала что код украл-моя подруга, одноклассница
Valery2020vs2021: Я ей сразу поверила,поэтому приношу извинения
Автор ответа: stglupa
1

Резюмирую:

1) Использование того, чего не понимаешь (6-8 строки)

2) Решение за O(N^2) при ограничении N < 10^5, что очень плохо

3) Нет проверки на выход за границы выделенной памяти (20, 22 строки)

4) Абсолютно неверная идея алгоритма: сравнивать только соседние элементы, да и еще и непонятно зачем делать во вложенном цикле + неверное написание тела цикла фор: полное непонимание того, как он работает и что делает

5) Нет проверки на то, использовали мы конкретное число уже или нет

Итог: полностью неверное решение, которое надо не менять, а стирать и переделывать.

Возможное решение на сотку:

#include <iostream>

#include <vector>

#include <map>

using namespace std;

signed main() {

   map<int, int> cnt;

   int n;

   cin >> n;

   vector<int> a(n), res;

   for(auto &i: a){

       cin >> i;

       cnt[i]++;

   }

   for(auto &i: a){

       if(cnt[i] > 1) res.push_back(i);

       cnt[i] = 0;

   }

   if(res.empty()) cout << 0;

   else for(auto &i: res) cout << i << " ";

}

P.S. Если что непонятно, то спрашивай - распишу поминутно кто где того самого


Valery2020vs2021: Вечером напишу на сколько пройдет
Похожие вопросы
Предмет: Другие предметы, автор: АлисаКиска1