Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562

Способы нахождения повторяющихся чисел в массиве?

05.02.2017, 16:27. Показов 7410. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Одна из задач, составить программу, которая позволяет одинаковые числа в массиве.
По моей логике - должна работать, но не работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <clocale>
        using namespace std;
            
        
            int main (){
 
                setlocale(LC_ALL, "rus");
                int arr[5] = {1,2,2,3,2}; // Массив с числами.
                int brr[5] = {0,0,0,0,0}; // Массив для чисел, которые повторились два и более раз.
                int crr[5] = {0,0,0,0,0}; // Массив для храния значение сколько раз повторилось число.
 
                int cell (0), bell (0), dell (0);
                /*
                cell - изменяемая переменная, 
                bell - счетчик повторов.
                dell - переменная, которая служит за записи повтояющего числа в массив.
 
                Принцип действия:
                В цикле создается вложенный цикл. Переменная cell сравнивается с массивом arr.
                Если выполняется первое условие, то переменная bell += 1. Больше данное условие работать не должно.
                Если выполняется второе условие, то переменная bell += 1, значения записывается в массив brr и crr, согласно
                номеру переменной dell.,
                После окончания вложенное цикла, переменная:
                cell ++;
                bell = 0;
                dell ++;
                После чего выводим отдельным циклом полученные результаты.
 
                */
 
                    for (int i(0); i!= 5; i++){ // Цикл
                        for  (int j(0); j != 5; j++){ // Вложенный цикл.
 
                            if (cell == arr[j] && bell == 0){ // Условие должно выполняться только один раз.
                                bell ++; // Увеличиваем переменную на еденицу.
                            }
 
                            if (cell == arr[i] && bell != 0){ // Условие должно выполняться,если число в массиве повторяется повторно.
                                bell ++; // Увеличиваем переменную на еденицу.
                                brr[dell] = cell; // Записываем число в заданную ячейку массива для чисел.
                                crr[dell] = bell; // Записываем число в заданную ячейку массива для счетчика.
 
                            }
                        } // Конец вложенного цикла.
 
                        cell ++; // Увеличиваем переменную на еденицу при каждом повторе цикла
                        bell = 0; // Обнуляем счетчик повтора чисел.
                        dell ++; // При следующем цикле, ячейка для записи сдвинется на еденицу.
                    }
 
        // Цикл для вывода информации.
                    for (int i(0); i!=5; i++){
                        
                        cout << "Число: " << brr[i] << " повторилось: " << crr[i] << endl;
                    
                }
        
                    
            system ("pause");
            return 0;
 
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2017, 16:27
Ответы с готовыми решениями:

Удаление повторяющихся чисел в массиве
удалить в массиве все числа которые повторяются более двух раз

Количество различных(не повторяющихся) чисел, в массиве.
Найдите номера строк целочисленной матрицы в которой: а) на всех нечет позициях стоят нули б) на нечет позициях встречаются нули ...

Найти количество повторяющихся чисел в массиве
Решите пж задачку :-) В заданном одномерном массиве из n элементов найти количество повторяющихся чисел. На языке Си

25
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
05.02.2017, 16:39
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for(i=j=0; i < 5; i++) {
  for(m=0; m<j; m++)
       if (brr[m]==arr[i]) break;  // уже подсчитано
  if (m < j) continue;
  for(k=i+1; k<5; k++) {
    if (arr[i] == arr[k]) {
       if (crr[j]==0) { brr[j] = arr[i]; crr[j]=2; }
       else crr[j]++;
    }
  } 
   if (crr[j]) j++;
}
// j - количество повторяющихся
Вот, как-то так.
1
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
05.02.2017, 19:55  [ТС]
Спасибо, но что-то не понятно, откуда ноги растут)
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
05.02.2017, 20:13

Не по теме:

Цитата Сообщение от Photofenix Посмотреть сообщение
откуда ноги растут)
Ну, это я вам по секрету как-нибудь расскажу:)


А что именно непонятно? Я не стал анализировать ваш код, хотя он, безусловно, заслуживает всяческого уважения.
А алгоритм достаточно прост.
j - счетчик заполненных элементов списка повторов (brr, crr)
Беру очередной элемент массива arr. Проверяю, не был ли он уже "дублем" (строки 2-3)
Если был (m < j) - continue - беру следующий.
стр 5-10 - просматриваю массив вперед в поисках повтора текущего arr[i]
Повтор есть? (с.6) Он первый? (7) Заношу в списки brr - сам элемент, crr - двойку
Не первый?(8) счетчик повторов ++
Если повторы этого элемента были - увеличиваю счетчик j++ (11)
Удачи!

Добавлено через 1 минуту
ЗЫ. В коде возможны ошибки. Я не проверял - просто изложил идею.
1
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
05.02.2017, 20:47
Более оптимально использовать хэш-таблицу для поиска.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int* arr;
// вводим
std::unordered_map<int,int> nums;
for(size_t i = 0; i<n; ++i){
  if (nums.find(arr[i])!=nums.end()){
    nums.insert(std::make_pair(arr[i],1));
  }
  else{
     ++nums[arr[i]];
  }
}
for (auto p:nums){
  if(p.second>1)
  { 
     // выводим p.first - само число; p.second - количество.
   }
}
В чём преимущество перед вариантом пользователя Байт? В том, что алгоритмическая сложность O(n) против O(n^2). Правда, нужен std.
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
05.02.2017, 21:07
New man, строки 5-8 лишние.
достаточно:
C++
1
2
for(size_t i = 0; i<n; ++i)
    nums[arr[i]]++;
1
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
05.02.2017, 21:38
Это уже тонкости, которые трудно запомнить и которые отличаются в разных реализациях хэш-таблиц.
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
05.02.2017, 22:06
Лучший ответ Сообщение было отмечено Photofenix как решение

Решение

Цитата Сообщение от New man Посмотреть сообщение
и которые отличаются в разных реализациях хэш-таблиц
Если вы о разных реализациях std::unordered_map то это неправда.

Добавлено через 4 минуты
Цитата Сообщение от New man Посмотреть сообщение
Это уже тонкости
Программирование состоит из тонкостей чуть менее чем полностью.
2
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
05.02.2017, 22:09  [ТС]
К сожалению сегодня уже нет сил разбираться в коде. Про то, что программирование состоит из нюансов - согласен полностью!
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
05.02.2017, 22:36
Цитата Сообщение от avgoor Посмотреть сообщение
Если вы о разных реализациях std::unordered_map то это неправда.
Нет. Я про dict в Python, HashMap в Java, Dictionary в C#, TMap во фреймворке от Unreal Engine. Вы мне предлагаете запомнить нюансы каждого из них? Гораздо важнее знать, какие у этих вещей производительность.

Цитата Сообщение от avgoor Посмотреть сообщение
Программирование состоит из тонкостей чуть менее чем полностью.
Не соглашусь. В тонкости приходится лезть лишь тогда, когда вылезают баги или нужно что-то оптимизировать прямо очень сильно. Ну, и держать всё это в уме можно лишь тогда, когда работаешь с этой технологией на текущем проекте.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
05.02.2017, 23:29
Цитата Сообщение от New man Посмотреть сообщение
Я про dict в Python, HashMap в Java, Dictionary в C#, TMap во фреймворке от Unreal Engine. Вы мне предлагаете запомнить нюансы каждого из них?
Именно так. Потому, что того кто считает, что если он "асилил" QuckStart по языку - то он знает язык, принято называть быдлокодером.
Цитата Сообщение от New man Посмотреть сообщение
В тонкости приходится лезть лишь тогда, когда вылезают баги или
Ну и? Вы сами написали, что если не вникать в тонкости - вылезают баги. Логично ли, что если тонкости знать заранее - багов будет меньше?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
05.02.2017, 23:41
Цитата Сообщение от avgoor Посмотреть сообщение
если не вникать в тонкости - вылезают баги.
Можно мне 5 копеек?
Вы совершенно правы. Если вы пользуетесь инструментом, надо знать все ньюансы его использования. А то возьмешь в руки "болгарку" - она тебе пол ноги отпилит. Были случаи у нас в деревне.
И я пошел другим путем. Если нет особой нужды, я пользуюсь тем инструментом, к которому привык. Который знаю досконально со всеми тонкостями. Продолжая метафору - беру ножовку. Конечно, не всегда, но часто такой подход себя оправдывает. И ноги целы, и башка не трещит.
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
06.02.2017, 00:13
Цитата Сообщение от avgoor Посмотреть сообщение
Потому, что того кто считает, что если он "асилил" QuckStart по языку - то он знает язык, принято называть быдлокодером.
Учить языки не нужно. Нужно учить более важные вещи: алгоритмы, паттерны и прочее. Да хоть особенности фреймворков, например. Вот, к примеру, рассмотрим мой код, написанный выше. Он перестал быть рабочим и эффективным из-за того, что я не знаю, что оператор [] инициализирует пустой элемент в unordered_map? Язык - это лишь средство.
Цитата Сообщение от avgoor Посмотреть сообщение
Вы сами написали, что если не вникать в тонкости - вылезают баги. Логично ли, что если тонкости знать заранее - багов будет меньше?
А в чём проблема? Юнит-тесты такие баги отлавливают на ура.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
06.02.2017, 00:26
Цитата Сообщение от New man Посмотреть сообщение
Учить языки не нужно.
Ну, выше junior-а и не подниметесь.
Цитата Сообщение от New man Посмотреть сообщение
Вот, к примеру, рассмотрим мой код, написанный выше. Он перестал быть рабочим и эффективным из-за того, что я не знаю, что оператор [] инициализирует пустой элемент в unordered_map?
Искать элемент 2 раза вместо одного эффективно?
Цитата Сообщение от New man Посмотреть сообщение
Вы мне предлагаете запомнить нюансы каждого из них?
Гордиться незнанием принято в школе. Даже в нормальном вузе это уже моветон.
Сказав подобную фразу своему начальнику вы получите волшебный пендель. Первый раз в сторону изучения (так иди и запоминай). Второй раз на улицу.
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
06.02.2017, 00:37
Цитата Сообщение от avgoor Посмотреть сообщение
Искать элемент 2 раза вместо одного эффективно?
Асимптотически это одно и то же, так что да.
Цитата Сообщение от avgoor Посмотреть сообщение
Сказав подобную фразу своему начальнику вы получите волшебный пендель.
Вот тогда, когда я буду у Вас работать, это будет меня интересовать. А пока мне нормально живётся.

Цитата Сообщение от avgoor Посмотреть сообщение
Гордиться незнанием принято в школе.
Я не горжусь тем, что не знаю деталей реализации классов std. Я говорю, что это не нужно.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
06.02.2017, 01:22
Цитата Сообщение от New man Посмотреть сообщение
Вот тогда, когда я буду у Вас работать
Пока так рассуждаете, не будете.
Цитата Сообщение от New man Посмотреть сообщение
Асимптотически это одно и то же, так что да
Цитата Сообщение от New man Посмотреть сообщение
Я говорю, что это не нужно.
Цитата Сообщение от avgoor Посмотреть сообщение
Ну, выше junior-а и не подниметесь.
0
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
07.02.2017, 19:08  [ТС]
В общем написал я код на повторяющиеся числа. Код работает точно и подсчитывает количество повторений каждого числа. Хочется просто узнать, совсем я нуб нубовый, или уже что-то могу
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
    using namespace std;
        
        int main (){
 
    
        int arra[10]; // Массив на 10 значений.. Первая строка отвечат за случайные значения. Вторая за значения счетчика.
    
                for (int i (0); i != 10; i++){ // Вводим значения с клавы..
                    cin >> arra[i];
                }
 
                int max = arra[0]; // Переменная максимального числа.
 
                for (int i(0); i !=10; i++){ // Цикл для поиска максимального числа в массиве.
                    if (max < arra[i]){
                        max = arra[i];
                    }
                }
                max += 1; // Прибавляем к максимальному числу еденицу.
                // Создаем одномерный динамический массив..
                int *terra = new int [max];
    
 
                //---------------------------------------------
                                for (int i(0); i!=max; i++){ // обнуляем массив для счетчика.
                                        terra[i] = 0;
                                }
 
                // ------------------------------------------- 
                                for (int i(0); i != max; i++){ 
                                        int count (0); // Счетчик
                                            for (int j(0); j != max; j++){
                                                if(i == arra[j]){ // Если индекс цикла совпадаем с числом в массиве, выполняется искреминация счетчика.
                                                    count ++;
                                                    terra[i] = count;
                                                }
                                            }
                                        }
                
                for (int i(0); i != max; i++){
 
                    cout << i << " - " << terra[i] << endl;
 
                }
 
                delete [] terra; // Удаляем динамический массив.
 
            system ("pause");
            return 0;
 
        }
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.02.2017, 19:37
Лучший ответ Сообщение было отмечено Photofenix как решение

Решение

Цитата Сообщение от Photofenix Посмотреть сообщение
уже что-то могу
Уже чего-то могешь Но почивать на лаврах рановато. Вот легкая модификация твоего кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
    using namespace std;
int main ()
{
        int arra[10]; // Массив на 10 значений..
        for (int i (0); i != 10; i++){ // Вводим значения с клавы..
                    cin >> arra[i];
        }
         int max = arra[0]; // Переменная максимального числа.
         for (int i(0); i<10; i++) { // Цикл для поиска максимального числа в массиве.
                    if (max < arra[i]){
                        max = arra[i];
                    }
         }
          max += 1; // Прибавляем к максимальному числу еденицу.
                // Создаем одномерный динамический массив..
          int *terra = new int [max];
          for (int i(0); i<max; i++)  { // обнуляем массив для счетчика.
                terra[i] = 0;
          }
          for (int i(0); i <10; i++)
              if (arr[i]>=0 terra[arr[i]] ++;
                
          for (int i(0); i <max; i++) {
               cout << i << " - " << terra[i] << endl;
          }
          delete [] terra; // Удаляем динамический массив.
          system ("pause");
          return 0;
}
Чуток переформатировал, чтобы мне смотреть было приятнее. Лишнее убрал.
Но еще надо поговорить по-поводу самого подхода. Однако, жена зовет по хозяйству помогать
1
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
07.02.2017, 19:47  [ТС]
Понимаю, что мне еще далеко до профессионала
Хотя код не работает с большими числами. Не могу понять, почему
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
07.02.2017, 20:10
Photofenix, у меня есть несколько вариантов решения данной задачи, но мне важно знать, важен ли порядок чисел при отборе повторов?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2017, 20:10
Помогаю со студенческими работами здесь

Поиск количества повторяющихся чисел в массиве
Есть двумерный массив, массив содержит несколько одинаковых чисел. Необходимо найти кол-во повторяющихся чисел. Есть заготовка ...

Найти среднее арифметическое не повторяющихся чисел в массиве
Найти среднее арифметическое не повторяющихся чисел в массиве, состоящем из N элементов.

Посчитать количество не повторяющихся чисел в случайном массиве
Помогите пожалуйста понять как посчитать количество не повторяющихся чисел в случайном массиве. Начал изучать С# совсем недавно. Много...

Сделать вывод в консоль повторяющихся чисел в массиве
Нужно сделать цикл который будет проверять каждый массив с каждым массивом. Задача вроде бы простая, но решить не могу. Без применения...

Составление массива из чисел, повторяющихся в предыдущем массиве
Требуется помощь в написании следующей программы: Пусть даны целые числа а1...аn, среди которых могут быть повторяющиеся. Составьте новый...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru