Есть программа, которая находит в массиве и выводит значения наиболее часто встречающегося элемента. Но я специально в ней уменьшил размер масссива до 5 элементов и ввел 1, 1, 2, 2, 3. вывелось 1. Как сделать так, чтобы выводились оба значения, т.е. 1 и 2 ?
Вот код:
#include <stdio.h>
#include <conio.h>
const int N = 5;
int main()
{
int i, j, count, maxcount, num;
int mass[N]={1, 1, 2, 2, 3};
printf("\n Massiv iz chisel ot 1 do 10: \n");
for(i=0; i<N; i++)
{
printf("\n Massiv[%d] = %d. ", i, mass[i]);
}
maxcount=1; num=0; // Устанавливаем значения двух переменных по умолчанию.
for (i=0; i<N; i++) // Перебираем все элементы массива.
{ count=0; // Счетчик в 0.
for (j=i; j<N; j++) // Перебираем все элементы от i до конца.
if (mass[i] == mass[j]) // Если элемент [i] совпадает с одним из последующих [j],
{ count++; } // то увеличиваем значение счетчика.
if ( count > maxcount) // Если число больше ранее сохраненного,
{ maxcount = count; // тогда перезаписываем.
num = i; } // Присаваеиваем элемент массива в новую переменную
}
if (num >= 0) // Если значение новой переменной больше или равен 0.
{ printf("\n \n Povtor. chisla: %d. ", mass[num]); } // Выводим значение часто повторяющийся элемента.
else // Иначе...
{ printf("\n \n Povtor. elemenov ne naydeno "); } // повторяющихся элементов нет.
getch();
return 0;
}
if (num >= 0) // Если значение новой переменной больше или равен 0.
{ printf("\n \n Povtor. chisla: %d. ", mass[num]); } // Выводим значение часто повторяющийся элемента.
else // Иначе...
{ printf("\n \n Povtor. elemenov ne naydeno "); } // повторяющихся элементов нет.
if (num >= 0) // Если значение новой переменной больше или равен 0.
{ printf("\n \n Povtor. chisla: %d. ", mass[num]); } // Выводим значение часто повторяющийся элемента.
else // Иначе...
{ printf("\n \n Povtor. elemenov ne naydeno "); } // повторяющихся элементов нет.
Не,насчет 1 строчки с вашим кодом я погорячился.
Самая логичная идея. за первый проход вы узнаете максимальное значение,за второй, выписываете все числа,чье количество равно максимальному.Но для этого понадобиться 2 прохода.
Павел, можешь описать первый вариант в виде кода? А то я на словах не очень.
Я в C не силён, поэтому на словах.
int list[N]; - это список
int len; - длина списка (в нашем примере для mass[N]={1, 1, 2, 2, 3}; он будет равен 2
.........
len=0;
maxcount=1; num=0; // Устанавливаем значения двух переменных по умолчанию.
for (i=0; i<N; i++) // Перебираем все элементы массива.
{ count=0; // Счетчик в 0.
for (j=i; j<N; j++) // Перебираем все элементы от i до конца.
if (mass[i] == mass[j]) // Если элемент [i] совпадает с одним из последующих [j],
{ count++; } // то увеличиваем значение счетчика.
if (count==maxcount) если очередное число встречается maxcount раз. то занесём его в список
{ list[len]=i;
len++;
}
if ( count > maxcount) // Если число больше ранее сохраненного,
{ maxcount = count; // тогда перезаписываем.
num = i; // Присаваеиваем элемент массива в новую переменную
len=1; разрушаем прежний список и формируем новый
list[0]:=i;
}
}
............
for(i=0; i<len-1; i++) printf("%d", mass[list[i]]);
Павел,в твоем варианте выводится 1, а не 1 и 2. В цикле вывода надо не "i<len-1", а " i<len". Тогда все будет норм.
Shmaniche, последний цикл должен выглядеть так:
for(i=0; i<len; i++) printf("%d ", mass[list[i]]); // Тут -1 было явно лишнее
for(i=0; i<len; i++) printf("%d ", mass[list[i]]); // Тут -1 было явно лишнее
Да, я запутался. Хотел по-паскалевски, чтобы индекс был от 1, также цикл for в паскале включает границы... Потом начал мудрить и вот результат.