Автор: Досрочная волна 2025
Уровень: Базовый
Напишите программу, которая перебирает целые числа, бóльшие 1 125 000, в порядке возрастания и ищет среди них такие, у которых
есть натуральный делитель, оканчивающийся на цифру 7 и не равный ни самому числу, ни числу 7. В ответе запишите в первой строке таблицы первые пять найденных чисел в порядке возрастания, а во втором столбце – наименьший делитель для каждого из них, оканчивающийся цифрой 7, не равный ни самому числу, ни числу 7.
Относительно базовая задача 25 номера, но надо добавить этот разбор на канал для объективности, так как примеры ФИПИшных задач в списке разборов отсутствуют..
def divisors(x):
div = []
for j in range(1, int(x**0.5)+1):
if x % j == 0:
div += [j, x // j]
return sorted(set(div))
cnt = 0
for x in range(1_125_000+1, 10**10):
div = [j for j in divisors(x) if j != x and j % 10 == 7 and j != 7]
if len(div) > 0:
print(x, min(div))
cnt += 1
if cnt == 5:
break
Ответ:
1125003 467
1125006 97
1125009 17
1125011 3187
1125012 177
def divisors(x):
Определение функции divisors, которая находит все делители числа x.
div = []
Создание пустого списка для хранения делителей числа x.
for j in range(1, int(x*0.5)+1):
Цикл от 1 до квадратного корня из x (оптимизация для поиска делителей).
if x % j == 0:
Проверка, является ли j делителем x (если остаток от деления равен 0).
div += [j, x // j]
Добавление в список делителей как j, так и x/j (парный делитель).
return sorted(set(div))
Возврат отсортированного списка уникальных делителей (set удаляет дубликаты).
cnt = 0
Инициализация счетчика найденных чисел.
for x in range(1_125_000+1, 10*10):
Цикл по числам от 1_125_001 до 10**10.
div = [j for j in divisors(x) if j != x and j % 10 == 7 and j != 7]
Создание списка делителей числа x, которые не равны самому x, оканчиваются на 7 и не равны 7.
if len(div) > 0:
Проверка, есть ли подходящие делители в списке.
print(x, min(div))
Вывод числа x и его минимального подходящего делителя.
cnt += 1
Увеличение счетчика найденных чисел.
if cnt == 5:
Проверка, найдено ли уже 5 чисел.
break
Прерывание цикла, если найдено 5 чисел.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Автор: Л. Шастин
Уровень: Сложный
Определите наибольший номер строки таблицы, для чисел которой выполнены оба условия:
– числа в строке расположены в порядке неубывания;
– в строке есть повторяющиеся числа с чётной суммой цифр.
Аудио с пояснением к коду решения оставлю в комментариях.
R = []
for n, s in enumerate(open('9.csv'), 1):
M = [int(x) for x in s.split(';')]
if M == sorted(M):
if any(M.count(x) > 1 and sum(map(int, str(x))) % 2 == 0 for x in M):
R.append(n)
print(max(R))
Ответ: 6937
R = []
- Создаём пустой список R для хранения номеров строк, которые будут соответствовать условиям.
for n, s in enumerate(open('9.csv'), 1):
- Начинаем цикл по каждой строке файла 9.csv, считывая одновременно её содержание s и устанавливая номер строки n, начиная с 1.
M = [int(x) for x in s.split(';')]
- Преобразуем строку s, разделённую по символу ;, в список целых чисел M.
if M == sorted(M):
- Проверяем, является ли список M отсортированным по возрастанию.
if any(M.count(x) > 1 and sum(map(int, str(x))) % 2 == 0 for x in M):
- Проверяем, есть ли в списке M повторяющиеся элементы x, сумма цифр которых чётная.
R.append(n)
- Добавляем номер строки n в список R, если выполняются условия выше.
print(max(R))
- Выводим максимальный номер строки из списка R, соответствующий требуемым условиям.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥7 3 3 3👍1