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