Решение. Произведение двух чисел делится на 6, если:
- один из сомножителей делится на 6 (второй может быть любым) либо
- ни один из сомножителей не делится на 6, причём один из сомножителей делится на 2, а другой — на 3.
Поэтому программа, вычисляющая кодовое число, может работать так.
Программа читает все входные данные один раз, не запоминая все данные в массиве. Программа для прочитанного фрагмента входной последовательности хранит значения четырех величин:
М2 - самое большое чётное число, не кратное 3;
М3 - самое большое число, кратное 3, но не кратное 2;
М6 — самое большое число, кратное 6;
МАХ - самое большое число среди всех элементов последовательности, отличное от M6 (если число М6 встретилось более одного раза и оно же является максимальным, то МАХ = M6).
После того как все данные прочитаны, искомое кодовое слово вычисляется как максимум из произведений M6*МАХ и М2*М3.
Ниже приведён пример программы на языке Паскаль, которая реализует описанный алгоритм.
Кроме того, приведён пример программы на языке Бейсик, которая правильно решает задачу, но использует алгоритм, немного отличающийся от описанного выше. Возможны и другие правильные алгоритмы. Допускаются решения, записанные на других языках программирования.
Пример правильной и эффективной программы на языке Паскаль:
var М2, М3, М6, R, MAX, dat, res, i, N: longint;
begin
M2 := 0; M3 := 0; M6 := 0; MAX := 0;
readln(N);
for i := 1 to N do begin
readln(dat);
if ((dat mod 2) = 0) and ((dat mod 3) >0) and (dat > M2) then M2 := dat;
if ((dat mod 3) = 0) and ((dat mod 2) > 0) and (dat > M3) then M3 := dat;
if (dat mod 6 = 0) and (dat > M6) then begin
if M6 > MAX then MAX := M6;
M6:= dat
end
else
if dat > MAX then MAX := dat;
end;
readln(R);
if (M2*M3 < M6 *MAX) then
res := M6*MAX
else
res := M2*M3;
writeln('Вычисленное контрольное значение: ',res);
if R = res then writeln('Контроль пройден')
else writeln('Контроль не пройден');
end.
Пример правильной и эффективной программы на языке Бейсик:
М6 = 0
М2 = 0
М3 = 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 3=0 AND DAT > M3 THEN
M7 = DAT
END IF
END IF
IF DAT MOD 6 = 0 AND DAT > M6 THEN
IF M6 > MAX
THEN
MAX = M6
END IF
M6 = DAT
ELSE
IF DAT > MAX THEN
MAX = DAT
END IF
END IF
NEXT I
INPUT R
IF M3 * M2 < M6 * MAX THEN
RES = M6 * MAX
ELSE
RES = M3 * M2
END IF
PRINT "Вычисленное контрольное значение:"; RES
IF RES = R THEN
PRINT "Контроль пройден"
ELSE
PRINT "Контроль не пройден"
END IF
END
Указания по оцениванию
4 балла ставится за эффективную и правильно работающую программу, которая, возможно, содержит до трёх синтаксических ошибок.
3 балла ставится в случае, когда задача фактически решена, но программа содержит четыре-пять синтаксических ошибок, или если допущена одна содержательная ошибка, или если все входные данные сохраняются в массиве или иной структуре данных (программа неэффективна по памяти, но эффективна по времени работы).
2 балла ставится, если программа неэффективна по времени работы (перебираются все возможные пары элементов), или в программе две содержательные ошибки, либо шесть-семь синтаксических ошибок.
1 балл ставится, если программа написана неверно, но из описания алгоритма и обшей структуры программы видно, что экзаменуемый в целом правильно представляет путь решения задачи. Далее уточняются перечисленные выше критерии.