Другие языки программирования и технологии

Дан одномерный целочисленный массив a, состоящий из n элементов.

Найти максимальное количество его одинаковых элементов. Исходный массив и полученные результаты ( значение и количество одинаковых элементов массива) вывести на печать.
Evgenij Rubanov
Evgenij Rubanov
651
Проще всего сравнить каждый элемент со всем массивом

int maxCnt = 0;
int maxVal;
for( int i=0; i < n; i++) {
int cnt = 0;
for ( int j=0; j < n; j++) {
if( a[i] == a[j]) cnt++;
}
if (cnt > maxCnt) { maxCnt = cnt; maxVal = a[i]; }
}

printf( "value: %d, count: %d\n", maxVal, maxCnt);
Олег Гольдин
Олег Гольдин
6 630
Лучший ответ
1. Сначала сортируем массив - хотя бы встроенной в C функцией qsort.

2. Потом просто считаем кол-во подряд идущих одинаковых элементов и ищем максимум:

cnt = 1;
max_val = a[0];
max_cnt = 1;
for (i = 1; i < n; ++i) {
if (a[i] == a[i-1]) {
++cnt;
} else {
cnt = 1;
}
if (cnt > max_cnt) {
max_cnt = cnt;
max_val = a[i];
}
}
Alex Вишняков
62 156
https://pastebin.com/3QPAjLvv
не полностью... сам интересовался этим вопросом
Andrei Gulak
Andrei Gulak
10 755
Евгений Таскин Заинтересовался?
Вот решение. Как я заметил, ты сейчас STL рассматриваешь? Как раз там полно инструментов из STL - контейнеры.
https://yadi.sk/d/0auNMSFI3RU3MH
Пожалуйста.
M@il.Ответы зачастую съедает треугольные скобки < > и их содержимое. Я постарался это предотвратить, но на всякий случай, вот файл *.cpp с корректным кодом. Я его выложил на Яндекс. Диск https://yadi.sk/d/0auNMSFI3RU3MH
Если пользоваться массивом, а не шаблонным классом vector и не использовать словарик map - можно голову обломать при написании кода.

#include < iostream >
#include < vector >
#include < map >
#include < cstdlib >
#include < ctime >
#include < algorithm >

using namespace std;

int main()
{
setlocale(LC_ALL, "rus");
srand(time(NULL));
system("color 0A");
cout << "Введите количество элементов в контейнере ";
unsigned n;
cin >> n;
vector < int > v(n);

generate(v.begin(), v.end(), []() {return -10 + rand() % 21; });
cout << "Содержимое контейнера" << endl;
for (auto t : v) cout << t << " ";
cout << endl;
sort(v.begin(), v.end());

map < int, unsigned > mp;
int old;
unsigned sum = 0;
for(unsigned u = 0; u < v.size(); ++u)
{
if (u == 0)
{
old = v[u];
continue;
}
if (old == v[u])
{
++sum;
}
else
{
++sum;
mp.insert(pair < int, unsigned > (old, sum));
sum = 0;
}
if(u == v.size() - 1)
{
++sum;
mp.insert(pair < int, unsigned > (v[u], sum));
sum = 0;
}
old = v[u];
}

vector < pair < int, unsigned > > vec(mp.begin(), mp.end());
sort(vec.begin(), vec.end(), [](pair < int, unsigned > d1, pair < int, unsigned > d2) {return d1.second > d2.second; });
cout << "Максимальное количество одинаковых элементов в этом контейнере" << endl;
for (auto pp : vec)
{
if (pp.second == vec[0].second)
{
cout << "Элемент со значением " << pp.first << " встречается в контейнере " << pp.second << " раз (а)" << endl;
}
}
cin.get(); cin.get();
return 0;
}
Александр Попов Если нужно в файл сохранить результат работы программы, то вот код https://yadi.sk/d/0auNMSFI3RU3MH перезалил на ту же ссылку.
В этом случае, код откомпилировать через F7, через студию не запускать.
Открыть *.exe файл, являющийся результатом компиляции кода.
Для этого слева или справа -> Обозреватель решений -> Решение "..." -> правая кнопка мышки -> Открыть папку в проводнике -> Debug (если компиляция F7 в режиме Debug была), иначе открыть папку Release -> Запустить *.exe -> После завершения работы программы можно открыть файл numeric.txt (в этой же папке с программой), там будут результаты работы программы.

Похожие вопросы