В файле содержится последовательность целых чисел.
Элементы последовательности могут принимать целые значения от −100 000 до 100 000 включительно.
Определите количество пар последовательности, в которых сумма цифр только одного из элементов кратна 5, а модуль разности квадратов элементов пары не меньше куба максимального элемента последовательности, являющегося трёхзначным числом.
В ответе запишите количество найденных пар чисел, затем максимальную из сумм элементов таких пар.
В данной задаче под парой подразумевается два идущих подряд элемента последовательности.
Решение
🔹 Шаг 1. Считываем числа из файла
f = open("17.txt")
nums = [int(x) for x in f]
# 1. сумма цифр числа
def digit_sum(x):
x = abs(x)
s = 0
while x:
s += x % 10
x //= 10
return s
# 2. максимальное трёхзначное число
max_3 = max(x for x in nums if 100 <= x <= 999)
# 3. куб этого максимума — порог для разности квадратов
limit = max_3 ** 3
count = 0
max_sum = -10 ** 18
# 4. проверка пар соседних элементов
for i in range(len(nums) - 1):
a, b = nums[i], nums[i + 1]
d5 = (digit_sum(a) % 5 == 0) + (digit_sum(b) % 5 == 0)
if d5 == 1 and abs(a * a - b * b) >= limit:
count += 1
s = a + b
if s > max_sum:
max_sum = s
# 5. вывод результата
print(count, max_sum)
📌 Что происходит:
Теперь
nums — это вся числовая последовательность.
🔹 Шаг 2. Пишем функцию суммы цифр
def digit_sum(x):
x = abs(x)
s = 0
while x:
s += x % 10
x //= 10
return s
📌 Что происходит: пишем функцию суммы цифр: берём модуль числа и складываем цифры справа налево (x % 10, затем x //= 10). Так удобно проверять, кратна ли сумма цифр 5.
🔹 Шаг 3. Находим максимальное трёхзначное число
max_3 = max(x for x in nums if 100 <= x <= 999)
📌 Что происходит: среди трёхзначных элементов последовательности выбираем максимальный. Его куб станет порогом для модуля разности квадратов пары.
🔹 Шаг 4. Считаем куб опорного максимума
limit = max_3 ** 3
📌 Что происходит: возводим найденный максимум в куб — это порог для модуля разности квадратов элементов пары.
🔹 Шаг 5. Подготавливаем переменные для подсчёта
count = 0
max_sum = -10 ** 18
📌 Что означает:
count — количество подходящих пар (или троек);
max_sum — лучший найденный результат (сумма или квадрат суммы), пока неизвестен.
🔹 Шаг 6. Проверяем пары соседних элементов
for i in range(len(nums) - 1):
a, b = nums[i], nums[i + 1]
d5 = (digit_sum(a) % 5 == 0) + (digit_sum(b) % 5 == 0)
if d5 == 1 and abs(a * a - b * b) >= limit:
count += 1
s = a + b
if s > max_sum:
max_sum = s
📌 Что происходит: перебираем соседние пары (nums[i], nums[i+1]). Подходит пара, где сумма цифр ровно одного элемента кратна 5, а модуль разности квадратов не меньше куба опорного трёхзначного максимума; обновляем count и максимальную сумму.
🔹 Шаг 7. Выводим ответ
print(count, max_sum)
📌 Что выводим: сначала количество найденных пар (или троек), затем второе число из ответа по условию (для этого варианта: 3771 189199).