Задание 25. Информатика. Поляков-6836

(А. Богданов) Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины, в том числе «*» может задавать и пустую последовательность.
Например, маске \(123*4?5\) соответствуют числа \(123405\) и \(12300425\).
Среди десятиразрядных чисел, кратных \(2023\) и соответствующих маске «\(1*1\)», найдите числа с максимальной суммой цифр. В ответ запишите найденные числа в порядке убывания, справа от каждого числа запишите частное от деления на \(2023\).

Решение:

Python


def dig_sum(number):
    s = 0
    while number:
        s += number % 10
        number //= 10
    return s


n = 1999999991 - 1999999991 % 2023        # самое большое десятизначное число 1*, делящееся на 2023

while True:                               # находим самое большое десятизначное 1*1, делящееся на 2023
    if n % 10 == 1:
        break
    n -= 2023

nums = []                                 # сюда соберём все десятизначные числа вида 1*1, делящиеся на 2023

for i in range(n, 999999999, -20230):    # все такие числа находятся друг от друга на расстоянии 20230
    nums.append(i)                        # их не больше 50 000, не так много :)

nums_dig_sum = [dig_sum(n) for n in nums] # считаем суммы цифр каждого такого числа
max_sums = max(nums_dig_sum)              # находим максимальную такую сумму

for i in range(len(nums)):                # печатаем только числа с максимальной суммой, найденной ранее
    if nums_dig_sum[i] == max_sums:
        print(nums[i], nums[i] // 2023)

Ответ:
\(1999769891\) \(988517\)
\(1895989991\) \(937217\)