Тема 25. Обработка целочисленной информации

25.01 Делители числа

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела обработка целочисленной информации
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 1#49389

Среди целых чисел, принадлежащих числовому отрезку [173225; 217437], найдите числа, которые представляют собой произведение двух различных простых делителей, заканчивающихся на одну и ту же цифру. Запишите в ответе количество таких чисел и минимальное из них без разделителей.

Показать ответ и решение
def simple(x):# Функция,которая проверяет является число простым или нет
    return x > 1 and all(x % y for y in range(2,int(x**0.5)+1))
def divs(x):# Функция,которая возвращает делители определённого числа
    d = set()
    for i in range(2,int(x**0.5)+1):
        if x % i == 0:
            d |= {i,x//i}
    return sorted(d)
ans = []
for x in range(173225,217438):
    d = [i for i in divs(x) if simple(i)] #В списке d будут храниться делители числа x,которые при этом являются простыми числами
    if len(d) == 2 and (d[0] % 10 == d[1] % 10) and d[0]*d[1] == x:
        ans += [x]
print(len(ans),min(ans))

Ответ: 1710173231

Ошибка.
Попробуйте повторить позже

Задача 2#6366

Рассматривается множество целых чисел, принадлежащих числовому промежутку [1072;  8793],  которые делятся на 101  но не делятся на 11,13  и 17  .
Найдите количество таких чисел и среднее арифметическое минимального и максимальное из этих чисел
В ответ запишите два этих целых числа: сначала количество, затем среденее арифметическое, если среднее арифметическое — не целое число, то результат округлите в меньшую сторону.
Для выполнения этого задания можно написать программу или воспользоваться редактором электронных таблиц.

Показать ответ и решение
maxim = 0
minim = 10000000
count = 0
for i in range(1072, 8794):
    if i % 101 == 0 and i % 11 != 0:
        if i % 13 != 0 and i % 17 != 0:
            count += 1
            maxim = max(maxim, i)
            minim = min(minim, i)
print(count, int((maxim + minim) / 2))

Ответ: 59 4999

Ошибка.
Попробуйте повторить позже

Задача 3#13987

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [1111; 555555], числа, имеющие четное количество делителей.

Программа должна вывести количество таких чисел.

Показать ответ и решение
def count_divs(n):  
    counter = 0  
    for i in range(1, int(n ** 0.5) + 1):  
        if n % i == 0:  
            counter += 1  
            if i != n // i:  
                counter += 1  
    return counter  
 
a = 1111  # Задаем границы цикла  
b = 555555  
ans = 0  # Будущий ответ  
for i in range(a, b + 1):  
    if count_divs(i) % 2 == 0:  
        ans += 1  
print(ans)

Ответ: 553733

Ошибка.
Попробуйте повторить позже

Задача 4#13988

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [12345; 54321], числа, имеющие ровно 2 натуральных делителя. Программа должна вывести количество таких чисел.

Показать ответ и решение
def is_prime(n): # функция на проверку того, что число - простое
    for j in range(2, int(n ** 0.5) + 1):
        if n % j == 0:
           return False
    return True

# Два натуральных делителя есть только у простых чисел.
ans = 0  # Будущий ответ
for i in range(12345,54322):
    if is_prime(i):
        ans += 1
print(ans)

Ответ: 4051

Ошибка.
Попробуйте повторить позже

Задача 5#13989

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [1000; 123456789], числа, имеющие ровно 7 нечетных делителей. Программа должна вывести количество таких чисел.

Показать ответ и решение
# Заметим, что 7 нечетных делителей имеют числа вида (p**6) * (2**x), где p - простое число,
# а x - любое целое неотрицаельное


def simple(x): # функция для проверки, что число - простое
    for d in range(2,int(x**0.5)+1):
        if x % d == 0:
            return False
    return True
count = 0 # cчётчик чисел
simple_numbers = [x for x in range(3,int(123456789 ** (1/6))+1) if simple(x)] # список, в котором хранятся простые числа от 3 до корня 6-ой степени правой границы
for number in simple_numbers: # проход по простым числам
    for i in range(20): # проход по различным степеням для двойки
        if 1000 <= number**6 * 2**i <= 123456789: # проверка по условию
            count += 1
print(count) # вывод ответа

Ответ: 58

Ошибка.
Попробуйте повторить позже

Задача 6#13990

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [111111; 777777], число, имеющее максимальное количество натуральных делителей. Если таких чисел несколько — найдите максимальное из них. Программа должна вывести это число.

Показать ответ и решение
def count_divs(n):  
    counter = 0  
    for i in range(1, int(n ** 0.5) + 1):  
        if n % i == 0:  
            counter += 1  
            if i != n // i:  
                counter += 1  
    return counter  
 
a = 111111  # Задаю границы цикла  
b = 777777  
maxim = 0  # Максимальное количество делителей  
ans = 0  # Будущий ответ  
for i in range(a, b + 1):  
    if count_divs(i) >= maxim:  
        maxim = count_divs(i)  
        ans = i  
print(ans)

Ответ: 720720

Ошибка.
Попробуйте повторить позже

Задача 7#13991

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [20211209; 20220126], числа, имеющие ровно 3 различных делителя, которые являются квадратами простых чисел. Программа должна вывести количество таких чисел.

Показать ответ и решение
def divs(n):  
    div = []    # Массив делителей  
    for i in range(2,int(n**0.5)+1):  
        if n % i == 0:  
            div.append(i)  
            if i != n//i:  
                div.append(n//i)  
    return div  
 
def is_prime(n):  
    for j in range(2, int(n ** 0.5) + 1):  
        if n % j == 0:  
           return False  
    return True  
 
def is_sqrt_prime(n):  
    if int(n**0.5)**2 == n and is_prime(int(n**0.5)):  
        return True  
    return False  
 
def count_sqrt_divs(n):  
    counter = 0  
    for i in divs(n):  
        if is_sqrt_prime(i):  
            counter += 1  
    return counter  
 
a = 20211209  # Задаю границы цикла  
b = 20220126  
ans = 0   # Будущий ответ  
for i in range(a, b + 1):  
    if count_sqrt_divs(i) == 3:  
        ans += 1  
print(ans)

Ответ: 29

Ошибка.
Попробуйте повторить позже

Задача 8#22055

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [123456789;987654321]  , числа, имеющие ровно 11  натуральных делителей. Напишите в ответ все такие числа через пробел в порядке возрастания.

Показать ответ и решение

Заметим, что 11  натуральных делителей имеют только простые числа в 10  степени.

def is_prime(n):
    if n == 1: return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

for i in range(int(123456789 ** (1 / 10)), int(987654321 ** (1 / 10)) + 1):
    if (123456789 <= i ** 10 <= 987654321) and is_prime(i):
        print(i**10)

Ответ: 282475249

Ошибка.
Попробуйте повторить позже

Задача 9#22056

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [1234567;7654321]  , числа, у которых ровно 7  делителей, сумма цифр которых некратна 3  . Количество делителей, чья сумма цифр кратна 3  , может быть любым. Программа должна вывести количество таких чисел.

Показать ответ и решение

Если сумма цифр числа некратна 3  , значит и само число некратно 3  . Ровно 7  делителей, некратных 3  , имеют числа вида (p6) ⋅(3x)  , где p  - простое число (не 3  ), а x  - любое целое неотрицательное число. Теперь напишем программу.

# Функция, проверяющая, простое ли число
def is_prime(n):
    for x in range(2, int(n ** 0.5) + 1):
        if n % x == 0:
            return False
    return True


ans = set()
start = 1234567
end = 7654321
# Так как мы будем возводить простое число p в 6-ю степень,
# перебирать числа будем до корня 6-й степени из самого большого доступного числа
for p in range(2, int(end ** (1 / 6)) + 1):
    # Если число простое и не равно 3, его можно возводить в 6-ю степень
    if is_prime(p) and p != 3:
        # Подбираем степень для 3, реализовывая формулу (p ̂ 6) * (3 ̂ x)
        for j in range(16):
            num = (p ** 6) * (3 ** j)
            # Полученное число имеет ровно 7 НЕ кратных 3-м делителей
            if start <= num <= end:
                ans.add(num)

print(len(ans))

Ответ: 8

Ошибка.
Попробуйте повторить позже

Задача 10#22057

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [12345678;87654321]  , числа, имеющие ровно 5  делителей, и все эти делители оканчиваются на 0  или 5  . Программа должна вывести количество таких чисел.

Показать ответ и решение

5  делителей, каждый из которых оканчивается на 0  или 5  , имеет либо число 55  , либо числа вида (p4)⋅5  , где   p  - простое число, не равное 5  , а x  — любое целое неотрицательное число. Заметим, что 55  удовлетворяет виду (p4)⋅5  , поэтому достаточно рассмотреть только числа такого вида. Напишем программу.

def is_prime(n):
    if n == 1: return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

ans = 0
# Запустим цикл for только по числам, кратным 5
for i in range(12345680, 87654321, 5):
    t = i//5
    if t ** (1 / 4) == int(t ** (1 / 4)) and is_prime(int(t ** (1 / 4))):
        ans += 1
print(ans)

Ответ: 6

Ошибка.
Попробуйте повторить позже

Задача 11#22058

Напишите программу, которая находит минимальное число, имеющее ровно 256  натуральных делителей. В ответе запишите найденное число.

Показать ответ и решение
def count_divs(n):  
    count = 0  
    for i in range(1, int(n ** 0.5) + 1):  
        if n % i == 0:  
            count += 1  
            if n // i != i:  
                count += 1  
    return count  
i = 0  
while True:  
    if count_divs(i) == 256:  
        print(i)  
        break  
    i += 1

Ответ: 1081080

Ошибка.
Попробуйте повторить позже

Задача 12#22217

Найдите все натуральные числа, принадлежащие числовому отрезку [335235; 337235] и имеющие ровно 12 нетривиальных делителей.

Для каждого найденного числа запишите эти 12 делителей на экране, отделенные от друг друга ровно одним пробелом. Делители в строке должны следовать в порядке возрастания.

Показать ответ и решение
def count_div(x):  
    ans = []  
    for i in range(2, int(x**0.5)+1):  
        if x % i == 0:  
            ans += [i]  
            if x != x // i:  
                ans += [x // i]  
        if len(ans) > 12:  
            return ans  
    return ans  
for i in range(335235, 337235+1):  
    if len(count_div(i)) == 12:  
        print(*sorted(count_div(i)))

Ответ: 3 9 27 81 243 461 729 1383 4149 12447 37341 112023 2 4 8 16 32 64 5261 10522 21044 42088 84176 168352

Ошибка.
Попробуйте повторить позже

Задача 13#22667

Найдите пять последних натуральных чисел, которые имеет ровно 64 делителя на отрезке [1010101; 101010101]. В ответе укажите подходящие числа в порядке возрастания через пробел.

Показать ответ и решение
def count_del(x):
    ans = [1, x]
    for i in range(2, int(x ** 0.5) + 1):
        if x % i == 0:
            ans += [i]
            if i != x // i:
                ans += [x // i]
        if len(ans) > 64:
            return False
    return len(ans) == 64
ans = []
for i in range(101010101, 1010100, -1):
    if count_del(i):
        ans += [i]
    if len(ans) == 5:
        print(*reversed(ans))
        break

Ответ: 101009928 101009937 101009958 101010024 101010090

Ошибка.
Попробуйте повторить позже

Задача 14#22668

Найдите максимальное число, имеющее ровно 128 делителей, которое будет кратно 16 на отрезке [1010101; 101010101]. Напишите в ответ число и через пробел все его нечетные делители также через пробел в порядке возрастания.

Показать ответ и решение
def count_del(x):  
    ans = [1, x]  
    for i in range(2, int(x**0.5)+1):  
        if x % i == 0:  
            ans += [i]  
            if i != x // i:  
                ans += [x//i]  
        if len(ans) > 128:  
            return ans  
    return ans  
for i in range(101010101, 1010101-1, -1):  
    if len(count_del(i)) == 128 and i % 16 == 0:  
        print(i)  
        print(*sorted([i for i in count_del(i) if i % 2 != 0]))  
        break

Ответ: 101008512 1 3 9 11 27 33 99 297 2657 7971 23913 29227 71739 87681 263043 789129

Ошибка.
Попробуйте повторить позже

Задача 15#23512

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [100100;300100]  , числа, имеющие ровно четыре различных натуральных делителя, не считая единицы и самого числа. Программа должна вывести количество таких чисел.

Показать ответ и решение
def count_div(n):
    k = 0
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            k += 1
            if i != n // i:
                k += 1
    return k


ans = 0
for i in range(100100, 300100 + 1):
    if count_div(i) == 4:
        ans += 1
print(ans)

Ответ: 9266

Ошибка.
Попробуйте повторить позже

Задача 16#24426

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [100010,321341]  , числа, имеющие ровно три различных натуральных делителя, не считая единицы и самого числа. Программа должна вывести количество таких чисел.

Показать ответ и решение
def divs(n): # функция, которая возращает количество делителей числа
    k = 0
    for i in range(1, int(n**0.5) + 1):
        if n % i == 0:
            k += 1
            if i != n // i:
                k += 1
        if k > 5: # для оптимизации выходим из функции для текущего числа натуральных делителей, включая 1 и само число больше 5
            return 0
    return k

ans = 0
for i in range(100010, 321342):
    if divs(i) == 5:
        ans += 1
print(ans)

Ответ: 2

Ошибка.
Попробуйте повторить позже

Задача 17#25110

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [28916485;49716586]  , числа, имеющие ровно 5  делителей, оканчивающихся на 0  или 5  . В ответ запишите все найденные числа через пробел в порядке возрастания.

Показать ответ и решение
def is_prime(n):
    if n == 1:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True


ans = 0
# Запустим цикл for только по числам, кратным 5
for i in range(28916485, 49716586, 5):
    t = i//5
    if t ** (1 / 4) == int(t ** (1 / 4)) and is_prime(int(t ** (1 / 4))):
        print(i)

Ответ: 39452405

Ошибка.
Попробуйте повторить позже

Задача 18#25569

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [84052; 84130], число, имеющее максимальное количество различных натуральных делителей, если таких чисел несколько — найдите минимальное из них. Выведите на экран через пробел количество делителей такого числа и само число.

Например, в диапазоне [2; 48] максимальное количество различных натуральных делителей имеет число 48, поэтому для этого диапазона вывод на экране должна содержать следующие значения:



10 48




Показать ответ и решение
def count_divs(n): # функция для подсчёта количества делителей числа
    counter = 0
    for i in range(1, int(n**0.5)+1):
        if n % i == 0:
            counter += 1
            if i != n//i:
                counter += 1
    return counter


maxim = 0
maxim_counter = 0 # максимальное кол-во делителей определенного числа
for i in range(84052, 84130+1):
    temp = count_divs(i)
    if temp > maxim_counter: # если кол-во делителей текущего числа больше максимального кол-ва делителей
        maxim_counter = temp # обновляем максимальное кол-во делителей
        maxim = i # обновляем число
print(maxim_counter, maxim)

Ответ: 72 84084

Ошибка.
Попробуйте повторить позже

Задача 19#25596

Найдите все натуральные числа, принадлежащие отрезку [101 000 000; 102 000 000], у которых ровно три различных чётных делителя. В ответе перечислите найденные числа через пробел в порядке возрастания.

Показать ответ и решение
def prime(n):
    for i in range(2, int(n**0.5)+1):
        if n % i == 0:
            return False
    return True


for i in range(101_000_000, 102_000_000+1):
    n = i
    if n % 2 == 0:
        n = n//2
    else:
        continue
    if n % 2 != 0:
        if n**0.5 == int(n**0.5) and prime(n**0.5):
            print(i)

Ответ: 101075762 101417282 101588258 101645282

Ошибка.
Попробуйте повторить позже

Задача 20#25917

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [287429; 319267], числа, имеющие ровно 3 различных натуральных делителя. Выведите второй делитель для каждого найденного числа в порядке возрастания в одну строку через пробел.

Показать ответ и решение
def divs(x): # функция возращающая список делителей определенного числа
    d = set()
    for i in range(1, int(x**0.5)+1):
        if x % i == 0:
            d.add(i)
            d.add(x//i)
    return sorted(d)
for x in range(287429, 319267+1):
    d = divs(x)
    if len(d) == 3: # если у определенного числа 3 делителя
        print(d[1]) # вывод второго делителя


Ответ: 541 547 557 563
Рулетка
Вы можете получить скидку в рулетке!