По каналу связи передаются положительные целые числа, не превышающие 1000, – результаты измерений, полученных в ходе эксперимента (количество измерений известно заранее). После окончания эксперимента передаётся контрольное значение – наименьшее число R, удовлетворяющее следующим условиям:
1) R — сумма двух различных переданных элементов последовательности («различные» означает, что нельзя просто удваивать переданные числа, суммы различных, но равных по величине элементов допускаются);
2) R — нечётное число.
Если чисел, соответствующих приведённым условиям, нет, считается, что R = –1. В результате помех при передаче как сами числа, так и контрольное значение могут быть искажены.
Напишите эффективную, в том числе по используемой памяти, программу (укажите используемую версию языка программирования, например, Free Pascal 2.6.4), которая будет проверять правильность контрольного значения. Программа должна напечатать отчёт по следующей форме:
Вычисленное контрольное значение: …
Контроль пройден (или Контроль не пройден)
Если удовлетворяющее условию контрольное значение определить невозможно (то есть R = –1), то выводится только фраза «Контроль не пройден».
Перед текстом программы кратко опишите используемый Вами алгоритм решения.
На вход программе в первой строке подаётся количество чисел N. В каждой из последующих N строк записано одно натуральное число, не превышающее 1000. В последней строке записано контрольное значение.
Пример входных данных:
6
10
8
33
45
19
200
27
Пример выходных данных для приведённого выше примера входных данных:
Вычисленное контрольное значение: 27
Контроль пройден
Сумма двух чисел нечётна, если одно из них — чётное, а другое — нечётное. Программа, вычисляющая контрольное значение, читает все входные данные один раз, не запоминая их в массиве. Для прочитанного фрагмента входной последовательности программа хранит значения двух величин: М0 — наименьшее чётное число;
M1 — наименьшее нечётное число. После того как все данные прочитаны, искомое контрольное значение вычисляется как сумма M0 + M1.
Ниже приведены реализующие этот алгоритм программы на языке Паскаль, а также на алгоритмическом языке. Допускаются решения, записанные на других языках программирования.
Пример правильной и эффективной программы на языке Паскаль.
var M0,M1,res,i,N,dat: longint;
begin
M0 := 1002;
M1 := 1001;
readln(N);
for i := 1 to N do
begin
readln(dat);
if (dat mod 2 = 0) and (dat < M0) then
M0 := dat;
if (dat mod 2 <> 0) and (dat < M1) then
M1 := dat;
end;
if (M0 <= 1000) and (M1 <= 1000) then
res := M0+M1
else res := -1;
readln(R);
if res > 0 then
writeln('Вычисленное контрольное значение: ',res);
if (R > 0) and (R = res)
then writeln('Контроль пройден')
else writeln('Контроль не пройден');
end.
Пример правильной и эффективной программы на Алгоритмическом языке.
алг
нач
цел N | количество чисел на входе
цел x | исходные данные
цел m0=1002 | миним. четное число
цел m1=1001 | миним. нечетное число,
цел R | введенное контрольное значение
цел res | вычисленное контрольное значение
ввод N
нц N раз
ввод x
если mod(x,2) = 0 и x < m0
то m0 := x
все
если mod(x,2) <> 0 и x < m1
то m1 := x
все
кц
если m0 <= 1000 и m1 <= 1000 то
res := m0+m1
иначе
res := -1
все
ввод R
если res>0
вывод нс, 'Вычисленное контрольное значение: ',res
все
если R>0 и R=res
то вывод нс, "Контроль пройден"
иначе вывод нс, "Контроль не пройден"
все
кон
Приводим эффективное решение Игоря Кудашева на Python 3.
n = int(input())
x1 = 1001
x2 = 1001
for i in range(n):
x = int(input())
if x % 2 != 0 and x < x1: x1 = x
elif x % 2 == 0 and x < x2: x2 = x
r = int(input())
if x1 == 1001 or x2 == 1001: r1 = -1
else: r1 = x1 + x2
print('Вычисленное контрольное значение:', r1)
if r == r1: print('Контроль пройден')
else: print('Контроль не пройден')

