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

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

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

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

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

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

Показать ответ и решение
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)
ans = []
for x in range(88535,167043):
    d = [i for i in divs(x) if i % 2 == 0] # список, в котором хранятся только чётные делители числа
    if len(d) == 5:
        ans += [x]
print(len(ans),sum(ans)//len(ans))

Ответ: 1 167042

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

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

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

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


ans = 0
for i in range(856789, 1561023+1):
    temp = count_divs(i)
    if temp == 4:
        ans += 1
print(ans)

Ответ: 27390

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

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

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

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

for i in range(123123, 143123 + 1):
    if three_del(i):
        print(i)

Ответ: 124609 128881 134689 139129

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

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

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

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


for i in range(196285, 396175 + 1):
    if divisors(i) == 7:
        print(i)

Ответ: 235298 250000 373248

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

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

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

Напишите программу, которая перебирает целые числа, большие 425161  , в порядке возрастания и ищет среди них такие, для которых значение   при делении на 7  дает в остатке 3  . Вывести первые 5  найденных чисел через пробел.

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

k = 0
for i in range(425162, 10000000000):
    if m(i) % 7 == 3: # если остаток суммы при делении на 7 равен 3
        print(i)
        k += 1
    if k == 5:
        break

Ответ: 425168 425182 425183 425187 425196

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

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

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

Показать ответ и решение
def count_div(n):  # Счетчик всех делителей  
    k = 2  # 1 и само число - делители числа всегда  
    for i in range(2, int(n ** 0.5) + 1):  
        if n % i == 0:  
            k += 1  
            if n // i != i:  
                k += 1  
    return k  
 
 
counter = 0  
for i in range(421431, 754124):  
    if count_div(i) == 12:  
        counter += 1  
print(counter)

Ответ: 29911

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

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

Найти на промежутке [21321,99999]  числа, у которых ровно 2 различных нетривиальных делителя. Найдите наибольшие 5 подходящих чисел и минимальный нетривиальный делитель каждого числа. В ответ запишите найденные 5 чисел в порядке убывания и делитель каждого из чисел в таком порядке:

Число1, Дел1; Число2, Дел2; и т.д. (После каждой запятой или точки с запятой ставится пробел, каждая группа (число и его минимальный делитель) отделяется от следующей группы точкой с запятой, после последней группы никакой знак не ставится).

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

count = 0
for x in range(99999,21321,-1): # для оптимизации начинаем перебор с большего к меньшему
    d = divs(x)
    if len(d) == 2:
        print(x,d[0]) # вывод ответа
        count += 1
        if count == 5:
            break

Ответ: 99998, 2; 99993, 3; 99987, 3; 99986, 2; 99985, 5

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

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

Найти первые 5 чисел, больших 35798  , которые имеют ровно 5 делителей. Запишите в ответ найденные числа в порядке возрастания через пробел.

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

Обычное решение

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


counter = 0
for i in range(35799, 1000000000000):
    if count_div(i) == 5:
        counter += 1
        print(i, end=’ ’)
    if counter == 5:
        break

Решение на основе ОТА

def is_prime(n): # функция для проверки, что число - простое
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return n > 1

counter = 0
for i in range(1000):
    if is_prime(i) and i ** 4 > 35798 and counter < 5:
        print(i ** 4)
        counter += 1

Ответ: 83521 130321 279841 707281 923521

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

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

Найти число из промежутка [41689,142985]  , которое имеет больше всего делителей. Если таких чисел несколько, выберите наибольшее из них. В ответе через пробел запишите найденное число и его количество делителей.

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


maxim, ans = 0, 0
for i in range(41689, 142986):
    x = count_div(i)
    if x >= maxim: #нестрогий знак для того чтобы вывести максимальное(последнее) число
        maxim = x
        ans = i
print(ans, maxim)

Ответ: 138600 144

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

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

Найти на промежутке [654321,712345]  числа, у которых есть хотя бы 2  простых делителя, оканчивающихся на  7  . В ответе через пробел запишите количество найденных чисел и максимальное число делителей среди найденных чисел.

Показать ответ и решение
def prime(x): # функция, которая проверяет является ли число простым
    if x == 1:return False
    for i in range(2,int(x**0.5)+1):
        if x % i == 0:
            return False
    return True
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)
count = 0
mx = 0
for x in range(654321,712346):
    d = [i for i in divs(x) if prime(i) and i % 10 == 7] # список, в котором хранятся простые делители числа, оканчивающиеся на 7
    divisors = divs(x)
    if len(d) >= 2: # если таких делителей хотя бы 2
        count += 1 # увеличиваем счётчик
        mx = max(mx,len(divisors)) #обновляем максимальное кол-во делителей числа
print(count,mx)

Ответ: 5055 192

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

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

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

Показать ответ и решение
def 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  
 
 
def okay(n):  # Все ли нетривиальные делители числа простые?  
    for i in range(2, int(n ** 0.5) + 1):  
        if n % i == 0:  
            if not prime(i):  # Если встретили непростой делитель,  
                return False  # то число не подходит  
            if n // i != i:  
                if not prime(n // i):  
                    return False  
    return True  
 
 
counter, maxim = 0, 0  
for i in range(12524, 15422):  
    if okay(i):  
        counter += 1  
        if i > maxim:  
            maxim = i  
print(counter, maxim)

Ответ: 1010 15421

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

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

Найти числа из промежутка [750000,930000]  , у которых есть ровно 3 натуральных делителя, которые делятся на 17. В ответе запишите эти числа и три минимальных делителя каждого числа (делители должны идти по возрастанию). Ответ запишите в формате:

Число1, Дел1, Дел2, Дел3; Число2, Дел1, Дел2, Дел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(750000,930001):
    divisors = divs(x)
    d = [i for i in divisors if i % 17 == 0] # список, в котором хранятся только делители числа кратные 17
    if len(d) == 3: # если таких делителей ровно 3
        print(x,divisors[:3]) # вывод числа и 3 его минимальных делителей

Ответ: 756857, 1, 17, 211; 845393, 1, 17, 223; 875993, 1, 17, 227; 891497, 1, 17, 229; 922913, 1, 17, 233

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

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

Назовем число интересным, если количество его делителей делится нацело на 2 и на 3. Найти на промежутке [8214,342141]  количество интересных чисел и их сумму. Запишите ответ через пробел.

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


counter, summ = 0, 0
for i in range(8214, 342142):
    if count_div(i) % 2 == 0 and count_div(i) % 3 == 0: # проверка по условию
        counter += 1
        summ += i
print(counter, summ)

Ответ: 89406 15679796308

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

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

Назовем число красивым, если оно делится на сумму своих цифр и имеет ровно 6 нетривиальных делителей. Найти на промежутке [51242,421421]  количество красивых чисел и их среднее арифметическое. В ответе запишите два числа через пробел: сначала количество чисел, потом целую часть их среднего арифметического.

Показать ответ и решение
def sum_digits(n):  # сумма цифр
    s = 0
    while n > 0:
        s += n % 10
        n //= 10
    return s


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


counter, summ = 0, 0
for i in range(51242, 421422):
    if i % sum_digits(i) == 0 and count_div(i) == 6: # проверка по условию
        counter += 1
        summ += i
print(counter, int(summ / counter))

Ответ: 3519 228061

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

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

Найти наибольшее число, меньшее 100000  , которое имеет более 70 нетривиальных делителей. В ответ запишите это число и количество его нетривиальных делителей. Запишите числа через пробел.

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


for i in range(100000, 0, -1):
    if count_div(i) > 70:
        print(i, count_div(i))
        break

Ответ: 99960 94

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

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

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

Показать ответ и решение
def average(n):  # делится ли на целую часть ср .ариф. делителей  
    k, s = 0, 0  
    for i in range(1, int(n ** 0.5) + 1):  
        if n % i == 0:  
            k += 1  
            s += i  
            if n // i != i:  
                k += 1  
                s += n // i  
    if n % int(s / k) == 0:  
        return True  
    return False  
 
 
counter, p = 0, 1  
for i in range(123123, 321322):  
    if average(i):  
        counter += 1  
        p *= i  
print(counter, p)

Ответ: 5 352861289574854860800000000

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

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

Назовем число добрым, если среди его делителей есть хотя бы три квадрата простых чисел. Найти 5 минимальных добрых чисел, больших 21317  . В ответе запишите найденные числа через пробел в порядке возрастания.

Показать ответ и решение
def 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

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)
count = 0
for x in range(21318,100000):
    d = [i for i in divs(x) if int(i**0.5) == i**0.5 and prime(i**0.5)] # список, в котором хранятся только квадраты простых делителей числа
    if len(d) >= 3:
        print(x)
        count += 1
        if count == 5:
            break

Ответ: 21600 21780 22050 22500 22932

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

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

Найти минимальное число, большее 156239  , которое имеет ровно 60  делителей, из которых ровно 4  – простые. В ответе через пробел запишите все простые делители найденного числа в порядке возрастания.

Показать ответ и решение
def 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

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(156239,500000):
    divisors = divs(x) # список всех делителей текущего числа
    prime_divisors = [i for i in divisors if prime(i)] # список, в котором хранятся только простые делители числа
    if len(divisors) == 60 and len(prime_divisors) == 4: # проверка по условию
        print(prime_divisors)
        break

Ответ: 2 5 17 23

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

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

Определите количество составных натуральных чисел из диапазона [3;30000]  , у которых количество нетривиальных делителей не менее трех.

Примечание. Нетривиальный делитель — делитель, не равный единице и самому числу.

Показать ответ и решение
ans = 0
for i in range(3, 30000 + 1):
    dels = 0
    for j in range(2, int(i ** 0.5) + 1): # перебор возможных нетривиальных делителей
        if i % j == 0:
            dels += 1
            if j != i // j:
                dels += 1
    if dels >= 3:
        ans += 1
print(ans)

Ответ: 19282

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

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

Число называется избыточным, если оно строго меньше суммы своих собственных делителей (то есть всех положительных делителей, отличных от самого числа). Определите количество избыточных чисел из диапазона [5; 50000].

Показать ответ и решение
ans = 0
for i in range(5, 50000+1):
    dels = [1] # список, в котором будут храниться делители числа, отличные от самого числа
    for j in range(2, int(i**0.5)+1):
        if i % j == 0:
            dels += [j]
            if j != i//j:
                dels += [i//j]
    if sum(dels) > i:
        ans += 1
print(ans)

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