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

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

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

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

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

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

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


maxim = 0 # максимальное кол-во делителей числа
ans = 0
for i in range(267153, 357254):
    s = count_div(i) # кол-во делителей текущего числа
    if s >= maxim: # нестрогий знак для того чтобы в ans сохранить максимальное(последнее) число
        maxim = s
        ans = i
print(ans, maxim)

Ответ: 332640 192

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

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

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

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


for i in range(300000, 333000 + 1):
    if len(divs(i)) == 3:
        print(i)

Ответ: 310249 316969 323761 326041 332929

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

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

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


for i in range(88535, 153373 + 1):
    d = [x for x in divs(i) if x % 2 != 0] #список, в котором храняться только нечётные делители числа
    if len(d) == 5:
        print(i)

Ответ: 114244 117128 130321

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

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

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

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

Ответ: 117649 16807 2401 343 49 7 1 15625 3125 625 125 25 5 1

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

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

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

Показать ответ и решение
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) > 3: # для оптимизации выходим из функции если кол-во делителей больше 3
            return d
    return sorted(d)
count = 0
for x in range(100100,300301):
    d = divs(x)
    if len(d) == 3:
        count += 1
print(count)

Ответ: 2

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

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

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

Показать ответ и решение
def countDelitel(n): # функция, которая возращает кол-во делителей числа
    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


maxCountDelit = 0
maxNumber = 0
for i in range(231893, 251859 + 1):
    k = countDelitel(i)
    if k >= maxCountDelit: #нестрогий знак для того чтобы вывести максимальное(последнее) число
        maxCountDelit = k
        maxNumber = i
print(maxCountDelit, maxNumber)

Ответ: 160 249480

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

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

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

Показать ответ и решение
a = 591645  # Задаем границы цикла  
b = 592845  
ans = 0   # Будущий ответ  
maxcount = 0 # Количество делителей ответа  
for i in range(a, b + 1):  
    count = 0   # Счетчик делителей  
    for j in range(1, int(i**0.5) + 1):  
        if i % j == 0:  
            count += 1  # Считаем делители  
    if (count > maxcount): # Проверяем, вдруг текущее число круче  
        ans = i  
        maxcount = count  
print(ans)

Ответ: 592020

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

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

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [300000;333000], числа, имеющие ровно 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)
count = 0 # кол-во подходящих чисел
for x in range(300000,333001):
    if len(divs(x)) == 3: # если у текущего числа 3 делителя
        count += 1
print(count)

Ответ: 5

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

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

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [53671;125698]  , числа, имеющие ровно 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)
count = 0
for x in range(53671,125699):
    if len(divs(x)) == 5: # если у текущего числа 5 делителей
        count += 1
print(count)

Ответ: 1

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

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

Напишите программу, которая выведет все общие делители чисел 230010 и 600270.

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


a = 230010 # первое число
b = 600270 # первое число
ans = [] # список общих делителей
ad = divs(a) # делители первого числа
bd = divs(b) # делители второго числа
for i in ad: # проход по делителям первого числа
    if i in bd: # если такой делитель есть среди делителей второго числа
        ans.append(i) # добавляем в список
print(*ans)

Ответ: 2 3 5 6 10 11 15 17 22 30 33 34 5610 51 55 66 2805 85 102 110 1870 165 170 187 1122 935 255 330 374 561 510

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

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

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

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

Один нечетный натуральный делитель имеют только степени 2, так что наша задача - посчитать, сколько степеней 2 находится в заданном промежутке.

Решение 1

s = 1
ans = 1 # т.к. у 1 тоже один нечетный натуральный делитель, то изначально ans=1
while s * 2 <= 10000:
    s *= 2
    ans += 1


print(ans)

Решение 2

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(1,10001):
    d = [i for i in divs(x) if i % 2 != 0 ] #список, в котором храняться только нечётные делители числа
    if len(d) == 1:
        count += 1
print(count)

Ответ: 14

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

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

Пусть M(N) – произведение 5 наименьших различных натуральных делителей натурального числа N, не считая единицы. Если у числа N меньше 5 таких делителей, то M(N) считается равным нулю.

Найдите 5 наименьших натуральных чисел, превышающих 500 000 000, для которых 0 < M (N) < N  .

В ответе запишите найденные значения M(N) в порядке возрастания соответствующих им чисел N.

Показать ответ и решение
counter = 0
x = 500000001
while counter < 5: # пока кол-во подходящих чисел меньше 5
    d = set() # множество делителей числа
    for i in range(2, int(x ** 0.5) + 1):
        if x % i == 0:
            d |= {i, x // i}
    if len(d) >= 5: # если кол-во делителей больше и равно 5
        d = sorted(d)[:5] # берем 5 наименьших делителей
        p = 1 # произведение делителей
        for i in d: # проход по делителям
            p *= i
        if 0 < p < x:
            print(p) # вывод произведения
            counter += 1 # увеличение подходящих чисел
    x += 1 # увеличение текущего числа

Ответ: 1008 1797092 48408867 1800 1156923

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

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

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

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

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 n in range(190201, 190280 + 1):
    d = [x for x in divs(n) if x % 2 == 0] #список, в котором хранятся только чётные делители числа
    if len(d) == 4: # если делителей ровно 4
        print(d[::-1]) # вывод делителей в обратном порядке

Ответ: 190226 838 454 2190234 17294 22 2190238 2606 146 2190252 95126 4 2190258 758 502 2190274 27182 14 2190276 95138 4 2

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

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

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

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

Показать ответ и решение
def m(n): # функция, которая считает сумму минимального и максимального нетривиальньных делителей
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return i + n // i
    return 0
k = 0
for i in range(452021 + 1, 10000000000000):
    if m(i) % 7 == 3:
        print(i, m(i))
        k += 1
    if k == 5: break

Ответ: 452025 150678 452029 23810 452034 226019 452048 226026 452062 226033

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

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

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [88535;153373],  числа, имеющие ровно 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)
count = 0
for x in range(88535,153374):
    d = [i for i in divs(x) if i % 2 != 0] #список,в котором хранятся только нечётные делители числа
    if len(d) == 5: # если таких делителей ровно 5
        count += 1
print(count)

Ответ: 3

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

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

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [88535;153373], числа, имеющие ровно 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)
count = 0
for x in range(88535,153374):
    d = [i for i in divs(x) if i % 2 == 0] #список,в котором хранятся только чётные делители числа
    if len(d) == 5: # если таких делителей ровно 5
        count += 1
print(count)

Ответ: 0

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

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

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [198374  ; 295381  ], числа, имеющие ровно 7  различных нечётных натуральных делителей. Для каждого числа выведите все эти семь делителей на экран в порядке возрастания (для каждого числа с новой строки).

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

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

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

a = 198374 # Зададим границы цикла
b = 295381
for i in range(a, b + 1): # +1 чтобы было включительно
    divs = []   # Массив, в который будем сохранять подходящие делители
    counter = 0  # Счетчик делителей числа
    for j in range(1, int(i**0.5) + 1):
        if i % j == 0: # Если нашли делитель
            if j % 2 == 1: # Если делитель нечетный, то он подходит
                divs.append(j)  # Сохраняем делитель
                counter += 1 # Увеличиваем счётчик
            # Если дополняющий делитель нечетный
            # и мы его еще не добавили, то он подходит
            if i // j % 2 == 1 and j != i // j:
                divs.append(i // j) # Сохраняем делитель
                counter += 1 # Увеличиваем счётчи
        # Оптимизируем прогу, выпрыгиваем из чисел с большим числом делителей
        if counter > 7:
            break
    if counter == 7: # Если нашли нужное число
    # Выводим делители в порядке возрастания без []
        print(*(sorted(divs)))

Ответ: 1 7 49 343 2401 16807 117649 1 5 25 125 625 3125 15625

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

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

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

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

Решение 1

def countDelitel(n):
    count = 0
    for j in range(2, int(n ** 0.5) + 1):
        if n % j == 0:
            count += 2
          if j == n // j:
              count -= 1
        if count > 3:
            return False
    if count == 3:
        return True
    return False

k = 0
for i in range(123123, 321322):
    if countDelitel(i):
        k += 1
print(k)

 

Решение 2

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

ans = 0
for i in range(123123,321322):
    if int(i ** 0.25) == i ** 0.25 and prime(i ** 0.25):
        ans += 1
print(ans)

Ответ: 2

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

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

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

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

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)
    return sorted(d)
count = 0
for x in range(52112,623123):
    d = [i for i in divs(x) if prime(i)] # список, в котором хранятся только простые делители числа
    if len(d) == 3:
        count += 1
print(count)

Ответ: 218197

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

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

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

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

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

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