25. Обработка целочисленной информации: все задания
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ «?» означает ровно одну произвольную цифру;
- символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.
Например, маске $123*4?5$ соответствуют числа $123405$ и $12300405$.
Среди натуральных чисел, не превышающих $10^8$, найдите все числа, соответствующие маске $1*23?9$, делящиеся на $2023$ без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие результаты деления этих чисел на $2023$.
| | |
Так как нужны только числа, делящиеся на $2023$, будем перебирать не все числа до $10^8$, а только кратные $2023$.
Для проверки соответствия маске удобно использовать функцию fnmatch.
from fnmatch import fnmatch
for x in range(2023, 10**8 + 1, 2023):
if fnmatch(str(x), '1*23?9'):
print(x, x // 2023)
Функция fnmatch проверяет, соответствует ли запись числа заданной маске:
? — одна произвольная цифра;* — любое количество цифр, в том числе $0$.
Программа выведет:
| $1442399$ | $713$ |
| $11112339$ | $5493$ |
| $12872349$ | $6363$ |
| $14632359$ | $7233$ |
| $16392369$ | $8103$ |
| $18152379$ | $8973$ |
| $19912389$ | $9843$ |
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ «?» означает ровно одну произвольную цифру;
- символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.
Например, маске $123*4?5$ соответствуют числа $123405$ и $12300405$.
Среди натуральных чисел, не превышающих $10^9$, найдите все числа, соответствующие маске $1234?57?8$, делящиеся на число $19$ без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие им результаты деления этих чисел на $19$.
| | |
В маске $1234?57?8$ находятся два символа ?, каждый из которых обозначает одну произвольную цифру. Поэтому достаточно перебрать по $10$ вариантов для каждой неизвестной цифры, то есть всего $100$ чисел.
for a in range(10):
for b in range(10):
x = int(f'1234{a}57{b}8')
if x % 19 == 0:
print(x, x // 19)
Переменные a и b принимают значения от $0$ до $9$ и подставляются вместо символов ?. Для каждого полученного числа проверяем делимость на $19$.
Программа выведет:
| Число | Результат деления на $19$ |
|---|---|
| $123405798$ | $6495042$ |
| $123425748$ | $6496092$ |
| $123455768$ | $6497672$ |
| $123475718$ | $6498722$ |
| $123485788$ | $6499252$ |
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ «?» означает ровно одну произвольную цифру;
- символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.
Например, маске $123*4?5$ соответствуют числа $123405$ и $12300405$.
Среди натуральных чисел, не превышающих $10^{10}$, найдите все числа, соответствующие маске $3?12?14*5$, делящиеся на $1917$ без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие им результаты деления этих чисел на $1917$.
| | |
Так как нужны только числа, делящиеся на $1917$, будем перебирать не все числа до $10^{10}$, а только кратные $1917$.
Для проверки соответствия маске удобно использовать функцию fnmatch.
from fnmatch import fnmatch
for x in range(1917, 10**10 + 1, 1917):
if fnmatch(str(x), '3?12?14*5'):
print(x, x // 1917)
Функция fnmatch проверяет, соответствует ли запись числа заданной маске:
? — одна произвольная цифра;* — любое количество цифр, в том числе $0$.
Программа выведет:
| Число | Результат деления на $1917$ |
|---|---|
| $351261495$ | $183235$ |
| $3212614035$ | $1675855$ |
| $3412614645$ | $1780185$ |
| $3712414275$ | $1936575$ |
| $3912414885$ | $2040905$ |
Пусть $R$ – сумма различных натуральных делителей целого числа, не считая единицы и самого числа.
Напишите программу, которая перебирает целые числа, большие $500,000$, в порядке возрастания и ищет среди них такие, для которых $R$ оканчивается на цифру $7$.
В ответе запишите в первом столбце таблицы первые пять найденных чисел в порядке возрастания, а во втором столбце – соответствующие им значения $R$.
Например, для числа $20$ $R=2+4+5+10=21$.
| | |
Будем последовательно перебирать числа, начиная с $500,001$. Для каждого числа найдём все делители, кроме $1$ и самого числа, и вычислим их сумму $R$.
Делители достаточно искать до $\sqrt n$: если $d$ является делителем числа $n$, то вторым делителем пары будет $\dfrac{n}{d}$.
def f(n):
s = 0
d = 2
while d * d <= n:
if n % d == 0:
s += d
if d != n // d:
s += n // d
d += 1
return s
n = 500001
k = 0
while k < 5:
r = f(n)
if r % 10 == 7:
print(n, r)
k += 1
n += 1
Функция f(n) вычисляет сумму $R$ всех различных делителей числа $n$, кроме $1$ и самого числа.
Условие r % 10 == 7 проверяет, что значение $R$ оканчивается на цифру $7$.
Программа выведет:
| Число | $R$ |
|---|---|
| $500002$ | $273007$ |
| $500006$ | $307737$ |
| $500016$ | $910607$ |
| $500022$ | $583397$ |
| $500042$ | $289557$ |
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ «?» означает ровно одну произвольную цифру;
- символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.
Например, маске $123*4?5$ соответствуют числа $123405$ и $12300405$.
Среди натуральных чисел, не превышающих $10^9$, найдите все числа, соответствующие маске $12345?7?8$, делящиеся на число $23$ без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие им результаты деления этих чисел на $23$.
| | |
В маске $12345?7?8$ находятся два символа ?, каждый из которых обозначает одну произвольную цифру. Поэтому переберём все возможные значения этих двух цифр и проверим полученные числа на делимость на $23$.
for a in range(10):
for b in range(10):
x = int(f'12345{a}7{b}8')
if x % 23 == 0:
print(x, x // 23)
Переменные a и b принимают значения от $0$ до $9$ и подставляются вместо символов ?.
Условие x % 23 == 0 проверяет, делится ли полученное число на $23$ без остатка.
Программа выведет:
| Число | Результат деления на $23$ |
|---|---|
| $123450798$ | $5367426$ |
| $123451718$ | $5367466$ |
| $123453788$ | $5367556$ |
| $123454708$ | $5367596$ |
| $123456778$ | $5367686$ |
| $123459768$ | $5367816$ |
Пусть $R$ – сумма всех различных натуральных делителей целого числа.
Напишите программу, которая перебирает целые числа, большие $500,000$, в порядке возрастания и ищет среди них такие, для которых значение $R$ оканчивается на цифру $6$. В ответе запишите в первом столбце таблицы первые пять найденных чисел в порядке возрастания, а во втором столбце – пять соответствующих этим числам значений $R$.
Например, для числа $20$ $R=1+2+4+5+10+20=42$.
| | |
Будем перебирать числа, начиная с $500,001$. Для каждого числа найдём сумму всех его натуральных делителей.
Делители достаточно искать до $\sqrt n$: если $d$ является делителем числа $n$, то вместе с ним существует парный делитель $\dfrac{n}{d}$.
def f(n):
s = 0
for d in range(1, int(n ** 0.5) + 1):
if n % d == 0:
s += d
if d != n // d:
s += n // d
return s
n = 500001
k = 0
while k < 5:
r = f(n)
if r % 10 == 6:
print(n, r)
k += 1
n += 1
Функция f(n) вычисляет сумму $R$ всех различных натуральных делителей числа $n$.
Условие r % 10 == 6 проверяет, что значение $R$ оканчивается на цифру $6$.
Программа выведет:
| Число | $R$ |
|---|---|
| $500032$ | $1070356$ |
| $500035$ | $606816$ |
| $500039$ | $501456$ |
| $500050$ | $949716$ |
| $500052$ | $1333696$ |
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ «?» означает ровно одну произвольную цифру;
- символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.
Например, маске $123*4?5$ соответствуют числа $123405$ и $12300405$.
Среди натуральных чисел, не превышающих $10^8$, найдите все числа, соответствующие маске $2*1?71$, делящиеся на $1991$ без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие результаты деления этих чисел на $1991$.
| | |
Так как нужны только числа, делящиеся на $1991$, будем перебирать не все числа до $10^8$, а только кратные $1991$.
Для проверки соответствия маске удобно использовать функцию fnmatch.
from fnmatch import fnmatch
for x in range(1991, 10**8 + 1, 1991):
if fnmatch(str(x), '2*1?71'):
print(x, x // 1991)
Функция fnmatch проверяет, соответствует ли запись числа заданной маске:
? — одна произвольная цифра;* — любое количество цифр, в том числе $0$.
Программа выведет:
| Число | Результат деления на $1991$ |
|---|---|
| $2351371$ | $1181$ |
| $20071271$ | $10081$ |
| $22261371$ | $11181$ |
| $24451471$ | $12281$ |
| $26641571$ | $13381$ |
| $28831671$ | $14481$ |
Пусть $M$ – сумма минимального и максимального натуральных делителей целого числа, не считая единицы и самого числа. Если таких делителей у числа нет, то считаем значение $M$ равным нулю.
Напишите программу, которая перебирает целые числа, большие $452,021$, в порядке возрастания и ищет среди них такие, для которых значение $M$ при делении на $7$ даёт в остатке $3$. Вывести первые $5$ найденных чисел и соответствующие им значения $M$.
Формат вывода: для каждого из $5$ таких найденных чисел в отдельной строке сначала выводится само число, затем – значение $M$. Строки выводятся в порядке возрастания найденных чисел.
Например, для числа $20$ $M=2+10=12$.
| | |
Для каждого числа найдём его минимальный делитель $d$, не равный $1$. Тогда максимальный делитель, не равный самому числу, равен $\dfrac{n}{d}$.
Поэтому: $M=d+\dfrac{n}{d}$. Если делителей нет, число простое и $M=0$.
from math import isqrt
def f(n):
for d in range(2, isqrt(n) + 1):
if n % d == 0:
return d + n // d
return 0
n = 452022
k = 0
while k < 5:
m = f(n)
if m % 7 == 3:
print(n, m)
k += 1
n += 1
Функция f(n) находит минимальный делитель числа $n$. Парный ему делитель $n//d$ будет максимальным собственным делителем числа.
Условие m % 7 == 3 проверяет, что значение $M$ при делении на $7$ даёт остаток $3$.
Программа выведет:
| Число | $M$ |
|---|---|
| $452025$ | $150678$ |
| $452029$ | $23810$ |
| $452034$ | $226019$ |
| $452048$ | $226026$ |
| $452062$ | $226033$ |
Пусть $M$ – сумма минимального и максимального натуральных делителей целого числа, не считая единицы и самого числа. Если таких делителей у числа нет, то считаем значение $M$ равным нулю.
Напишите программу, которая перебирает целые числа, больше $700,000$, в порядке возрастания и ищет среди них такие, для которых значение $M$ оканчивается на $8$. Вывести первые пять найденных чисел и соответствующие им значения $M$.
Формат вывода: для каждого из пяти таких найденных чисел в отдельной строке сначала выводится само число, затем – значение $M$.
Строки выводятся в порядке возрастания найденных чисел. Например, для числа $20$ $M=2+10=12$.
| | |
Для каждого числа найдём его минимальный делитель $d$, не равный $1$. Тогда максимальный делитель, не равный самому числу, равен $\dfrac{n}{d}$.
Поэтому: $M=d+\dfrac{n}{d}$. Если делителей нет, число простое и $M=0$.
from math import isqrt
def f(n):
for d in range(2, isqrt(n) + 1):
if n % d == 0:
return d + n // d
return 0
n = 700001
k = 0
while k < 5:
m = f(n)
if m % 10 == 8:
print(n, m)
k += 1
n += 1
Функция f(n) находит минимальный делитель числа $n$. Парный ему делитель n // d будет максимальным собственным делителем числа.
Условие m % 10 == 8 проверяет, что значение $M$ оканчивается на цифру $8$.
Программа выведет:
| Число | $M$ |
|---|---|
| $700005$ | $233338$ |
| $700007$ | $100008$ |
| $700012$ | $350008$ |
| $700015$ | $140008$ |
| $700031$ | $24168$ |
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ «?» означает ровно одну произвольную цифру;
- символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.
Например, маске $123*4?5$ соответствуют числа $123405$ и $12300405$.
Среди натуральных чисел, не превышающих $10^8$, найдите все числа, соответствующие маске $12??15*6$, делящиеся на $273$ без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие им результаты деления этих чисел на $273$.
| | |
Так как нужны только числа, делящиеся на $273$, будем перебирать не все числа до $10^8$, а только кратные $273$.
Для проверки соответствия маске удобно использовать функцию fnmatch.
from fnmatch import fnmatch
for x in range(273, 10**8 + 1, 273):
if fnmatch(str(x), '12??15*6'):
print(x, x // 273)
Функция fnmatch проверяет, соответствует ли запись числа заданной маске:
? — одна произвольная цифра;* — любое количество цифр, в том числе $0$.
Программа выведет:
| Число | Результат деления на $273$ |
|---|---|
| $1248156$ | $4572$ |
| $12801516$ | $46892$ |
| $12831546$ | $47002$ |
| $12861576$ | $47112$ |
Напишите программу, которая перебирает целые числа, большие $500,000$, в порядке возрастания и ищет среди них такие, у которых есть натуральный делитель, оканчивающийся на цифру $9$ и не равный ни самому числу, ни числу $9$.
В ответе запишите в первом столбце таблицы первые пять найденных чисел в порядке возрастания, а во втором столбце – соответствующий минимальный делитель для каждого числа, оканчивающийся цифрой $9$, не равный ни самому числу, ни числу $9$.
| | |
Для каждого числа найдём все его делители. Достаточно перебирать делители до $\sqrt n$: если $d$ является делителем числа $n$, то вторым делителем пары будет $\dfrac{n}{d}$.
Среди подходящих делителей выбираем минимальный, который оканчивается на $9$, не равен $9$ и не равен самому числу.
from math import isqrt
def f(n):
a = []
for d in range(1, isqrt(n) + 1):
if n % d == 0:
if d % 10 == 9 and d != 9 and d != n:
a.append(d)
k = n // d
if k % 10 == 9 and k != 9 and k != n:
a.append(k)
if a:
return min(a)
return 0
n = 500001
k = 0
while k < 5:
d = f(n)
if d != 0:
print(n, d)
k += 1
n += 1
Функция f(n) находит минимальный натуральный делитель числа $n$, который оканчивается на цифру $9$, но не равен $9$ и самому числу.
Если подходящих делителей нет, функция возвращает $0$.
Программа выведет:
| Число | Минимальный делитель |
|---|---|
| $500002$ | $89$ |
| $500003$ | $71429$ |
| $500004$ | $19$ |
| $500007$ | $166669$ |
| $500013$ | $18519$ |
Пусть $M$ – сумма минимального и максимального простых натуральных делителей целого числа, не считая самого числа. Если таких делителей у числа нет, то значение $M$ считается равным нулю. Напишите программу, которая перебирает целые числа, большие $8,007,524,668$, в порядке возрастания и ищет среди них такие, для которых $M$ больше $110,000$, является простым числом и в своём написании содержит последовательность цифр $991$ ровно один раз.
В ответе запишите в первом столбце таблицы первые $5$ найденных чисел в порядке возрастания, а во втором столбце – соответствующие им значения $M$.
Например, для числа $49$ $M=14$; для числа $42$ $M=9$.
| | |
Так как $M$ должно быть простым числом больше $110,000$, оно нечётное. Если исходное число нечётное, его минимальный и максимальный простые делители также нечётные, поэтому их сумма будет чётной. Значит, подходящее число обязательно чётное.
Следовательно, минимальный простой делитель равен $2$, и $M=2+\text{максимальный простой делитель}$.
Будем перебирать только чётные числа и находить их максимальный простой делитель.
def prime(n):
if n < 2:
return False
if n % 2 == 0:
return n == 2
d = 3
while d * d <= n:
if n % d == 0:
return False
d += 2
return True
def max_div(n):
m = 0
while n % 2 == 0:
m = 2
n //= 2
d = 3
while d * d <= n:
while n % d == 0:
m = d
n //= d
d += 2
if n > 1:
m = max(m, n)
return m
n = 8007524670
k = 0
while k < 5:
d = max_div(n)
M = 2 + d
if M > 110000 and prime(M) and str(M).count('991') == 1:
print(n, M)
k += 1
n += 2
Функция max_div(n) находит максимальный простой делитель числа $n$.
Условие str(M).count(‘991’) == 1 проверяет, что последовательность цифр $991$ встречается в записи числа $M$ ровно один раз.
Программа выведет:
| Число | $M$ |
|---|---|
| $8007539144$ | $149911$ |
| $8007540788$ | $153991171$ |
| $8007540856$ | $142991803$ |
| $8007547448$ | $9910333$ |
| $8007550626$ | $150991$ |
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ «?» означает ровно одну произвольную цифру;
- символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.
Например, маске $123*4?5$ соответствуют числа $123405$ и $12300405$.
Среди натуральных чисел, не превышающих $10^8$, найдите все числа, соответствующие маске $1?3*4?9$, делящиеся на $1927$ без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие результаты деления этих чисел на $1927$.
| | |
Так как нужны только числа, делящиеся на $1927$, будем перебирать не все числа до $10^8$, а только кратные $1927$.
Для проверки соответствия маске удобно использовать функцию fnmatch.
from fnmatch import fnmatch
for x in range(1927, 10**8 + 1, 1927):
if fnmatch(str(x), '1?3*4?9'):
print(x, x // 1927)
Функция fnmatch проверяет, соответствует ли запись числа заданной маске:
? — одна произвольная цифра;* — любое количество цифр, в том числе $0$.
Программа выведет:
| Число | Результат деления на $1927$ |
|---|---|
| $1439469$ | $747$ |
| $10361479$ | $5377$ |
| $15352409$ | $7967$ |
| $16354449$ | $8487$ |
| $17356489$ | $9007$ |
Напишите программу, которая перебирает целые числа, большие $2,626,695,891$, в порядке возрастания и ищет среди них числа, представимые в виде произведения ровно двух простых множителей, не обязательно различных, каждый из которых ровно один раз содержит в своей записи $67$ ($67$ – идущие подряд друг за другом в указанном порядке цифры $6$ и $7$).
В ответе в первом столбце таблицы запишите первые $5$ найденных чисел в порядке возрастания, а во втором столбце – для каждого из них соответствующий наименьший найденный множитель.
| | |
Если число представимо в виде произведения двух простых множителей $p\cdot q$, то достаточно найти его первый делитель $p$. Он будет простым. После этого проверяем, что $q=\dfrac{n}{p}$ тоже является простым числом и оба множителя содержат последовательность 67 ровно один раз.
from math import isqrt
def prime(n):
if n < 2:
return False
for d in range(2, isqrt(n) + 1):
if n % d == 0:
return False
return True
def f(n):
for d in range(2, isqrt(n) + 1):
if n % d == 0:
q = n // d
if (prime(q) and
str(d).count('67') == 1 and
str(q).count('67') == 1):
return d
return 0
return 0
n = 2626695892
k = 0
while k < 5:
d = f(n)
if d != 0:
print(n, d)
k += 1
n += 1
Функция f(n) находит первый делитель числа $n$. Если второй множитель тоже прост и в записи каждого множителя последовательность 67 встречается ровно один раз, функция возвращает меньший множитель.
Программа выведет:
| Число | Наименьший множитель |
|---|---|
| $2626696861$ | $6793$ |
| $2626700987$ | $1567$ |
| $2626704089$ | $167$ |
| $2626711691$ | $2267$ |
| $2626713493$ | $67$ |
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ «?» означает ровно одну произвольную цифру;
- символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.
Например, маске $123*4?5$ соответствуют числа $123405$ и $12300405$.
Среди натуральных чисел, не превышающих $10^9$, найдите все числа, соответствующие маске $12345?7?8$, делящиеся на число $37$ без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие им результаты деления этих чисел на $37$.
| | |
В маске $12345?7?8$ находятся два символа ?, каждый из которых обозначает одну произвольную цифру. Поэтому переберём все возможные значения этих двух цифр и проверим полученные числа на делимость на $37$.
for a in range(10):
for b in range(10):
x = int(f'12345{a}7{b}8')
if x % 37 == 0:
print(x, x // 37)
Переменные a и b принимают значения от $0$ до $9$ и подставляются вместо символов ?.
Условие x % 37 == 0 проверяет, делится ли полученное число на $37$ без остатка.
Программа выведет:
| Число | Результат деления на $37$ |
|---|---|
| $123451758$ | $3336534$ |
| $123454718$ | $3336614$ |
| $123458788$ | $3336724$ |
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ «?» означает ровно одну произвольную цифру;
- символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.
Например, маске $123*4?5$ соответствуют числа $123405$ и $12300405$.
Среди натуральных чисел, не превышающих $10^{10}$, найдите все числа, соответствующие маске $89*6?7?9?$, делящиеся на $9874$ без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие им результаты деления этих чисел на $9874$.
| | |
Так как нужны только числа, делящиеся на $9874$, будем перебирать не все числа до $10^{10}$, а только кратные $9874$.
Для проверки соответствия маске удобно использовать функцию fnmatch.
from fnmatch import fnmatch
for x in range(9874, 10**10 + 1, 9874):
if fnmatch(str(x), '89*6?7?9?'):
print(x, x // 9874)
Функция fnmatch проверяет, соответствует ли запись числа заданной маске:
? — одна произвольная цифра;* — любое количество цифр, в том числе $0$.
Программа выведет:
| Число | Результат деления на $9874$ |
|---|---|
| $8901677598$ | $901527$ |
| $8905627198$ | $901927$ |
| $8912617990$ | $902635$ |
| $8941667298$ | $905577$ |
| $8952607690$ | $906685$ |
| $8970607992$ | $908508$ |
| $8988647790$ | $910335$ |
Пусть $M$ – сумма минимального и максимального простых натуральных делителей целого числа, не считая самого числа. Если таких делителей у числа нет, то значение $M$ считается равным нулю. Напишите программу, которая перебирает целые числа, большие $8,007,494,154$, в порядке возрастания и ищет среди них такие, для которых $M$ больше $80,000$, является простым числом и в своём написании содержит последовательность цифр $567$ ($567$ – идущие подряд друг за другом в указанном порядке цифры $5$, $6$ и $7$) ровно один раз.
В ответе запишите в первом столбце таблицы первые $5$ найденных чисел в порядке возрастания, а во втором столбце – соответствующие им значения $M$.
Например, для числа $49$ $M=14$; для числа $42$ $M=9$.
| | |
Если исходное число нечётное, то его минимальный и максимальный простые делители нечётные. Их сумма $M$ будет чётной. Так как $M>80,000$ и должно быть простым, такие числа нам не подходят.
Значит, перебираем только чётные числа. Для них минимальный простой делитель равен $2$, поэтому $M=2+\text{максимальный простой делитель}$.
from math import isqrt
def prime(n):
if n < 2:
return False
for d in range(2, isqrt(n) + 1):
if n % d == 0:
return False
return True
def max_div(n):
m = 2
while n % 2 == 0:
n //= 2
d = 3
while d * d <= n:
if n % d == 0:
m = d
while n % d == 0:
n //= d
d += 2
if n > 1:
m = max(m, n)
return m
n = 8007494156
k = 0
while k < 5:
M = 2 + max_div(n)
if M > 80000 and str(M).count('567') == 1 and prime(M):
print(n, M)
k += 1
n += 2
Функция max_div(n) находит максимальный простой делитель числа $n$.
Условие str(M).count(‘567’) == 1 проверяет, что последовательность цифр $567$ встречается в записи $M$ ровно один раз.
Программа выведет:
| Число | $M$ |
|---|---|
| $8007495062$ | $615679$ |
| $8007495772$ | $5671033$ |
| $8007531302$ | $856789$ |
| $8007532410$ | $5679103$ |
| $8007559070$ | $1567039$ |
Напишите программу, которая перебирает целые числа, большие $600,000$, в порядке возрастания и ищет среди них такие, у которых есть натуральный делитель, оканчивающийся на цифру $9$ и не равный ни самому числу, ни числу $9$. Вывести первые пять найденных чисел и для каждого минимальный делитель, оканчивающийся на цифру $9$, не равный ни самому числу, ни числу $9$.
Формат вывода: для каждого из пяти таких найденных чисел в отдельной строке сначала выводится само число, затем – значение наименьшего делителя, оканчивающегося на цифру $9$, не равного ни самому числу, ни числу $9$.
Строки выводятся в порядке возрастания найденных чисел.
| | |
Для каждого числа найдём все пары делителей. Достаточно перебирать делители до $\sqrt n$: если $d$ делит число $n$, то второй делитель пары равен $\dfrac{n}{d}$.
Среди всех подходящих делителей выбираем минимальный, который оканчивается на цифру $9$ и не равен $9$ и самому числу.
from math import isqrt
def f(n):
a = []
for d in range(1, isqrt(n) + 1):
if n % d == 0:
if d % 10 == 9 and d != 9 and d != n:
a.append(d)
k = n // d
if k % 10 == 9 and k != 9 and k != n:
a.append(k)
if a:
return min(a)
return 0
n = 600001
k = 0
while k < 5:
d = f(n)
if d != 0:
print(n, d)
k += 1
n += 1
Функция f(n) находит минимальный натуральный делитель числа $n$, который оканчивается на цифру $9$, но не равен $9$ и самому числу.
Если подходящих делителей нет, функция возвращает $0$.
Программа выведет:
| Число | Минимальный делитель |
|---|---|
| $600001$ | $19$ |
| $600003$ | $409$ |
| $600005$ | $49$ |
| $600007$ | $7229$ |
| $600008$ | $179$ |
Напишите программу, которая перебирает целые числа, большие $2,018,974,447$, в порядке возрастания и ищет среди них числа, представленные в виде произведения ровно двух простых множителей, не обязательно различных, каждый из которых ровно один раз содержит в своей записи $43$ ($43$ – идущие подряд друг за другом в указанном порядке цифры $4$ и $3$).
В ответе в первом столбце таблицы запишите первые $5$ найденных чисел в порядке возрастания, а во втором столбце – для каждого из них соответствующий наименьший найденный множитель.
| | |
Если число имеет вид $n=p\cdot q$, где $p$ и $q$ — простые числа, то достаточно найти наименьший делитель $p$. После этого проверяем, что второй множитель $q=\dfrac{n}{p}$ тоже является простым числом и каждый из множителей содержит 43 ровно один раз.
from math import isqrt
def prime(n):
if n < 2:
return False
if n % 2 == 0:
return n == 2
for d in range(3, isqrt(n) + 1, 2):
if n % d == 0:
return False
return True
def f(n):
if n % 2 == 0:
p = 2
else:
p = 0
for d in range(3, isqrt(n) + 1, 2):
if n % d == 0:
p = d
break
if p == 0:
return 0
q = n // p
if (str(p).count('43') == 1 and
str(q).count('43') == 1 and
prime(q)):
return p
return 0
n = 2018974448
k = 0
while k < 5:
d = f(n)
if d != 0:
print(n, d)
k += 1
n += 1
Функция f(n) находит наименьший простой множитель числа $n$. Затем проверяется, что второй множитель тоже простой и последовательность 43 встречается в каждом множителе ровно один раз.
Программа выведет:
| Число | Наименьший множитель |
|---|---|
| $2018977769$ | $27143$ |
| $2018980091$ | $9437$ |
| $2018983349$ | $643$ |
| $2018997619$ | $43$ |
| $2019003907$ | $4643$ |
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ «?» означает ровно одну произвольную цифру;
- символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.
Например, маске $123*4?5$ соответствуют числа $123405$ и $12300405$.
Среди натуральных чисел, не превышающих $10^8$, найдите все числа, соответствующие маске $2*1?5?1$, делящиеся на $1921$ без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие результаты деления этих чисел на $1921$.
| | |
Так как нужны только числа, делящиеся на $1921$, будем перебирать не все числа до $10^8$, а только кратные $1921$.
Для проверки соответствия маске удобно использовать функцию fnmatch.
from fnmatch import fnmatch
for x in range(1921, 10**8 + 1, 1921):
if fnmatch(str(x), '2*1?5?1'):
print(x, x // 1921)
Функция fnmatch проверяет, соответствует ли запись числа заданной маске:
? — одна произвольная цифра;* — любое количество цифр, в том числе $0$.
Программа выведет:
| Число | Результат деления на $1921$ |
|---|---|
| $2710531$ | $1411$ |
| $22016581$ | $11461$ |
| $23015501$ | $11981$ |
| $23111551$ | $12031$ |
| $27318541$ | $14221$ |
| $27414591$ | $14271$ |
| $28413511$ | $14791$ |