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

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

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

Author24 — интернет-сервис помощи студентам
Одна из задач, составить программу, которая позволяет одинаковые числа в массиве.
По моей логике - должна работать, но не работает.
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
27710 / 17328 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
05.02.2017, 16:39 2
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  [ТС] 3
Спасибо, но что-то не понятно, откуда ноги растут)
0
Диссидент
Эксперт C
27710 / 17328 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
05.02.2017, 20:13 4

Не по теме:

Цитата Сообщение от 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 5
Более оптимально использовать хэш-таблицу для поиска.
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
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
05.02.2017, 21:07 6
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 7
Это уже тонкости, которые трудно запомнить и которые отличаются в разных реализациях хэш-таблиц.
1
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
05.02.2017, 22:06 8
Лучший ответ Сообщение было отмечено Photofenix как решение

Решение

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

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

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

Цитата Сообщение от avgoor Посмотреть сообщение
Гордиться незнанием принято в школе.
Я не горжусь тем, что не знаю деталей реализации классов std. Я говорю, что это не нужно.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
06.02.2017, 01:22 16
Цитата Сообщение от New man Посмотреть сообщение
Вот тогда, когда я буду у Вас работать
Пока так рассуждаете, не будете.
Цитата Сообщение от New man Посмотреть сообщение
Асимптотически это одно и то же, так что да
Цитата Сообщение от New man Посмотреть сообщение
Я говорю, что это не нужно.
Цитата Сообщение от avgoor Посмотреть сообщение
Ну, выше junior-а и не подниметесь.
0
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
07.02.2017, 19:08  [ТС] 17
В общем написал я код на повторяющиеся числа. Код работает точно и подсчитывает количество повторений каждого числа. Хочется просто узнать, совсем я нуб нубовый, или уже что-то могу
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
27710 / 17328 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
07.02.2017, 19:37 18
Лучший ответ Сообщение было отмечено 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  [ТС] 19
Понимаю, что мне еще далеко до профессионала
Хотя код не работает с большими числами. Не могу понять, почему
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
07.02.2017, 20:10 20
Photofenix, у меня есть несколько вариантов решения данной задачи, но мне важно знать, важен ли порядок чисел при отборе повторов?
1
07.02.2017, 20:10
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2017, 20:10
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
В чем отличие между INNER JOIN и OUTER JOIN
bytestream 22.01.2025
В современных базах данных информация часто распределена между множеством взаимосвязанных таблиц, что делает операции объединения JOIN неотъемлемой частью работы с SQL. Эти операции позволяют. . .
Как сделать первую букву заглавной в JavaScript
bytestream 22.01.2025
JavaScript предоставляет разработчикам множество инструментов для эффективной работы с текстовыми данными. Одной из часто встречающихся задач при обработке строк является преобразование первой буквы. . .
Что такое Big O нотация и алгоритмическая сложность
bytestream 22.01.2025
Введение в алгоритмическую сложность В мире разработки программного обеспечения эффективность алгоритмов играет crucial роль в создании качественных приложений. Алгоритмическая сложность. . .
Как решать конфликты слияния (merge) в Git
bytestream 22.01.2025
Конфликты слияния в системе контроля версий Git возникают в ситуациях, когда две или более ветки разработки содержат несовместимые изменения в одних и тех же участках кода. Эти конфликты представляют. . .
Как использовать регулярные выражения
bytestream 22.01.2025
Регулярные выражения представляют собой мощный инструмент для работы с текстовыми данными, который позволяет осуществлять поиск, проверку и манипуляцию строками на основе определенных шаблонов. Этот. . .
Как выйти из Vim
bytestream 22.01.2025
Vim (Vi IMproved) представляет собой один из самых влиятельных текстовых редакторов в истории компьютерной индустрии, эволюционировавший из своего предшественника Vi, созданного Биллом Джоем в 1976. . .
NoSQL базы данных: что это такое и какие существуют
bytestream 22.01.2025
В современную эпоху цифровой трансформации объемы данных растут экспоненциально, создавая новые вызовы для традиционных систем управления базами данных. NoSQL (Not Only SQL) представляет собой. . .
Обновление исследования от команды MCM (январь 2025 г.)
Programma_Boinc 22.01.2025
Обновление исследования от команды MCM (январь 2025 г. ) Мы продолжаем изучать молекулярные сигнатуры, связанные с раком легких, с текущим фокусом на GCM1, факторе транскрипции, участвующем в. . .
Как работать с Kafka в Go (Golang)
bytestream 22.01.2025
Apache Kafka представляет собой распределенную платформу потоковой передачи данных, которая произвела революцию в области обработки событий и интеграции микросервисов. Эта система, изначально. . .
Как использовать RabbitMQ в Go (Golang)
bytestream 22.01.2025
RabbitMQ представляет собой надежный и широко используемый брокер сообщений, который играет ключевую роль в построении современных распределенных систем и микросервисной архитектуры. В основе работы. . .
Как преобразовать список списков в простой список в Python
bytestream 22.01.2025
При работе с Python разработчики часто сталкиваются с необходимостью обработки сложных структур данных, среди которых особое место занимают вложенные списки. Эти структуры представляют собой списки,. . .
Что такое GUID / UUID и как их создать
bytestream 22.01.2025
В мире разработки программного обеспечения существует постоянная потребность в уникальной идентификации объектов, записей и ресурсов. Эта задача становится особенно актуальной в распределенных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru