СДАМ ГИА: РЕШУ ЕГЭ
Образовательный портал для подготовки к экзаменам
Информатика
≡ информатика
сайты - меню - вход - новости




Задания
Версия для печати и копирования в MS Word
Задание 27 № 13503

Дан набор из N целых положительных чисел. Необходимо определить, какая цифра чаще всего встречается в десятичной записи чисел этого набора. Если таких цифр несколько, необходимо вывести их все в порядке убывания — от большей к меньшей.

Напишите эффективную по времени и по памяти программу для решения этой задачи.

Программа считается эффективной по времени, если при увеличении количества исходных чисел N в k раз время работы программы увеличивается не более чем в k раз. Программа считается эффективной по памяти, если память, необходимая для хранения всех переменных программы, не превышает одного килобайта и не увеличивается с ростом N.

Максимальная оценка за правильную (не содержащую синтаксических ошибок и дающую правильный ответ при любых допустимых входных данных) программу, эффективную по времени и по памяти, — 4 балла.

Максимальная оценка за правильную программу, эффективную только по времени или только по памяти, — 3 балла.

Максимальная оценка за правильную программу, не удовлетворяющую требованиям эффективности, — 2 балла.

Вы можете сдать одну или две программы решения задачи. Если Вы сдадите две программы, каждая из них будет оцениваться независимо от другой, итоговой станет бо́льшая из двух оценок.

Перед текстом программы кратко опишите алгоритм решения. Укажите использованный язык программирования и его версию. Описание входных и выходных данных В первой строке входных данных задаётся количество чисел N (1 ≤ N ≤ 1000). В каждой из последующих N строк записано одно натуральное число, не превышающее 10 000.

 

Пример входных данных:

3

15

25

32

Пример выходных данных для приведённого выше примера входных данных:

5 2

 

В десятичной записи чисел заданного набора чаще всего — по 2 раза — встречаются цифры 2 и 5, в ответе они выведены в порядке убывания.

Решение.

Необходимо создать массив из 10 элементов с индексами от 0 до 9 и использовать его для подсчёта количества всех цифр. Использование массива не делает программу неэффективной по памяти, так как размер массива не зависит от N. Затем нужно найти значение максимального элемента этого массива и вывести в порядке убывания индексы всех элементов, равных этому максимуму.

Вместо массива можно использовать 10 отдельных переменных. В этом случае программа остаётся правильной и эффективной, но становится очень громоздкой, повышается вероятность ошибки. Если в проверяемой работе использован такой способ, эту работу следует проверить особенно тщательно.

Ниже приведена реализующая описанный выше алгоритм программа на языке Паскаль (использована версия PascalABC)

 

var

N: integer; {количество чисел}

a: integer; {очередное число}

digit: integer; {цифра числа}

d: array [0..9] of integer; {подсчёт цифр}

mx: integer; {максимальное количество цифр}

i: integer;

begin

for i:=0 to 9 do d[i]:=0;

readln(N);

for i:=1 to N do begin

readln(a);

while a>0 do begin

digit := a mod 10;

d[digit] := d[digit]+1;

a := a div 10;

end;

end;

mx := 0;

for i:=0 to 9 do begin

if d[i] > mx then mx := d[i];

end;

for i:=9 downto 0 do begin

if d[i]=mx then write(i, ' ');

end;

end.

Пример правильной, но неэффективной программы на языке Паскаль.

 

var

N: integer; {количество чисел}

a: array [1..1000] of integer; {исходные данные}

digit: integer; {количество всех цифер исходных чисел}

d: array [1..4000] of integer; {подсчёт цифр}

max_lenght: integer;

i, j, k, lenght: integer;

begin

readln(N);

digit := 1;

for i := 1 to 4000 do d[i]:=0;

for i:= 1 to N do read(a[i]);

for i := 1 to N do

while a[i]<>0 do begin

d[digit] := a[i] mod 10;

digit := digit+1;

a[i] := a[i] div 10;

end;

for i :=1 to digit-1 do

for j:= 1 to digit-1-i do

if d[j] k := d[j];

d[j] := d[j+1];

d[j+1] := k;

end;

max_lenght := 0;

lenght := 1;

for i := 1 to digit-1 do

if d[i]=d[i+1] then

lenght := lenght + 1

else begin

if lenght>max_lenght then begin

max_lenght := lenght;

end;

lenght := 1;

end;

lenght := 1;

for i := 1 to digit-1 do

if d[i]=d[i+1] then

lenght := lenght + 1

else begin

if lenght=max_lenght then write(d[i], ' ');

lenght := 1;

end;

end.

Источник: Тренировочная работа по ИНФОРМАТИКЕ 11 класс 29 ноября 2016 года Вариант ИН10203