Тип 1. Маска числа
Задача 25 из «Демонстрационный вариант контрольных измерительных материалов
единого государственного экзамена 2023 года
по ИНФОРМАТИКЕ»
Условие:
Назовём маской числа последовательность цифр, в которой также могут
встречаться следующие символы:
– символ «?» означает ровно одну произвольную цифру;
– символ «*» означает любую последовательность цифр произвольной
длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 1010, найдите все числа,
соответствующие маске 1?2139*4, делящиеся на 2023 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа
в порядке возрастания, а во втором столбце – соответствующие им
результаты деления этих чисел на 2023.
Количество строк в таблице для ответа избыточно
Решение:
#123*4?5
a = 1230405//2023
b = 2023*a
for i in range(b,10000000000,2023):
b = str(i)
if b[0] == '1' and b[1] == '2' and b[2] == '3' and b[-1] == '5' and b[-3] == '4':
print(i,' | ',end='')
print(i/2023)
Редкий случай с 2 или более звездочками
# Найти числа по маске 1*0*7 не больше 1000000000 кратные 202039
# 1 создаем список до 999 с нулями впереди
b = []
n = 999
for i in range(n+1):
stri = str(i)
b.append(stri)
delt = len(str(n))-len(stri)
while delt > 0:
b.append(delt * '0' + stri)
delt = delt - 1
# 2 сама программа
for i in b:
for j in b:
c = '1'+ i + '0' + j + '7'
if len(c)<=9 and int(c) % 202039 == 0:
print(c)
Тип 2. Делители числа
Простые задачи (маленький диапазон):
Пример 1. Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [245 690; 245 756] простые числа. Выведите на экран все найденные простые числа в порядке возрастания, слева от каждого числа выведите его порядковый номер в последовательности. Каждая пара чисел должна быть выведена в отдельной строке.
Например, в диапазоне [5; 9] ровно два различных натуральных простых числа — это числа 5 и 7, поэтому для этого диапазона вывод на экране должна содержать следующие значения:
1 5
3 7
Примечание. Простое число — натуральное число, имеющее ровно два различных натуральных делителя — единицу и самого себя.
Неоптимальное решение (простое в написании)
for n in range(245690,245756):
k = 0
for i in range(1,n+1):
if n % i == 0:
k = k + 1
if k == 2:
print(n)
print('=======================')
Оптимальное решение (но сложное в написании)
import math
for n in range(245690,245756):
nn = int(math.sqrt(n))
k = 0
for i in range(1,nn+1):
if n % i == 0:
k = k + 1
if int(n/i) != i:
k = k + 1
if k > 2:
break
if k == 2:
print(n)
print('=======================')
Пример 2. Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [210 235; 210 300], числа, имеющие ровно четыре различных натуральных делителя, не считая единицы и самого числа. Для каждого найденного числа запишите эти четыре делителя в четыре соседних столбца на экране с новой строки. Делители в строке должны следовать в порядке возрастания.
Например, в диапазоне [10; 16] ровно четыре различных натуральных делителя имеет число 12, поэтому для этого диапазона вывод на экране должна содержать следующие значения:
2 3 4 6
Неоптимальное решение (простое в написании)
for n in range(210235,210300):
k = 0
m = []
for i in range(2,n):
if n % i == 0:
k = k + 1
m.append(i)
if k == 4:
print(n)
print(m)
print('=======================')
Оптимальное решение (но сложное в написании)
import math
for n in range(210235,210300):
nn = int(math.sqrt(n))
k = 0
m = []
for i in range(2,nn):
if n % i == 0:
a = i
k = k + 1
m.append(a)
b = int(n/i)
if b != a:
k = k + 1
m.append(b)
if k > 4:
break
if k == 4:
print(n)
print(m)
print('=======================')
Сложные задачи (большой диапазон):
Пример 1. Найдите все натуральные числа, принадлежащие отрезку [45 000 000; 50 000 000], у которых ровно пять различных нечётных делителей (количество чётных делителей может быть любым). В ответе перечислите найденные числа в порядке возрастания.
import math, datetime
for n in range(45000000,46000000+1):
nn = int(math.sqrt(n))
k = 0
m = []
for i in range(1,nn+1):
if n % i == 0:
a = i
b = int(n/i)
if a%2 != 0:
k = k + 1
m.append(a)
if b%2 != 0 and b != i:
k = k + 1
m.append(b)
if k > 5:
break
if k == 5:
print(n)
print(m)
print('=======================)
Интересная задача с функцией
Пусть M(N) — произведение 5 наименьших различных натуральных делителей натурального числа N, не считая единицы. Если у числа N меньше 5 таких делителей, то M(N) считается равным нулю.
Найдите 5 наименьших натуральных чисел, превышающих 200 000 000, для которых 0 < M(N) < N. В ответе запишите найденные значения M(N) в порядке возрастания соответствующих им чисел N.
def m(n):
k = 0
m = 1
for i in range(2,n+1):
if n%i == 0:
k = k + 1
m = m * i
if k == 5:
break
if k < 5:
rez = 0
else:
rez = m
return(rez)
k = 0
for i in range(200000001,300000000):
f = m(i)
if 0 < f and f < i:
k = k + 1
print(i,'===',f)
if k == 5:
print('===========');
break
Ответ
- 1728
- 21632
- 1260
- 1152
- 4127787
