Главная Проекты Номер 17. ЕГЭ по информатике

Номер 17. ЕГЭ по информатике

Задание 17 посвящено работе с некоторой последовательностью чисел, записанной в текстовом файле. Как правило, в задаче требуется посчитать пары или тройки соседних элементов, которые подходят под определенное условие.

Решение задачи начинается с чтения содержимого файла. Числа в файле записаны каждое с новой строки и поэтому считывание и преобразование строк в целые числа можно записать одной строкой в виде генератора списка чисел, с которым мы сможем работать далее.

Например, для файла, который находится в какой-то директории files это будет выглядеть так:

a = [int(x) for x in open(’17-3.txt’)]

Начнем организации перебора элементов в списке. Возьмём произвольный список чисел a, например: а = [12,4,8,11,19,74].

Есть два способа перебора элементов списка, по элементам и по индексам:

Однако в этом задании, как правило требуется организовать не перебор чисел, а перебор соседних пар, соседних троек, соседних четверок. В данном случае речь идет о переборе пар смежных чисел, под парой подразумевается сочетание двух соседних элементов, расположенных рядом друг с другом.

Методы перебора

Рассмотрим методы перебора таких пар. Существуют два основных подхода. Первый заключается в переборе смежных пар, то есть тех, у которых порядковые номера отличаются на единицу (например, 0-1, 1-2, 2-3, 3-4, 4-5). Эти элементы являются соседями, так как разница между их индексами составляет ровно одну позицию. Следует отметить, что количество пар всегда на единицу меньше общего количества элементов. Например, если имеется шесть чисел, то образуется пять пар. Последнее число не имеет пары, так как отсутствует следующий элемент. При переборе пар по индексам необходимо останавливаться на предпоследнем индексе (len(a) — 1).

Второй подход предполагает использование функции zip. Он также позволяет получить пары смежных элементов. Функция zip принимает два списка: исходный список и тот же список, но начиная со второго элемента (a[1:]), и последовательно сопоставляет их элементы. Это позволяет удобно описать перебор пар смежных элементов. Последний элемент списка из первого параметра (a) не включается в пары, так как для него не найдется соответствующего элемента во втором списке (a[1:]). Таким образом, функция zip объединяет два списка параллельно и возвращает их элементы попарно. Данный метод подходит не только для пар, но и для других комбинаций элементов. Важно понимать, что мы рассматриваем исключительно перебор смежных пар, а не всех возможных сочетаний.

Рассмотрим, как устроен перебор троек. Можно также перебирать соседние элементы, опираясь на их индексы, при этом количество троек будет на два меньше чем количество элементов исходного списка, то есть перебор необходимо вести до (len(a)-2), а можно воспользоваться функцией zip, которая будет сопоставлять исходный список, такой же список без первого элемента и такой же список без первых двух элементов, и формировать тройки соседних элементов:

Перебор комбинаций соседних элементов по индексам и с помощью zip дает одинаковый результат, можно использовать оба метода, но в некоторых задачах требуется учитывать громоздкие условия, при записи которых лишние индексы могут усложнять процесс написания программы.

Задача № 1 (4301)

В файле 17-3.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -10 000 до 10 000 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, произведение которых положительно, а сумма кратна 7, затем минимальное из произведений элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.

Решение

Для начала необходимо открыть файл 17-3.txt, который содержит последовательность целых чисел. Эти числа могут находиться в диапазоне от -10000 до 10000 включительно. Задача состоит в том, чтобы определить количество пар элементов, удовлетворяющих двум условиям: произведение элементов должно быть положительным, а их сумма должна быть кратной 7. Под парой понимается два последовательных элемента списка. Также требуется найти минимальное значение произведения таких пар.

Чтобы решить задачу, начнем с чтения содержимого файла и преобразования строк в целые числа. Это позволит создать список чисел, с которым мы сможем работать далее.

a = [int(x) for x in open(’17-3.txt’)]

Создадим пустой список ans, в который будем добавлять произведения пар элементов последовательности, соответствующих условию задачи.

ans = []

Перебираем соседние пары чисел с помощью функции zip, со сдвигом на 1:

for x, y in zip(a, a[1:]):

Для каждой такой пары проверим выполнение двух условий:

1.      Произведение элементов должно быть положительным (x * y > 0).

2.      Сумма элементов должна быть кратной 7 ((x + y) % 7 == 0).

Если оба условия выполняются, добавляем произведение этой пары в список ans.

    if x*y>0 and (x+y)%7==0:

        ans.append(x*y)

После того как все пары будут обработаны, вычислим и выведем на экран длину списка ans, это число — количество подходящих пар, первое число для ответа на задачу, а также вычислим и выведем на экран минимальное произведение среди тех, что были сохранены в списке ans, второе число для ответа на задачу:

print(len(ans), min(ans))

Текст программы полностью:

a = [int(x) for x in open(’17-3.txt’)]

ans = []

for x,y in zip(a,a[1:]):

    if x*y>0 and (x+y)%7==0:

        ans.append(x*y)

print(len(ans), min(ans))

Можно записать перебор пар в файле с помощью индексов, но, чтобы не использовать индексы в записи условий, которые требуется проверить, можно добавить переменные x и y, соответствующие соседним элементам a[i] и a[i+1] в списке. Программа будет выглядеть так:

Запускаем программу, получаем результат:

Ответ:

359   115022

Задача №2 (4305)

В файле 17-3.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -10 000 до 10 000 включительно. Определите и запишите в ответе сначала количество троек элементов последовательности, в которых произведение кратно 7, а сумма оканчивается на 5, затем максимальную из сумм элементов таких троек. В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.

Решение

В 17ой задаче есть важный нюанс: проверка некоторых условий может быть некорректна, если числа отрицательные, это проверка младшей цифры числа и его длины:

Так, в данной задаче, для проверки того, оканчивается ли сумма на 5, необходимо обратить внимание на следующий момент: стандартная операция взятия остатка от деления на 10 (% 10) корректно определяет последнюю цифру числа только для неотрицательных значений. Например, для числа 1234%10 остаток от деления на 10 равен 4, что соответствует последней цифре числа.

Однако для отрицательных чисел ситуация меняется, если мы возьмем эти же числа со знаком минус мы получим совсем другие значения:

Это связано с представлением отрицательных чисел в Python.

Тоже самое касается проверки длины числа, самой простой идеей которого является использование двойного неравенства. Например, для проверки двузначности числа таким условием будет 10 <= х <100, но такой способ подходит только для натуральных чисел. Так, числа -52, -74,-11 также являясь двузначными, не будут соответствовать этому условию.

Поэтому при работе с отрицательными числами необходимо использовать абсолютное значение числа, чтобы корректно проверить последнюю цифру.

При этом проверка кратности работает правильно:

Таким образом, для проверки условия «сумма оканчивается на 5» следует использовать выражение abs(x + y + z) % 10 == 5.

Пишем программу.

Сохраним файл на рабочий стол под именем 17-3.txt. Сначала считаем числа из файла в список a:

a = [int(x) for x in open(’17-3.txt’)]

Создадим пустой список ans, в который будем добавлять произведения пар элементов последовательности, соответствующих условию задачи.

ans = []

Перебираем соседние тройки чисел с помощью функции zip, со сдвигом на 1 и на 2:

for x,y,z in zip(a,a[1:],a[2:]):

Проверяем, что в тройке элементов последовательности произведение элементов кратно 7, а модуль суммы оканчивается на 5. Если условия выполняются, то в список ans мы добавляем сумму этих чисел, то есть x+y+z:

    if x*y*z%7==0 and abs(x+y+z)%10==5:

        ans.append(x+y+z)

В завершение программы выводим длину списка ans, то есть количество сумм подходящих троек, а также максимальную сумму элементов в этом списке, используя функцию max(ans).

print(len(ans), max(ans))

Текст программы полностью:

a = [int(x) for x in open(’17-3.txt’)]

ans = []

for x,y,z in zip(a,a[1:],a[2:]):

    if x*y*z%7==0 and abs(x+y+z)%10==5:

        ans.append(x+y+z)

print(len(ans), max(ans))

Запускаем программу, получаем результат:

Ответ:

153 19285

Задача № 3 (4538)

В файле 17-205.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от –10 000 до 10 000 включительно. Определите количество пар, в которых хотя бы один из двух элементов заканчивается на 7, а их сумма делится на 12. В ответе запишите два числа: сначала количество найденных пар, а затем – максимальную сумму элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.

Решение

Обратим внимание, что здесь требуется найти числа, которые оканчиваются на 7, и, следовательно, для проверки этого условия мы будем использовать модуль числа.

При написании кода также важно учитывать, что условие, связанное с окончанием одного из элементов пары на 7, должно быть заключено в скобки, поскольку оно состоит из двух логических условий, объединенных оператором or. Это позволит Python корректно интерпретировать данное условие.

Начнем с чтения содержимого файла и преобразования строк в целые числа. Это позволит создать список чисел, с которым мы сможем работать далее.

a = [int(x) for x in open(’17-205.txt’)]

Создадим пустой список ans, в который будем добавлять произведения пар элементов последовательности, соответствующих условию задачи.

ans = []

Перебираем соседние пары чисел с помощью функции zip, со сдвигом на 1:

for x, y in zip(a, a[1:]):

Для каждой такой пары проверим выполнение условия «в паре хотя бы один из двух элементов заканчивается на 7, а их сумма делится на 12». Если оба условия выполняются, добавляем сумму чисел, образующих пару в список ans.

    if (abs(x)%10==7 or abs(y)%10==7) and (x+y)%12==0:

        ans.append(x+y)

После того как все пары будут обработаны, вычислим и выведем на экран длину списка ans, это число — количество подходящих пар, первое число для ответа на задачу, а также вычислим и выведем на экран минимальное произведение среди тех, что были сохранены в списке ans, второе число для ответа на задачу:

print(len(ans), max(ans))

Текст программы полностью:

a = [int(x) for x in open(’17-205.txt’)]

ans = []

for x,y in zip(a,a[1:]):

    if (abs(x)%10==7 or abs(y)%10==7) and (x+y)%12==0:

        ans.append(x+y)

print(len(ans), max(ans))

Запускаем программу, получаем результат:

Ответ:

71   17664

Задача № 4 (4656)

В файле 17-4.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от 0 до 10 000 включительно. Определите количество пар, в которых хотя бы один из двух элементов больше, чем среднее арифметическое всех чисел в файле, а их сумма делится на 7. В ответе запишите два числа: сначала количество найденных пар, а затем – минимальную сумму элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.

Решение

Сохраним файл на рабочий стол под именем 17-4.txt. Пишем программу: сначала считаем числа из файла в список a.

a = [int(x) for x in open(’17-4.txt’)]

Прежде чем перебирать пары чисел, для того чтобы ответить на вопрос задачи, надо найти avg – среднее арифметическое всех чисел в файле:

avg = sum(a)/len(a)

Создадим пустой список ans, в который будем добавлять суммы пар элементов последовательности, соответствующих условию задачи.

ans = []

Перебираем соседние пары чисел с помощью функции zip, со сдвигом на 1:

for x,y in zip(a,a[1:]):

Проверяем, что в паре элементов последовательности хотя бы один из двух элементов больше, чем среднее арифметическое всех чисел в файле, а их сумма делится на 7. Если условия выполняется, то в список ans мы добавляем сумму этих чисел, то есть x + y:

    if (x>avg or y>avg) and (x+y)%7==0:

        ans.append(x+y)

В завершение программы выводим длину списка ans, то есть количество сумм подходящих пар, а также минимальную сумму элементов в этом списке, используя функцию min(ans).

print(len(ans),min(ans))

Текст программы полностью:

a = [int(x) for x in open(’17-4.txt’)]

avg = sum(a)/len(a)

ans = []

for x,y in zip(a,a[1:]):

    if (x>avg or y>avg) and (x+y)%7==0:

        ans.append(x+y)

print(len(ans),min(ans))

Запускаем программу, получаем результат:

Ответ:

202 6916

Задача №5 (4688)

В файле 17-243.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от 0 до 10 000 включительно. Определите количество пар чисел, в которых хотя бы один из двух элементов больше, чем наибольшее из всех чисел в файле, делящихся на 19. В ответе запишите два числа: сначала количество найденных пар, а затем – минимальную сумму элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.

Решение

В этой задаче нет отрицательных чисел, поэтому использовать модуль для проверки условия не нужно.

Сохраним файл на рабочий стол под именем 17-243.txt. Пишем программу: сначала считаем числа из файла в список a.

a = [int(x) for x in open(’17-243.txt’)]

Прежде чем перебирать пары чисел, для того чтобы ответить на вопрос задачи, надо найти m – наибольшее из всех чисел в файле, делящихся на 19 – отбираем из списка a все числа, которые делятся на 19, а затем находим максимальное из них:

m = max([x for x in a if x%19==0])

Вычислить число m заранее важно, потому что если указать это условие внутри цикла, перебирающего пары, число будет вычисляться каждый раз заново, что очень удлинит время работы программы.

Создадим пустой список ans, в который будем добавлять суммы пар элементов последовательности, соответствующих условию задачи.

ans = []

Перебираем соседние пары чисел со сдвигом на 1:

for i in range(len(a)-1):

Проверяем, что в паре элементов последовательности хотя бы один из двух элементов больше, чем наибольшее из всех чисел в файле, делящихся на 19, то есть больше, чем число m. Если условия выполняется, то в список ans мы добавляем сумму этих чисел, то есть a[i]+a[i+1]:

    if a[i]>m or a[i+1]>m:

        ans.append(a[i]+a[i+1])

В завершение программы выводим длину списка ans, то есть количество сумм подходящих пар, а также минимальную сумму элементов в этом списке, используя функцию min(ans).

print(len(ans),min(ans))

Текст программы полностью:

a = [int(x) for x in open(’17-243.txt’)]

m = max([x for x in a if x%19==0])

ans = []

for i in range(len(a)-1):

    if a[i]>m or a[i+1]>m:

        ans.append(a[i]+a[i+1])

print(len(ans), min(ans))

Запускаем программу, получаем результат:

Ответ:

34   11169

Задание №6 (4705)

В файле 17-257.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые положительные значения до 10 000 включительно. Необходимо найти сумму минимального и максимального числа среди оканчивающихся на 4 элементов последовательности. Затем программа должна найти и вывести количество пар элементов последовательности, сумма которых меньше найденной суммы, а также наибольшую из этих сумм. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.

Решение

Сохраним файл на рабочий стол под именем 17-257.txt. Пишем программу: сначала считаем числа из файла в список a.

a = [int(x) for x in open(’17-257.txt’)]

Прежде чем перебирать пары чисел, для того чтобы ответить на вопрос задачи, надо найти mn и mx – минимальное и максимальное число среди оканчивающихся на 4 элементов последовательности:

mn = min([x for x in a if x%10==4])

mx = max([x for x in a if x%10==4])

Создадим пустой список ans, в который будем добавлять суммы пар элементов последовательности, соответствующих условию задачи.

ans = []

Перебираем соседние пары чисел с помощью функции zip, со сдвигом на 1:

for x,y in zip(a,a[1:]):

Проверяем, что сумма пары элементов последовательности меньше, чем сумма найденных чисел mn и mx. Если условие выполняется, то в список ans мы добавляем сумму этих чисел, то есть x+y:

    if x+y < mn+mx:

        ans.append(x+y)

В завершение программы выводим длину списка ans, то есть количество сумм подходящих пар, а также максимальную сумму элементов в этом списке, используя функцию max(ans).

print(len(ans), max(ans))

Текст программы полностью:

a = [int(x) for x in open(’17-257.txt’)]

mn = min([x for x in a if x%10==4])

mx = max([x for x in a if x%10==4])

#mn+mx — сумма минимального и максимального оканчивающегося на 4

ans = []

for x,y in zip(a,a[1:]):

    if x+y < mn+mx:

        ans.append(x+y)

print(len(ans), max(ans))

Запускаем программу, получаем результат:

Ответ:

503 10094

Задание № 7(5055)

(Досрочный ЕГЭ-2022) В файле 17-282.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от 0 до 10 000. Определите количество пар элементов последовательности, в которых хотя бы одно число кратно минимальному числу в последовательности, кратному 17. В ответе запишите количество найденных пар, затем максимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.

Решение

В этой задаче нет отрицательных чисел, поэтому использовать модуль для проверки условия не нужно.

Сохраним файл на рабочий стол под именем 17-282.txt. Пишем программу: сначала считаем числа из файла в список a.

a = [int(x) for x in open(’17-282.txt’)]

Прежде чем перебирать пары чисел, для того чтобы ответить на вопрос задачи, надо найти m минимальное число в последовательности, кратное 17:

m = min([x for x in a if x%17==0])

Создадим пустой список ans, в который будем добавлять суммы пар элементов последовательности, соответствующих условию задачи.

ans = []

Перебираем соседние пары чисел с помощью функции zip, со сдвигом на 1:

for x,y in zip(a,a[1:]):

Проверяем, что хотя бы одно из чисел пары кратно минимальному числу в последовательности, кратному 17, то есть числу m. Если условие выполняется, то в список ans мы добавляем сумму этих чисел, то есть x+y:

    if x%m==0 or y%m==0:

        ans.append(x+y)

В завершение программы выводим длину списка ans, то есть количество сумм подходящих пар, а также максимальную сумму элементов в этом списке, используя функцию max(ans).

print(len(ans), max(ans))

Текст программы полностью:

a = [int(x) for x in open(’17-282.txt’)]

m = min([x for x in a if x%17==0])

ans = []

for x,y in zip(a,a[1:]):

    if x%m==0 or y%m==0:

        ans.append(x+y)

print(len(ans), max(ans))

Запускаем программу, получаем результат:

Ответ:

24   17613

Задание №8 (5373) (ЕГЭ-2022)

В файле 17-339.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от –100 000 до 100 000 включительно. Определите количество пар последовательности, в которых сумма элементов меньше минимального положительного элемента последовательности, кратного 19. Гарантируется. что такой элемент в последовательности есть. В ответе запишите количество найденных пар, затем абсолютное значение максимальной из сумм элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.

Решение

Сохраним файл на рабочий стол под именем 17-339.txt. Пишем программу: сначала считаем числа из файла в список a.

a = [int(x) for x in open(’17-339.txt’)]

Прежде чем перебирать пары чисел, для того чтобы ответить на вопрос задачи, надо найти m – минимальный положительный элемент последовательности, кратный 19:

m = min([x for x in a if x>0 and x%19==0])

Создадим пустой список ans, в который будем добавлять суммы пар элементов последовательности, соответствующих условию задачи.

ans = []

Перебираем соседние пары чисел с помощью функции zip, со сдвигом на 1:

for x,y in zip(a,a[1:]):

Проверяем, что сумма элементов меньше найденного числа m. Если условие выполняется, то в список ans мы добавляем сумму этих чисел, то есть x+y:

    if x+y < m:

        ans.append(x+y)

В завершение программы выводим длину списка ans, то есть количество сумм подходящих пар, а также абсолютное значение (то есть модуль) максимальной суммы элементов в этом списке, используя функцию abs(max(ans)).

print(len(ans), abs( max(ans) ))

Текст программы полностью:

a = [int(x) for x in open(’17-339.txt’)]

m = min([x for x in a if x>0 and x%19==0])

ans = []

for x,y in zip(a,a[1:]):

    if x+y < m:

        ans.append(x+y)

print(len(ans), abs( max(ans) ))

Запускаем программу, получаем результат:

Ответ:

4984   696

Задание бонусное (Сборник С.Крылова)

В файле содержится последовательность натуральных чисел. Её элементы могут принимать целые значения от 1 до 100 000 включительно. Определите количество пар последовательности, в которых сумма остатков от деления обоих элементов на 44 равна минимальному элементу последовательности. В ответе запишите количество найденных пар, затем минимальный модуль разности элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.

Решение

Пишем программу: сначала считаем числа из файла в список a.

a = [int(x) for x in open(‘files/17var07.txt’)]

Прежде чем перебирать пары чисел, для того чтобы ответить на вопрос задачи, надо найти mn – минимальный  элемент последовательности:

mn = min(a)

Создадим пустой список ans, в который будем добавлять модули разности элементов пар последовательности, соответствующих условию задачи.

ans = []

Перебираем соседние пары чисел с помощью функции zip, со сдвигом на 1:

for x,y in zip(a,a[1:]):

Проверяем, что сумма элементов сумма остатков от деления обоих элементов на 44 равна найденному минимальному элементу последовательности. Если условие выполняется, то в список ans мы добавляем модуль разности элементов, то есть abs(x-y):

    if x%44 + y%44 == mn:

        ans.append(abs(x-y))

В завершение программы выводим длину списка ans, то есть количество сумм подходящих пар, а также минимальный модуль разности элементов в этом списке, используя функцию min(ans).

print(len(ans), min(ans))

Текст программы полностью:

a = [int(x) for x in open(‘files/17var07.txt’)]

mn = min(a)

ans = []

for x,y in zip(a,a[1:]):

    if x%44 + y%44 == mn:

        ans.append(abs(x-y))

print(len(ans), min(ans))

Запускаем программу, получаем результат:

Ответ:

4984   696

Задание №9 (6757)

(ЕГЭ-2023) В файле 17-379.txt содержится последовательность натуральных чисел. Элементы последовательности могут принимать целые значения от 1 до 100 000 включительно. Определите количество троек последовательности, в которых только одно из чисел является четырёхзначным, а сумма элементов тройки не меньше максимального элемента последовательности, оканчивающегося на 15. В ответе запишите количество найденных троек, затем максимальную из сумм элементов таких троек. В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.

Решение

Обратим внимание, что ситуация, когда требуется найти только одно из чисел, или два, или не более двух, т.е. если в условии есть конкретные указания по количеству чисел, отвечающих характеристикам, то условие необходимо прописать особенным образом: подсчет количества подходящих чисел можно осуществить чрез сумму условий, при этом условия обязательно оборачиваются в скобки. В этом случае мы проверяем значение логической суммы условий.  

Пишем программу: сначала считаем числа из файла в список a.

a = [int(x) for x in open(’17-379.txt’)]

Прежде чем перебирать пары чисел, для того чтобы ответить на вопрос задачи, надо найти m – максимальный элемент последовательности, оканчивающийся на 15:

m = max([x for x in a if x%100==15])

Создадим пустой список ans, в который будем добавлять суммы элементов троек последовательности, соответствующих условию задачи.

ans = []

Перебираем соседние тройки чисел с помощью функции zip, со сдвигом на 1 и на 2:

for x,y,z in zip(a,a[1:],a[2:]):

Проверяем, что в тройке элементов последовательности только одно из чисел является четырёхзначным, а сумма элементов тройки не меньше найденного значения m. Если условия выполняются, то в список ans мы добавляем сумму этих чисел, то есть x+y+z:

    if (1000<=x<10000) + (1000<=y<10000) + (1000<=z<10000) == 1  and x+y+z>=m:

        ans.append(x+y+z)

В завершение программы выводим длину списка ans, то есть количество сумм подходящих троек, а также максимальную из сумм элементов троек в этом списке, используя функцию max (ans).

print(len(ans), max(ans))

Текст программы полностью:

a = [int(x) for x in open(’17-379.txt’)]

m = max([x for x in a if x%100==15])

ans = []

for x,y,z in zip(a,a[1:],a[2:]):

    if (1000<=x<10000) + (1000<=y<10000) + (1000<=z<10000) == 1  and x+y+z>=m:

        ans.append(x+y+z)

print(len(ans), max(ans))

Запускаем программу, получаем результат:

Ответ:  

299   196183

Задание №11 (23376)

В файле содержится последовательность целых чисел. Её элементы последовательности могут принимать целые значения от –100 000 до 100 000 включительно. Определите количество пар последовательности, в которых только один из этих элементов является пятизначным числом, а квадрат суммы элементов пары превышает квадрат максимального пятизначного элемента последовательности, оканчивающегося на 37. В ответе запишите количество найденных пар, затем – максимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.

Решение

Пишем программу: сначала считаем числа из файла в список a.

a = [int(x) for x in open(‘files/17_23376.txt’)]

Прежде чем перебирать пары чисел, для того чтобы ответить на вопрос задачи, надо найти mx – максимальный пятизначный элемент последовательности, оканчивающийся на 37:

mx = max([x for x in a if 10000<=abs(x)<100000 and abs(x)%100==37])

Создадим пустой список ans, в который будем добавлять суммы элементов пар последовательности, соответствующих условию задачи.

ans = []

Перебираем соседние пары чисел с помощью функции zip, со сдвигом на 1:

for x,y in zip(a,a[1:]):

Проверяем, что в паре элементов последовательности только один из этих элементов является пятизначным числом, а квадрат суммы элементов пары превышает квадрат найденного значения mx. Если условия выполняются, то в список ans мы добавляем сумму пары чисел, то есть x+y:

    if (10000<=abs(x)<100000)+(10000<=abs(y)<100000)==1 and (x+y)**2>mx**2:

        ans.append(x+y)

В завершение программы выводим длину списка ans, то есть количество сумм подходящих пар, а также максимальную из сумм элементов пар в этом списке, используя функцию max (ans).

print(len(ans),max(ans))

Текст программы полностью:

a = [int(x) for x in open(‘files/17_23376.txt’)]

mx = max([x for x in a if 10000<=abs(x)<100000 and abs(x)%100==37])

ans = []

for x,y in zip(a,a[1:]):

    if (10000<=abs(x)<100000)+(10000<=abs(y)<100000)==1 and (x+y)**2>mx**2:

        ans.append(x+y)

print(len(ans),max(ans))

Запускаем программу, получаем результат:

Ответ: 

350 107294