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

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

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

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

Задача 1#49389Максимум баллов за задание: 1

Среди целых чисел, принадлежащих числовому отрезку [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Максимум баллов за задание: 1

Рассматривается множество целых чисел, принадлежащих числовому промежутку [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Максимум баллов за задание: 1

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [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Максимум баллов за задание: 1

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

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

Решение Python

Мы ищем числа с ровно двумя натуральными делителями. Такие числа — это простые числа: они делятся только на 1 и на само себя.

Алгоритм решения:

1. Задаём диапазон чисел от 12345 до 54321 включительно.

2. Для каждого числа i  проверяем, является ли оно простым:

   - Перебираем все возможные делители j  от 2 до √ -
  i  включительно.

     - Мы можем ограничиться корнем числа, потому что если число i  делится на j  , то существует парный делитель i∕j  . Все делители, превышающие корень, будут уже учтены в виде парного делителя.

   - Если мы находим делитель j  , число не простое, ставим флаг в False и прерываем цикл.

3. Если флаг остался True, число простое, увеличиваем счётчик.

4. В конце выводим количество найденных простых чисел.

ans = 0  # Счётчик простых чисел

# Перебираем все числа в диапазоне от 12345 до 54321 включительно
for i in range(12345, 54322):
    flag = True  # Предполагаем, что число простое
    # Проверяем наличие делителей от 2 до корня числа включительно
    for j in range(2, int(i ** 0.5) + 1):
        if i % j == 0:  # Если найден делитель
            flag = False  # Число не простое
            break  # Прерываем проверку
    if flag:  # Если число простое
        ans += 1  # Увеличиваем счётчик

print(ans)  # Выводим количество простых чисел в диапазоне

Ответ: 4051

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

Задача 5#13990Максимум баллов за задание: 1

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [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

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

Задача 6#13991Максимум баллов за задание: 1

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [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

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

Задача 7#22058Максимум баллов за задание: 1

Напишите программу, которая находит минимальное число, имеющее ровно 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

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

Задача 8#22217Максимум баллов за задание: 1

Найдите все натуральные числа, принадлежащие числовому отрезку [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

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

Задача 9#22667Максимум баллов за задание: 1

Найдите пять последних натуральных чисел, которые имеет ровно 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

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

Задача 10#22668Максимум баллов за задание: 1

Найдите максимальное число, имеющее ровно 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

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

Задача 11#23512Максимум баллов за задание: 1

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

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

Решение Python

Сначала мы задаём диапазон чисел от 100100 до 300100 включительно, которые будем проверять на наличие ровно четырёх различных натуральных делителей, не считая единицы и самого числа.

Для каждого числа из диапазона мы считаем количество делителей:

1. Любое число i  делится на само себя и на 1, но мы их не учитываем.

2. Чтобы найти остальные делители, достаточно перебирать числа j  от 2 до √i-  включительно, потому что:

     - Если i  делится на j  , то существует парный делитель i∕j  .

     - Перебирая до корня, мы автоматически находим все делители числа.

3. Если j  и i∕j  различны, мы увеличиваем счётчик на 2, иначе на 1. Это учитывает как сам делитель, так и парный делитель.

После проверки всех делителей:

     - Если количество найденных делителей равно 4, увеличиваем общий счётчик подходящих чисел.

В конце выводим результат — количество чисел, у которых ровно четыре различных делителя, кроме единицы и самого числа.

ans = 0  # Счётчик подходящих чисел

# Перебираем все числа в диапазоне от 100100 до 300100 включительно
for i in range(100100, 300100 + 1):
    k = 0  # Счётчик делителей числа i, кроме 1 и самого i
    # Перебираем возможные делители от 2 до корня числа включительно
    for j in range(2, int(i ** 0.5) + 1):
        if i % j == 0:  # Если j делитель числа i
            k += 1  # Учёт делителя j
            if j != i // j:  # Если парный делитель отличается
                k += 1  # Учёт парного делителя i / j
    if k == 4:  # Если ровно 4 делителя, кроме 1 и самого числа
        ans += 1  # Увеличиваем счётчик подходящих чисел

print(ans)  # Выводим количество чисел с ровно 4 делителями

Ответ: 9266

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

Задача 12#24426Максимум баллов за задание: 1

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [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

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

Задача 13#25569Максимум баллов за задание: 1

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [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

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

Задача 14#25917Максимум баллов за задание: 1

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [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

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

Задача 15#25944Максимум баллов за задание: 1

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

Показать ответ и решение
def count(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
max_ch = 0
for i in range(111213, 312111):
    temp = count(i)
    if temp >= maxim:
        max_ch = i
        maxim = temp
print(max_ch)

Ответ: 277200

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

Задача 16#25971Максимум баллов за задание: 1

Обозначим через M  целую часть среднего арифметического всех простых делителей целого числа, не считая самого числа. Если таких делителей у числа нет, то считаем значение M  равным нулю. Напишите программу, которая перебирает целые числа, большие 420000  , в порядке возрастания и ищет среди них такие, для которых значение M  при делении на 42  даёт в остатке 24  . Выведите первые 5  найденных числа в порядке возрастания через пробел.

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


def divs(n): # функция,  которая возвращает список делителей
    d = set()
    for i in range(2, int(n**0.5)+1):
        if n % i == 0:
            d.add(i)
            d.add(n//i)
    return sorted(d)

counter = 0
for i in range(420001, 1000000000):
    d = [x for x in divs(i) if prime(x)] # список, в котором будут простые делители текущего числа
    if len(d) > 0: # если такие делители у числа есть
        avg = sum(d) // len(d) # вычисляем среднее арифметическое
        if avg % 42 == 24: # проверка по условию
            print(i)
            counter += 1
            if counter == 5: # если подходящих чисел набралось 5 штук
                break # прерываем выполнение программы

Ответ: 420036 420116 420119 420126 420230

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

Задача 17#26077Максимум баллов за задание: 1

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [543210;563355]  , числа, имеющие ровно пять различных нечётных натуральных делителей (включая единицу, а также само число, если оно нечётное). В ответ запишите такие числа через пробел в порядке возрастания. Если такое число окажется только одно – выведите только его.

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

Решение через цикл:

Запустим цикл в рамках, заданных условием. Для каждого числа найдём делители от 1 до его корня, таким образом программа будет работать точно и быстро. Если нашли делитель - проверим, есть ли дополняющий к нему (поделив число на уже найденный). Берём только нечётные делители, вносим их в список, параллельно увеличивая счётчик. В конце, если попалось ровно 5 делителей, выведем их.

for x in range(543210, 563356): # Перебор по условию
    k = 0 # Счётчик числа делителей
    for i in range(1, int(x ** 0.5) + 1): # Ищем делители от 1 до корня числа
        # Проверяем что число является делителем и оно нечетное
        if x % i == 0:
            if i % 2 == 1:
                k += 1 # Увеличим счётчик
            if (x // i) != i and (x // i) % 2 == 1: # Проверим дополняющий делитель, если мы его ещё не добавили и он нечётный
                k += 1
    if k == 5: # Если нечётных делителей ровно 5
        print(x) # Вывод ответа

Ответ: 559682

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

Задача 18#26158Максимум баллов за задание: 1

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

Показать ответ и решение
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
ans = 0
for i in range(654321, 654521):
    temp = count_divs(i)
    if temp >= maxim:
        maxim = temp
        ans = i
print(maxim, ans)

Ответ: 128 654360

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

Задача 19#26185Максимум баллов за задание: 1

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

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


ans = 0
for i in range(135792, 139449):
    temp = count_divs(i)
    if temp == 6:
        ans += 1
print(ans)

Ответ: 100

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

Задача 20#26212Максимум баллов за задание: 1

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

Показать ответ и решение
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 # максимальное кол-во делителей числа
ans = 0
for i in range(591645, 592845 + 1):
    temp = count_divs(i) # кол-во делителей текущего числа
    if temp > maxim:
        maxim = temp # обновляем максимальное кол-во делителей
        ans = i # обновляем число
print(maxim, ans)

Ответ: 144 592020
Рулетка
Вы можете получить скидку в рулетке!