Задание №17 ЕГЭ Информатика с ответом и решением
Ответ: 13510315 19999
Условие
В файле содержится последовательность из 10 000 целых положительных чисел. Каждое число не превышает 10 000. Определите и запишите в ответе сначала количество пар элементов последовательности, для которых произведение элементов делится без остатка на 10, затем максимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два различных элемента последовательности. Порядок элементов в паре не важен.
Подсказки — как подойти к решению
- Считай данные из файла в массив целых чисел (по одному числу в строке) — иначе перебрать все пары не получится.
- Парой считаются два элемента с разными номерами, порядок не важен, поэтому используй перебор i < j: иначе каждая пара посчитается дважды.
- Проверяй делимость на 10 у произведения пары: одного множителя, кратного 10, недостаточно, подойдут и комбинации вроде чётного числа с кратным 5; максимум суммы ищи только среди подходящих пар.
Решение
Сначала считаем все числа из файла в массив. Для каждой пары будем проверять, делится ли произведение элементов пары на 10 без остатка. При успешном выполнении условия будем увеличивать значения счётчика count и проверять, больше ли сумма элементов пары текущей максимальной суммы. Если сумма элементов пары больше текущей максимальной суммы, будем обновлять значение переменной maxsum.
Приведём решение задачи на языке Pascal.
var
i, j: integer;
count: longint;
maxsum: integer;
arr: array[1..10000] of integer;
f: text;
begin
assign(f,'C:\17.txt');
reset(f);
maxsum := 0;
count := 0;
for i := 1 to 10000 do readln(f, arr[i]);
for i := 1 to 10000 - 1 do
for j := i + 1 to 10000 do begin
if (arr[i] * arr[j] mod 10 = 0) then begin
count := count + 1;
if arr[i] + arr[j] > maxsum then maxsum := arr[i] + arr[j];
end;
end;
writeln(count, ' ', maxsum);
end.
Приведём решение Николая Чуркина (Тимашевск) на языке Python.
count = m = 0
f = open('17.txt')
l = [int(i) for i in f]
for i in range(len(l) - 1):
for j in range(i + 1, len(l)):
if l[i] * l[j] % 10 == 0:
count += 1
m = max(m, l[i] + l[j])
print(count, m)
В результате работы данного алгоритма при вводе данных из файла ответ — 13510315 19999.
Примечание 1.
Путь к файлу необходимо указать согласно расположению файла на Вашем компьютере.
Примечание 2.
Под различными элементами последовательности подразумеваются элементы с разными номерами, значения элементов могут быть одинаковыми.
Приведём решение Сергея Донец на PascalABC.NET:
begin
var p:=ReadAllLines('17.txt').Select(x->x.ToInteger);
var m:=p.Combinations(2)
.Where(\(a,b)->(a*b).divs(10)).ToArray;
m.Length.print;
m.Max(\(a,b)->a+b).Print;
end.
Типичные ошибки
- Нарушен порядок: сначала записывается количество пар, а затем максимальная сумма.
- Каждая пара посчитана дважды (перебор по всем i ≠ j, а не по i < j). Порядок элементов в паре не важен, поэтому такой перебор завышает счётчик ровно вдвое.
В тренажёре: подсказки по шагам, разбор твоей ошибки ИИ-репетитором (он не даёт готовый ответ), повторение ошибок по интервалам и общий прогресс. Все задания №17 по информатике