Подготовка к школе
1 класс
2 класс
3 класс
4 класс
5 класс
6 класс
7 класс
8 класс
9 класс
10 класс
11 класс
ОГЭ
ЕГЭ
Для всех
Назад

25. Обработка целочисленной информации: все задания

Сообщить о проблеме
1. Задание #295954
Задание было решено верно
Задание было решено неверно

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

  • символ «?» означает ровно одну произвольную цифру;
  • символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.

Например, маске $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
2. Задание #295955
Задание было решено верно
Задание было решено неверно

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

  • символ «?» означает ровно одну произвольную цифру;
  • символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.

Например, маске $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
3. Задание #295956
Задание было решено верно
Задание было решено неверно

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

  • символ «?» означает ровно одну произвольную цифру;
  • символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.

Например, маске $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
4. Задание #295963
Задание было решено верно
Задание было решено неверно

Пусть $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
5. Задание #295964
Задание было решено верно
Задание было решено неверно

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

  • символ «?» означает ровно одну произвольную цифру;
  • символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.

Например, маске $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
6. Задание #295967
Задание было решено верно
Задание было решено неверно

Пусть $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
7. Задание #295966
Задание было решено верно
Задание было решено неверно

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

  • символ «?» означает ровно одну произвольную цифру;
  • символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.

Например, маске $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
8. Задание #295969
Задание было решено верно
Задание было решено неверно

Пусть $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
9. Задание #295968
Задание было решено верно
Задание было решено неверно

Пусть $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
10. Задание #295971
Задание было решено верно
Задание было решено неверно

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

  • символ «?» означает ровно одну произвольную цифру;
  • символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.

Например, маске $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
11. Задание #295972
Задание было решено верно
Задание было решено неверно

Напишите программу, которая перебирает целые числа, большие $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
12. Задание #295974
Задание было решено верно
Задание было решено неверно

Пусть $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
13. Задание #295973
Задание было решено верно
Задание было решено неверно

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

  • символ «?» означает ровно одну произвольную цифру;
  • символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.

Например, маске $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
14. Задание #295976
Задание было решено верно
Задание было решено неверно

Напишите программу, которая перебирает целые числа, большие $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
15. Задание #295977
Задание было решено верно
Задание было решено неверно

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

  • символ «?» означает ровно одну произвольную цифру;
  • символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.

Например, маске $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
16. Задание #295978
Задание было решено верно
Задание было решено неверно

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

  • символ «?» означает ровно одну произвольную цифру;
  • символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.

Например, маске $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
17. Задание #295979
Задание было решено верно
Задание было решено неверно

Пусть $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
18. Задание #295980
Задание было решено верно
Задание было решено неверно

Напишите программу, которая перебирает целые числа, большие $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
19. Задание #295983
Задание было решено верно
Задание было решено неверно

Напишите программу, которая перебирает целые числа, большие $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$
Показать
Очки опыта 20
Спросить Зави
Сообщить о проблеме
20. Задание #295984
Задание было решено верно
Задание было решено неверно

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

  • символ «?» означает ровно одну произвольную цифру;
  • символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.

Например, маске $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$
Показать
Очки опыта 20
Спросить Зави
03:50:00
Решено заданий: 0 из
0 заданий сегодня