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


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

По каналу связи передаётся последовательность положительных целых чисел, все числа не превышают 1000. Количество чисел известно, но может быть очень велико. Затем передаётся контрольное значение последовательности — наибольшее число R, удовлетворяющее следующим условиям:

 

1) R — произведение двух различных переданных элементов последовательности («различные» означает, что не рассматриваются квадраты переданных чисел, произведения различных элементов последовательности, равных по величине, допускаются);

 

2) R делится на 22.

 

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

 

Напишите эффективную, в том числе по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет проверять правильность контрольного значения. Программа должна напечатать отчёт по следующей форме:

 

Вычисленное контрольное значение: ...

 

Контроль пройден (или — Контроль не пройден)

 

Перед текстом программы кратко опишите используемый Вами алгоритм решения.

 

На вход программе в первой строке подаётся количество чисел N. В каждой из последующих N строк записано одно натуральное число, не превышающее 1000. В последней строке записано контрольное значение.

 

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

 

6

55

997

22

7

9

400

22000

 

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

 

Вычисленное контрольное значение: 22000

Контроль пройден

Решение.

Произведение двух чисел делится на 22, если:

 

- один из сомножителей делится на 22 (второй может быть любым) либо

- ни один из сомножителей не делится на 22, причём один из сомножителей делится на 2, а другой — на 11.

 

Поэтому программа, вычисляющая кодовое число, может работать так. Программа читает все входные данные один раз, не запоминая все данные в массиве. Программа для прочитанного фрагмента входной последовательности хранит значения четырёх величин: М2 — самое большое чётное число, не кратное 11; M11 — самое большое число, кратное 11, но не кратное 2; М22 — самое большое число, кратное 22; МАХ — самое большое число среди всех элементов последовательности, отличное от М22 (если число М22 встретилось более одного раза и оно же является максимальным, то МАХ = М22). После того как все данные прочитаны, искомое контрольное значение вычисляется как максимум из произведений М22*МАХ и М2*М11.

 

Ниже приведён пример программы на языке Паскаль, которая реализует описанный алгоритм. Кроме того, приведён пример программы на языке Бейсик, которая правильно решает задачу, но использует алгоритм, немного отличающийся от описанного выше. Возможны и другие правильные алгоритмы. Допускаются решения, записанные на других языках программирования.

 

 

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

М22 = 0

М2 = 0

МП = 0

МАХ = 0

INPUT N

FOR I = 1 ТО N

INPUT DAT

IF DAT MOD 2=0 AND DAT > M2 THEN

M2 = DAT

ELSE

IF DAT MOD 11 = 0 AND DAT > M11 THEN

M11 = DAT

END IF

END IF

IF DAT MOD 22 = 0 AND DAT > M22 THEN

IF M22 > MAX THEN

MAX = M22

END IF

M22 = DAT

ELSE

IF DAT > MAX THEN

MAX = DAT

END IF

END IF

NEXT I

INPUT R

IF M11 * M2 < M22 * MAX THEN

RES = M22 * MAX

ELSE

RES = M11 * M2

END IF

PRINT "Вычисленное контрольное значение: "; RES

IF RES = R THEN

PRINT "Контроль пройден"

ELSE

PRINT "Контроль не пройден"

END IF

END

var М2,M11,М22,R,MAX,dat,res,i,N: longint;

begin

М2 := 0;

M11 := 0;

М2 2 := 0;

MAX := 0;

readln(N);

for i := 1 to N do

begin

readln(dat);

if ((dat mod 2) = 0) and ((dat mod 11) > 0)and (dat > M2) then

M2 : = dat;

if ((dat mod 11) = 0) and ((dat mod 2) > 0) and (dat > M11) then

M11 : = dat;

if (dat mod 22 = 0) and (dat > M22) then

begin

if M22 > MAX then MAX := M22;

M22 : = dat

end

else

if dat > MAX then

MAX : = dat;

end;

readln(R);

if (M2*M11 < M22*MAX) then

res := M22*MAX

else

res := M2 *M11;

writeln('Вычисленное контрольное значение: 1,res);

if R = res then writeln('Контроль пройден') else writeln('Контроль не пройден');

end.


Аналоги к заданию № 5503: 5791 5823 5855 5887 5951 5983 6017 9211 9319 11128 Все

Источник: ЕГЭ по ин­фор­ма­ти­ке 30.05.2013. Ос­нов­ная волна. Центр. Ва­ри­ант 5.