Тема 25. Обработка целочисленной информации

25.03 Маски

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела обработка целочисленной информации
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 81#86469Максимум баллов за задание: 1

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

– символ «?» означает ровно одну произвольную цифру;

– символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

Среди натуральных чисел, не превышающих 108  , найдите все числа, которые являются полными квадратами, соответствуют маске 82??9* и имеют более 25 делителей.

В ответ запишите найденные числа в порядке возрастания через пробел.

Показать ответ и решение
for x in range(10**4, 10**8+1):
    c = set()
    s = str(x)
    if s[:2] == ’82’ and s[4] == ’9’ and x**0.5 == int(x**0.5): # проверка, что число соответствует маске и что у числа есть целый корень, только у таких чисел нечётное кол-во делителей
        for i in range(1, int(x**0.5)+1):
            if x % i == 0:
                c.add(i)
                c.add(x//i)
    if len(c) > 25:
        print(x)

Ответ: 8236900 82119844 82519056 82719025 82919236

Ошибка.
Попробуйте повторить позже

Задача 82#86470Максимум баллов за задание: 1

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

– символ «?» означает ровно одну произвольную цифру;

– символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

Среди натуральных чисел, не превышающих 107  , найдите все числа, соответствующие маске 3*4?50, а количество четных цифр числа больше количества нечетных.

В ответ запишите одно число – количество найденных чисел.

Показать ответ и решение
t = []
for x in range(10**4, 10**7+1):
    s = str(x)
    cht = [int(i) for i in s if int(i) % 2 == 0] # количество чётных цифр в числе
    ncht = [int(i) for i in s if int(i) % 2 != 0] # количество нечётных цифр в числе
    if (s[0] == ’3’) and (s[-2:] == ’50’) and (s[-4] == ’4’) and len(cht) > len(ncht):  # проверка, что число соответствует маске и что, кол-во чётных цифр больше кол-ва нечётных цифр
        t.append(x)
print(len(t))

Ответ: 530

Ошибка.
Попробуйте повторить позже

Задача 83#88285Максимум баллов за задание: 1

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

1) символ «?» означает ровно одну произвольную цифру;

2) символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих  109  , найдите все числа, соответствующие маске 1*3577?0, делящиеся на 1975 без остатка. В ответе запишите все найденные числа в порядке возрастания, и через пробел – соответствующие им результаты деления этих чисел на 1975.

Формат ввода ответа: найденное_число1 результат_деления1 найденное_число2 результат_деления2 и так далее.

Показать ответ и решение

Решение через fnmatch

from fnmatch import fnmatch
# для оптимизации делаем цикл с шагом 1975, начиная с числа кратного 1975, для того чтобы проходиться по числам кратным 1975
for x in range(1358800,10**9+1,1975):
    if fnmatch(str(x),’1*3577?0’): # проверка, что число соответствует маске
        print(x,x//1975)

Решение через itertools

’’’
Идея решения заключается в том, чтобы по частям собирать число, удовлетворяющее маске
и затем проверять его на кратность.
Такое решение оптимальнее по времени поскольку мы не проверяем числа не подходящие по маске,
а сразу составляем те,
что нам подходят.
’’’

from itertools import product#импортируем модуль product из itertools
digits = ’0123456789’#всевозможные цифры
res = []#список, в который мы будем сохранять числа
for i in range(3):#проведя анализ, можно понять, что в звёздочке не может быть больше двух цифр,
    #по этой причине делаем цикл от 0 до 2 включительно.
    for digit_1 in product(digits,repeat = i):#делаем произвольную подпоследовательность из цифр,
        #таким способом, мы симулируем звёздочку
        for digit_2 in product(digits,repeat = 1):#такой записью, мы симулируем знак вопроса
            res += [int(’1’ + ’’.join(digit_1) + ’3577’ + ’’.join(digit_2) + ’0’)]
            #собираем нашу маску по частям, функция join переводит элементы кортежа, списка в строку.
for x in sorted(set(res)):#проходимся по всем получившимся числам
    if x <= 10**9 and x % 1975 == 0:
        print(x,x//1975)#вывод числа и его частного

Решение через срезы

# для оптимизации делаем цикл с шагом 1975, начиная с числа кратного 1975, для того чтобы проходиться по числам кратным 1975
for x in range(1358800,10**9+1,1975):
    n = str(x)
    if n[0] == ’1’ and n[-1] == ’0’ and ’3577’ in n[-6:-2]: # проверка, что число соответствует маске
        print(x,x//1975)

Ответ: 106357700 53852 112357750 56890 185357700 93852 191357750 96890

Ошибка.
Попробуйте повторить позже

Задача 84#88286Максимум баллов за задание: 1

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

1) символ «?» означает ровно одну произвольную цифру;

2) символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих  107  , найдите все числа, соответствующие маске 2*56??, делящиеся на 2048 без остатка, у которых более 5 делителей, соответствующих маске 1*4. В ответе запишите все найденные числа в порядке возрастания, и через пробел – соответствующие им результаты деления этих чисел на 2048.

Показать ответ и решение

Решение через fnmatch

from fnmatch import fnmatch
def divs(x):#функция поиска делителей для определенного числа
    d = set()
    for i in range(1,int(x**0.5)+1):
        if x % i == 0:
            d |= {i,x//i}
    return sorted(d)
# для оптимизации делаем цикл с шагом 2048, начиная с числа кратного 2048, для того чтобы проходиться по числам кратным 2048
for x in range(4096,10**7+1,2048):
    if fnmatch(str(x),’2*56??’):#если число удовлетворяет маске числа
        d = [i for i in divs(x) if fnmatch(str(i),’1*4’)]#делаем список,в котором будут делители,
        #удовлетворяющие маске делителей.
        if len(d) > 5:
            print(x,x//2048)

Решение через itertools

from itertools import product
def divs(x): #функция поиска делителей для определенного числа
    d = set()
    for i in range(1,int(x**0.5)+1):
        if x % i == 0:
            d |= {i,x//i}
    return sorted(d)
digits = ’0123456789’
res = []#список, в котором будут числа удовлетворяющие маске числа
need_div = []#список, в котором будут числа удовлетворяющие маске делителей
#формирование чисел по определенной маске чисел
for i in range(3):
    for digit_1 in product(digits,repeat = i): # cимулируем звёздочку
        for digit_2 in product(digits,repeat = 1): # симулируем вопрос
            for digit_3 in product(digits,repeat = 1): # симулируем вопрос
                res += [int(’2’ + ’’.join(digit_1) + ’56’ + ’’.join(digit_2) + ’’.join(digit_3))]
#формирование чисел по определенной маске делителей
for i in range(6):
    for digit_1 in product(digits,repeat = i): # симулируем звёздочку
        need_div += [int(’1’+’’.join(digit_1) + ’4’)]
for x in sorted(set(res)):#проход по всевозможным получившимся числам
    if x <= 10**7 and x % 2048 == 0:
        d = [i for i in divs(x) if i in need_div]#список, в котором будут делители числа,
        # удовлетворяющие маске делителей
        if len(d) > 5:#если таких делителей больше 5
            print(x,x//2048)

Решение через срезы

def divs(x): # функция, которая возвращает список делителей числа
    d = set()
    for i in range(1,int(x**0.5)+1):
        if x % i == 0:
            d.add(i)
            d.add(x//i)
    return sorted(d) # возвращаем отсортированный список делителей

# для оптимизации делаем цикл с шагом 2048, начиная с числа кратного 2048, для того чтобы проходиться по числам кратным 2048
for x in range(26624,10**7+1,2048):
    n = str(x)
    if n[0] == ’2’ and ’56’ in n[-4:-2]: # проверка, что число соответствует маске
        d = [i for i in divs(x) if str(i)[0] == ’1’ and str(i)[-1] == ’4’] # список делителей числа, которые удовлетворяют маске делителей
        if len(d) > 5: # если таких делителей больше 5
            print(x,x//2048)

Ответ: 2715648 1326

Ошибка.
Попробуйте повторить позже

Задача 85#88287Максимум баллов за задание: 1

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

1) символ «?» означает ровно одну произвольную цифру;

2) символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих  109  , найдите все числа, соответствующие маске 3*3?12, делящиеся на 3952 без остатка, у которых также сумма цифр числа является нечётной. В ответе запишите первые пять чисел в порядке возрастания, и через пробел – соответствующие им результаты деления этих чисел на 3952.

Показать ответ и решение

Решение через fnmatch

Способ решения 1:
from fnmatch import fnmatch
count = 0
# для оптимизации делаем цикл с шагом 3952, начиная с числа кратного 3952, для того чтобы проходиться по числам кратным 3952
for x in range(35568,10**9+1,3952):
# проверка, что число соответствует маске и выполняет все условия
    if fnmatch(str(x),’3*3?12’) and sum(map(int,str(x))) % 2 != 0:
        count += 1
        print(x,x//3952)
        if count > 4:
            break

Решение через itertools

from itertools import product # импортируем product из itertools
digits = ’0123456789’ #все возможные цифры
res = [] # список всех подходящих чисел под маску
for i in range(5): # делаем перебор для звёздочки
    for digit_1 in product(digits,repeat = i): # симулируем звёздочку
        for digit_2 in product(digits,repeat = 1): # симулируем вопрос
            res += [int(’3’+’’.join(digit_1) + ’3’ + ’’.join(digit_2) + ’12’)]
for x in sorted(set(res)):
    if x <= 10**9 and x % 3952 == 0 and sum(map(int,str(x))) % 2 != 0:
        print(x,x//3952)


Решение через срезы

# для оптимизации делаем цикл с шагом 3952, начиная с числа кратного 3952, для того чтобы проходиться по числам кратным 3952
for x in range(35568,10**9,3952):
    n = str(x)
    # проверка, что число соответствует маске и выполняет все условия
    if n[0] == ’3’ and ’12’ in n[-2:] and n[-4] == ’3’ and sum(map(int,n)) % 2 != 0:
        print(x,x//3952)

Ответ: 303043312 76681 305513312 77306 306303712 77506 323593712 81881 332683312 84181

Ошибка.
Попробуйте повторить позже

Задача 86#88288Максимум баллов за задание: 1

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

1) символ «?» означает ровно одну произвольную цифру;

2) символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

3) символ «&» означает любую последовательность нечётных цифр произвольной длины; в том числе «&» может задавать и пустую последовательность.

Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих 1010  , найдите все числа, соответствующие маске &123*321?, делящиеся на 2004 без остатка. В ответе запишите первые пять чисел в порядке возрастания, и через пробел – соответствующие им результаты деления этих чисел на 2004.

Формат ввода ответа: найденное_число1 результат_деления1 найденное_число2 результат_деления2 и так далее.

Показать ответ и решение
from itertools import product # импортируем product из itertools
digits = ’0123456789’ #все возможные цифры
odd_digits = ’13579’ # нечётные цифры
res = [] # список всех подходящих чисел под маску
for i in range(4): # делаем перебор для &
    for digit_1 in product(odd_digits,repeat = i): # симулируем амперсант
        for j in range(4): # делаем перебор для звёздочки
            for digit_2 in product(digits,repeat = j): # симулируем звёздочку
                for digit_3 in product(digits,repeat = 1): # симулируем вопрос
                    res += [int(’’.join(digit_1) + ’123’ + ’’.join(digit_2) + ’321’ + ’’.join(digit_3))]
for x in sorted(set(res)):
    if x <= 10**10 and x % 2004 == 0:
        print(x,x//2004)

Ответ: 123853212 61803 1230063216 613804 1231063212 614303 1235073216 616304 1236073212 616803

Ошибка.
Попробуйте повторить позже

Задача 87#136550Максимум баллов за задание: 1

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

– символ «?» означает ровно одну произвольную цифру;

– символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

Среди натуральных чисел, не превышающих 1010  , найдите все числа, соответствующие маске 1?2157*4, делящиеся на 2024 без остатка.

В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им результаты деления на 2024.

Формат записи ответа: Найденное_число1 частное_от_деления_на_2024_1 Найденное_число2 частное_от_деления_на_2024_2 и тд.

Показать ответ и решение

Решение с помощью fnmatch:

Чтобы проверить соответствие чисел маске, используем стандартный модуль fnmatch, который поддерживает символы ? и *. Так как число должно делиться на 2024, будем перебирать только числа, кратные 2024, то есть использовать шаг 2024 в цикле range. Для каждого такого числа проверяем, подходит ли оно под маску "1?2157*4" с помощью fnmatch. Если подходит, выводим само число и частное от его деления на 2024.

# Импортируем функцию fnmatch для проверки по маске
from fnmatch import fnmatch

# Перебираем все числа, кратные 2024, до 10**10
for x in range(0, 10**10 + 1, 2024):
    # Проверяем соответствие маске "1?2139*4"
    if fnmatch(str(x), ’1?2157*4’):
        # Если подходит, выводим число и частное от деления на 2023
        print(x, x // 2024)

Ответ: 142157664 70236 1021575544 504731 1121571264 554136 1221577104 603546 1321572824 652951 1421578664 702361 1521574384 751766 1621570104 801171 1721575944 850581 1821571664 899986 1921577504 949396
Рулетка
Вы можете получить скидку в рулетке!