Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
19.05.2015
Размер:
719.36 Кб
Скачать

Var X, count, c, c0, max, max2, max3, max6: integer;

begin

count:=0; max:=0; max2:=0; max3:=0; max6:=0;

readln(x);

while x <> 0 do begin

count:= count + 1;

if (x mod 6 = 0) and (x > max6) then begin

if max6 > max then max:= max6;

max6:= x

end

else if x > max then max:= x;

if (x mod 2 = 0) and (x > max2) then max2:= x

else

if (x mod 3 = 0) and (x > max3) then max3:= x;

readln(x);

end;

readln(C0);

if max6*max > max2*max3 then

C:= max6*max

else C:= max2*max3;

writeln('Получено чисел: ', count);

writeln('Полученное контрольное значение: ', C0);

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

if C = C0 then

writeln('Контроль пройден.')

else writeln('Контроль не пройден.');

end.

  1. Это достаточно простая задача, в ней фактически нужно искать возрастающие последовательности чисел, и среди них искать последовательность с максимальной разностью конечного и начального элементов. Например, в цепочке чисел

21, 22, 13, 5, 1, 2, 3, 5, 1, 23

есть 5 неубывающих последовательностей (они выделены разными цветами), из них две состоят из одного элемента. Для них величины «подъемов» (разности между конечным и начальным числами) равны, соответственно, 22-21=1, 0, 0, 5-1=4 и 23-1=22. Максимальный «подъем» 22 имеет последняя последовательность.

Во-первых, нужно считать введенные числа. Для этого будем использовать переменную-счётчик N. Её начальное значение равно 0, с каждым прочитанным числом она увеличивается на 1.

По условию задачи объем расходуемой памяти не должен зависеть от количества чисел, поэтому запоминать их в массиве нельзя. Будем хранить только что прочитанное значение в целой переменной X. Тогда цикл чтения, заканчивающийся при вводе нуля, можно записать в виде бесконечного цикла (while True do …) с выходом через оператор break:

while True do begin

readln(X); { читаем число }

if X = 0 then break; { если 0, то выход из цикла }

N:= N + 1; { увеличиваем счётчик чисел}

{ обработка X }

end;

Вся последовательность просматривается только 1 раз (вернуться к предыдущим числам тоже нельзя). В этих условиях для того, чтобы определить, продолжается ли дальше неубывающая цепочка, достаточно знать только одно предыдущее значение, которое будем хранить в целой переменной Xprev. Кроме того, для поиска максимального «подъема» нам нужны две целых переменных, обозначим их L и LMax. Одна из них (L) обозначает величину подъема текущей возрастающей последовательности, а вторая (Lmax) – максимальную на данный момент величину подъема.

Если новое значение больше предыдущего, подъем продолжается, и новую величину подъема можно рассчитать так:

L := L + X – Xprev;

Это значит, что к предыдущему значению добавляется еще одна «ступенька» – разность между последним и предпоследним числами. Кроме того, удобно сразу проверить, не стало ли L больше, чем Lmax. Если это так, нужно скопировать значение L в Lmax, так как мы нашли новую максимальную величину подъема.

Если же возрастающая последовательность закончилась (X<=Xprev), нужно сбросить значение L в ноль. Таким образом, обработка очередного значения X выглядит так:

if X > Xprev then begin

L := L + X – Xprev;

if L > LMax then LMax := L;

end

else L := 0;

Xprev := X;

Заметим, что начальное значение Xprev нужно выбрать такое, чтобы на первом шаге НЕ было выполнено условие X >Xprev и в переменную L было записано нулевое значение (началась новая возрастающая последовательность). Учитывая, что все числа по условию не превышают 1000, можно принять

Xprev := 1001;

В конце программы остается вывести значения переменных N (количество чисел) и Lmax (наибольшую высоту подъема). Приведем полную программу:

Соседние файлы в папке ЕГЗ_2012_Поляков_май