По каналу связи передавались данные в виде последовательности положительных целых чисел. Количество чисел заранее неизвестно, но не менее двух, признаком конца данных считается число 0. Контрольное значение равно такому максимально возможному произведению двух чисел из переданного набора, которое делится на 7, но не делится на 49. Если такое произведение получить нельзя, контрольное значение считается равным 1.
Программа должна напечатать одно число — вычисленное контрольное значение, соответствующую условиям задачи.
Входные данные.
Даны два входных файла (файл A и файл B), каждый из которых содержит количество чисел N (1 ≤ N ≤ 100000). В каждой из N строк записано одно натуральное число, не превышающее 1000.
Пример организации исходных данных во входном файле:
6
7
8
9
0
Пример выходных данных для приведённого выше примера входных данных:
63
В ответе укажите два числа: сначала значение искомого произведения для файла А, затем для файла B.
Ответ:
Произведение двух чисел будет кратно 7 и не кратно 49 в том и только в том случае, когда один из сомножителей делится на 7 и при этом не делится на 49, а второй — не делится на 7. Произведение будет максимальным, если оба сомножителя будут максимально возможными в своих группах. Искомое произведение не существует (контрольное значение считается равным 1), если в одной из указанных групп не окажется ни одного числа.
Программа читает входные данные, не запоминая числа в массиве, и находит два максимальных значения: максимум из чисел, кратных 7 и при этом не кратных 49, и максимум из чисел, не кратных 7. Затем программа вычисляет контрольное значение, равное произведению этих двух максимумов, и сравнивает его с введённым контрольным значением.
Приведём решение задачи на языке Pascal.
var
k: integer; {введенное число}
n: integer; {количество чисел} pin: integer;{введенное контрольное значение}
m: integer; {максимум среди чисел, не кратных 7}
m7: integer; {максимум среди чисел, кратных 7 и не кратных 49}
p: integer; {вычисленное контрольное значение}
f: text;
begin
m:=0; m7:=0; n:=0;
assign(f,'27986_A.txt');
reset(f);
while true do begin
readln(f, k);
if k=0 then break;
n:=n+1;
if (k mod 7 <> 0) and (k>m) then m:=k;
if (k mod 7 = 0) and (k mod 49 <> 0) and (k>m7)
then m7:= k;
end;
p:=m*m7;
if p=0 then p:= 1;
writeln(P);
end.
В результате работы данного алгоритма при вводе данных из файла A ответ — 847280, из файла B — 994000.
Приведём решение Романа Князева на языке Python.
f = open('27986_B.txt')
m7, mmax = 0, 0
while True:
a = int(f.readline())
if a == 0:
break
if a % 7 == 0 and a % 49 != 0 and a > m7:
m7 = a
if a % 7 != 0 and a > mmax:
mmax = a
Q = m7 * mmax
if Q:
print(Q)
else:
print('1')
Примечание. Путь к файлу необходимо указать согласно расположению файла на Вашем компьютере.

