25.03 Маски
Готовиться с нами - ЛЕГКО!
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
– символ «?» означает ровно одну произвольную цифру;
– символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих , найдите все числа, которые являются полными квадратами,
соответствуют маске 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)
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
– символ «?» означает ровно одну произвольную цифру;
– символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих , найдите все числа, соответствующие маске 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))
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
1) символ «?» означает ровно одну произвольную цифру;
2) символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих ,
найдите все числа, соответствующие маске 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)
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
1) символ «?» означает ровно одну произвольную цифру;
2) символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих ,
найдите все числа, соответствующие маске 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)
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
1) символ «?» означает ровно одну произвольную цифру;
2) символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих ,
найдите все числа, соответствующие маске 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)
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
1) символ «?» означает ровно одну произвольную цифру;
2) символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
3) символ «&» означает любую последовательность нечётных цифр произвольной длины; в том числе «&» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих
, найдите все числа, соответствующие маске &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)
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
– символ «?» означает ровно одну произвольную цифру;
– символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих , найдите все числа, соответствующие маске 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)