Задание 25
Пример 1
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
– символ «?» означает ровно одну произвольную цифру;
– символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 1010, найдите все числа, соответствующие маске 1?2157*4, делящиеся на 2024 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие им результаты деления этих чисел на 2024.
Количество строк в таблице для ответа избыточно.
Ответ:
... | ... |
Теория
Данное задание проверяет умение создавать собственные программы (10–20 строк) для обработки целочисленной информации. Задача заключается в поиске данных, удовлетворяющих определенным критериям. Нахождение минимального или максимального значение и работа с циклами. В ответе необходимо указать большое количество чисел - самое сложное в задаче (упражнение на правильность перенесения в бланк 😉). При решении задач с маской числа можно использовать прямое решение - перебрать в циклах все возможные варианты, написать свою функцию - проверки соответствия маске или воспользоваться модулем fnmatch.
Решение
Пример 1
1-й способ: Символ «?» означает ровно одну произвольную цифру - от 0 до 9, а символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность. Алгоритм "в лоб" - сделать цикл по символам ? и вложенные по знаку «*» (сначала - 0 цифр, потом 1 цифра и наконец 2 цифры). Проанализировав заданную маску 1?2157*4 легко увидеть что знак «*» максимально 3 цифры, т.е. 0≤*≤3 символов. Далее преобразуем строку в число и проверяем делимость. Программа (Python)
#цикл по знаку вопроса (q1) - 1?2157*4 ровно один символ от 0 до 9
for q1 in range(0,10):
#формируем строку по шаблону и преобразуем ее в число когда * - 0 цифр
num = int('1'+str(q1)+'21574')
if num%2024 == 0:
print(num, num/2024)
for q1 in range(0,10):
#перебираем вариант, когда * ровно 1 цифра от 0 до 9
for a1 in range(0,10):
num = int('1'+str(q1)+'2157'+str(a1)+'4')
if num%2024 == 0:
print(num, num/2024)
for q1 in range(0,10):
#перебираем вариант, когда * ровно 2 цифры от 0 до 9
for a1 in range(0,10):
for a2 in range(0,10):
num = int('1'+str(q1)+'2157'+str(a1)+str(a2)+'4')
if num%2024 == 0:
print(num, num/2024)
for q1 in range(0,10):
#перебираем вариант, когда * ровно 3 цифры от 0 до 9
for a1 in range(0,10):
for a2 in range(0,10):
for a3 in range(0,10):
num = int('1'+str(q1)+'2157'+str(a1)+str(a2)+str(a3)+'4')
if num%2024 == 0:
print(num, num/2024)
2-й способ (пользовательская функция). Пишем функцию, которая проверяет входящую строку на соответствие шаблону и возвращает True или False. Для быстроты в цикле перебираем только числа кратные 2024. Программа (Python)
def matchmask(s):
if s[0]=='1' and s[2:6]=='2157' and s[len(s)-1]=='4':
return True
else: return False
for i in range (2024,10**10+1,2024):
if matchmask(str(i)): print(i, i/2024)
3-й способ (модуль fnmatch и функция fnmatch). Аналогично 2-му способу, только используем функцию fnmatch из модуля fnmatch, которая проверяет входящую строку на соответствие шаблону и возвращает True или False. Для быстроты в цикле также перебираем только числа кратные 2024. Программа (Python)
from fnmatch import *
for i in range(2024, 10**10+1, 2024):
if fnmatch(str(i), '1?2157*4'): print(i, i/2024)
Результат работы программы
Ответ
Пример 1: (Время не более 20 минут)
142157664 | 70236 |
1021575544 | 504731 |
1121571264 | 554136 |
1221577104 | 603546 |
1321572824 | 652951 |
1421578664 | 702361 |
1521574384 | 751766 |
1621570104 | 801171 |
1721575944 | 850581 |
1821571664 | 899986 |
1921577504 | 949396 |