Задание 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)

Результат работы программы

25 задание демо 24 результат

Ответ

Пример 1(Время не более 20 минут)

142157664 70236
1021575544 504731
1121571264 554136
1221577104 603546
1321572824 652951
1421578664 702361
1521574384 751766
1621570104 801171
1721575944 850581
1821571664 899986
1921577504 949396

 

Яндекс.Метрика