Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Среди натуральных чисел, не превышающих , найдите все числа, соответствующие маске ?
?
* и делящиеся на
без остатка. В ответе запишите количество найденных чисел.
Решение через циклы
ans = 0
for i in range(1, 10): # для первого вопроса исключаем 0 - число не может начинаться с 0
for j in range(10):
# пустая звёздочка
s = str(i) + ’3579’ + str(j) + ’6’
if int(s) % 7 == 0:
ans += 1
#односимвольная звёздочка
for w in range(10):
s1 = str(i) + ’3579’ + str(j) + ’6’ + str(w)
if int(s1)%7 == 0:
ans += 1
#двухсимвольная звёздочка
for w in range(10):
for z in range(10):
s2 = str(i) + ’3579’ + str(j) + ’6’ + str(w) + str(z)
if int(s2)%7 == 0:
ans += 1
print(ans)
Решение через itertools
from itertools import product # импортируем product из itertools
digits = ’0123456789’ #все возможные цифры
d = ’123456789’ # цифры для первого вопроса, он стоит на первом месте, число не может начинаться с нуля
ans = [] # список всех подходящих чисел под маску
for digit_1 in product(d,repeat = 1): # формируем вопрос
for digit_2 in product(digits,repeat = 1): # формируем вопрос
for i in range(4): # делаем перебор для звёздочки, в нашем случае, в звёздочке не может быть более 3 цифр и при этом чтобы число было меньше 10**9
for digit_3 in product(digits,repeat = i): # формируем звёздочку
ans += [int(’’.join(digit_1) + ’3579’ + ’’.join(digit_2) + ’6’ + ’’.join(digit_3))] # собираем по частям число, удовлетворяющее маске
count = 0 # итоговый счётчик
for x in sorted(set(ans)): # проход по множеству получившихся чисел
if x <= 10**9 and x % 7 == 0: # если число не больше 10**9 и при этом кратно 7
count += 1
print(count) # вывод ответа