По каналу связи передаётся последовательность положительных целых чисел, все числа не превышают 1000. Количество чисел известно, но может быть очень велико. Затем передаётся контрольное значение последовательности — наибольшее число R, удовлетворяющее следующим условиям:
1) R — произведение двух различных переданных элементов последовательности («различные» означает, что не рассматриваются квадраты переданных чисел, произведения различных элементов последовательности, равных по величине, допускаются);
2) R делится на 21.
Если такого числа R нет, то контрольное значение полагается равным 0. В результате помех при передаче как сами числа, так и контрольное значение могут быть искажены.
Напишите эффективную, в том числе по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет проверять правильность контрольного значения. Программа должна напечатать отчёт по следующей форме:
Вычисленное контрольное значение: ...
Контроль пройден (или — Контроль не пройден)
Перед текстом программы кратко опишите используемый Вами алгоритм решения.
На вход программе в первой строке подаётся количество чисел N. В каждой из последующих N строк записано одно натуральное число, не превышающее 1000. В последней строке записано контрольное значение.
Пример входных данных:
6
70
21
997
7
9
300
21000
Пример выходных данных для приведённого выше примера входных данных:
Вычисленное контрольное значение: 21000
Контроль пройден
Произведение двух чисел делится на 21, если:
· один из сомножителей делится на 21 (второй может быть любым) либо
ни один из сомножителей не делится на 21, причём один из сомножителей делится на 7, а другой — на 3.
Поэтому программа, вычисляющая кодовое число, может работать так. Программа читает все входные данные один раз, не запоминая все данные в массиве. Программа для прочитанного фрагмента входной последовательности хранит значения четырёх величин: М7 — самое большое число, кратное 7, но не кратное 3; МЗ — самое большое число, кратное 3, но не кратное 7; М21 — самое большое число, кратное 21; МАХ — самое большое число среди всех элементов последовательности, отличное от М21 (если число М21 встретилось более одного раза и оно же является максимальным, то МАХ = М21).
После того как все данные прочитаны, искомое контрольное значение вычисляется как максимум из произведений М21*МАХ и М7*МЗ. Ниже приведён пример программы на языке Паскаль, которая реализует описанный алгоритм.
Кроме того, приведён пример программы на языке Бейсик, которая правильно решает задачу, но использует алгоритм, немного отличающийся от описанного выше. Возможны и другие правильные алгоритмы. Допускаются решения, записанные на других языках программирования.
| Пример правильной и эффективной программы на языке Бейсик: | Пример правильной и эффективной программы на языке Паскаль: |
М21 = 0 М7 = 0 МЗ = 0 МАХ = 0 INPUT N FOR I = 1 ТО N INPUT DAT IF DAT MOD 7=0 AND DAT > M7 THEN M7 = DAT ELSE IF DAT MOD 3=0 AND DAT > M3 THEN M3 = DAT END IF END IF IF DAT MOD 21 = 0 AND DAT > M21 THEN IF M21 > MAX THEN MAX = M21 END IF M21 = DAT ELSE IF DAT > MAX THEN MAX = DAT END IF END IF NEXT I INPUT R IF МЗ * M7 < M21 * MAX THEN RES = M21 * MAX ELSE RES = МЗ * M7 END IF PRINT "Вычисленное контрольное значение: "; RES IF RES = R THEN PRINT "Контроль пройден" ELSE PRINT "Контроль не пройден" END IF END | var М7,МЗ,М21,R,MAX,dat,res,i,N: longint; begin M7 := 0; МЗ := 0; M21 := 0; MAX := 0; readln(N) for i := 1 to N do begin readln(dat); if ((dat mod 7) = 0) and ((dat mod 3) > 0) and (dat > M7) then M7 : = dat; if ((dat mod 3) = 0) and ((dat mod 7) > 0) and (dat > МЗ) then M3 : = dat; if (dat mod 21 = 0) and (dat > M21) then begin if M21 > MAX then MAX := M21; M21 : = dat end else if dat > MAX then MAX : = dat; end; readln(R) if (M7*M3 < M21*MAX) then res := M21*MAX else res := M7*M3; writeln('Вычисленное контрольное значение:', res); if R = res then writeln('Контроль пройден') else writeln('Контроль не пройден'); end. |

