Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/64: Рейтинг темы: голосов - 64, средняя оценка - 4.86
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406

Найти число по количеству делителей

17.01.2021, 19:52. Показов 13388. Ответов 14

Студворк — интернет-сервис помощи студентам
Формат ввода
Вводится натуральное число – количество делителей, считая единицу и само число.

Формат вывода
Вывести наименьшее число с таким количеством делителей.

Пример 1
Ввод Вывод
8
24
Пример 2
Ввод Вывод
48
2520
Примечания
При решении нельзя использовать функции и методы, а также списки и словари.

Вот код, чтобы найти кол-во делителей числа, а как наоборот?

Python
1
2
3
4
5
6
7
8
9
10
n = int(input())
count_of_dividers = 0
 
for i in range(n - 1, 1, -1):
 
    if n % i == 0:
 
        count_of_dividers += 1
 
print(count_of_dividers)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.01.2021, 19:52
Ответы с готовыми решениями:

Найти число от 1 до n имеющее максимальное число делителей
Ограничение по времени: 2 секунды Ограничение по памяти: 256 мегабайт ------------------------------------------------------------- ...

Найти минимальное число по заданному количеству делителей
Задача кода: - найти число (минимальное) по заданному к-ву делителей. uses crt; var n,n0:word; mn:arrayof comp; ...

По заданному количеству делителей числа требуется найти само это число
По заданному количеству делителей числа требуется найти само это число. Входные данные Во входном файле INPUT.TXT записано ...

14
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
17.01.2021, 20:32
На основе вашего кода:
Python
1
2
3
4
5
6
7
8
9
10
11
divs = int(input())
n = 1
while True:
    count_of_dividers = 0
    for i in range(n, 0, -1):
        if n % i == 0:
            count_of_dividers += 1
    if count_of_dividers == divs:
        print(n)
        break
    n += 1
1
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
17.01.2021, 20:42
gray621, подсказка - количество делителей :
https://www.cyberforum.ru/cgi-bin/latex.cgi?\prod_{}^{}({{p}_{i}}^{} + 1)
Где https://www.cyberforum.ru/cgi-bin/latex.cgi?{p}_{i} - степень простого i-го множителя в составе исходного числа
24 -> 2*2*2*3 -> https://www.cyberforum.ru/cgi-bin/latex.cgi?{2}^{3} * {3}^{1}
Итого множителей = (3+1) * (1+1) = 8
1
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
17.01.2021, 20:52  [ТС]
Цитата Сообщение от unfindable_404 Посмотреть сообщение
divs = int(input())
n = 1
while True:
    count_of_dividers = 0
    for i in range(n, 0, -1):
        if n % i == 0:
            count_of_dividers += 1
    if count_of_dividers == divs:
        print(n)
        break
    n += 1
Спасибо, у меня не получалось придумать ещё n, а так всё такое же.

Добавлено через 5 минут
Python
1
2
3
4
5
6
7
8
9
10
11
divs = int(input())
n = 1
while True:
    count_of_dividers = 0
    for i in range(n, 0, -1):
        if n % i == 0:
            count_of_dividers += 1
    if count_of_dividers == divs:
        print(n)
        break
    n += 1
Код не работает на 18 тесте, превышен лимит времени, можно как-то ускорить цикл?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
17.01.2021, 21:06
gray621, ограничения на "n" есть ?
0
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
17.01.2021, 21:23  [ТС]
Цитата Сообщение от Gdez Посмотреть сообщение
ограничения на "n" есть ?
Нет, но есть ограничение на время 1 секунда, а тест идёт 1064 ms, то есть нужно ускорить цикл немножко.

Добавлено через 15 минут
Я думаю можно уменьшить время пополам если уменьшить в range number пополам, т.к. делителей больше половины числа нет. Как это реализовать если в range int?
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
17.01.2021, 21:35
Нарыл решение

Но оно не удовлетворяет условию:
Цитата Сообщение от gray621 Посмотреть сообщение
При решении нельзя использовать функции и методы, а также списки и словари.
В т. ч. мемоизация.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
17.01.2021, 22:08
Лучший ответ Сообщение было отмечено gray621 как решение

Решение

gray621, если не ошибся
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
divs = int(input())
if divs % 2 :
    n = 1
    while True:
        if int(n**0.5) == n**0.5 :
            count_of_dividers = 1
            for i in range(1, int(n**0.5)):
                if n % i == 0:
                    count_of_dividers += 2
            if count_of_dividers == divs:
                print(n)
                break
        n += 1
else :
    n = divs
    while True:
        if int(n**0.5) != n**0.5 :
            count_of_dividers = 0
            for i in range(1, int(n**0.5) + 1) :
                if n % i == 0 :
                    count_of_dividers += 2
            if count_of_dividers == divs:
                print(n)
                break
        n += 2
Добавлено через 7 минут
Arsegg, на кодфорсе как то набрел на задачку по делителям. Вроде решил - тесты все прошла. Но позже сам нашел при каких N неверно считает мой код. Там через плюсики с реккурсией решили.
Если интересует, то возможно найду задачу на кодфорс. А тут я выкладывал тему :
Разложение на множители
1
17.01.2021, 22:34

Не по теме:

Цитата Сообщение от Gdez Посмотреть сообщение
Если интересует, то возможно найду задачу на кодфорс.
Полагаю, задача div1. :D

0
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
17.01.2021, 22:49  [ТС]
Цитата Сообщение от Gdez Посмотреть сообщение
divs = int(input())
if divs % 2 :
    n = 1
    while True:
        if int(n**0.5) == n**0.5 :
            count_of_dividers = 1
            for i in range(1, int(n**0.5)):
                if n % i == 0:
                    count_of_dividers += 2
            if count_of_dividers == divs:
                print(n)
                break
        n += 1
else :
    n = divs
    while True:
        if int(n**0.5) != n**0.5 :
            count_of_dividers = 0
            for i in range(1, int(n**0.5) + 1) :
                if n % i == 0 :
                    count_of_dividers += 2
            if count_of_dividers == divs:
                print(n)
                break
        n += 2
А почему там n в корень возводится, а не пополам делится?

Добавлено через 5 минут
Зачем проверка
Python
1
if int(number ** 0.5) == number ** 0.5
?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
17.01.2021, 23:11
Arsegg,

Не по теме:

нет. Нашел https://codeforces.com/contest... bile=false



Добавлено через 5 минут
gray621,
А почему там n в корень возводится, а не пополам делится?
Потому что это не слагаемые, а делители. Допустим для 40 не нужно искать делители больше 6, сразу считать парами - 1 и 40, 2 и 20, 4 и 10, 5 и 8; всего 8 делителей.
Первый while перебирает квадраты чисел - у них нечетное число делителей.
Поэтому и проверка (это ответ на второй вопрос) - если число не квадрат другого числа, то количество делителей четное

Добавлено через 5 минут
gray621, Кроме 1, остальные минимальные числа с заданным количеством делителей - четные. Поэтому, если N > 1, то счетчик можно с шагом 2 по четным числам
2
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
17.01.2021, 23:25  [ТС]
Цитата Сообщение от Gdez Посмотреть сообщение
если число не квадрат другого числа, то количество делителей четное
То есть у квадратов чисел корни натуральные числа?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
17.01.2021, 23:41
gray621, нет
4 -> 1, 2, 4
9 -> 1, 3, 9
16 -> 1, 2, 4, 8 16
и тд
Допустим 36 -> (1 и 36) + (2 и 18) + (3 и 12) + (4 и 9) + (6 и 6)... Но 6 и 6 это одно число. Итого четыре пары делителей плюс один делитель (для 36 это 6). Это для всех чисел, которые квадраты какого то натурального делителя.

Добавлено через 2 минуты
А вообще, задача без функций и списков некорректна. Когда найдешь код, который пройдет все тесты, попробуй число, допустим, 59 или 77
0
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
18.01.2021, 00:14  [ТС]
Цитата Сообщение от Gdez Посмотреть сообщение
Когда найдешь код, который пройдет все тесты
Твой код прошёл

Добавлено через 15 секунд
Цитата Сообщение от Gdez Посмотреть сообщение
Когда найдешь код, который пройдет все тесты
Твой код прошёл

Добавлено через 10 секунд
Цитата Сообщение от Gdez Посмотреть сообщение
Когда найдешь код, который пройдет все тесты
Твой код прошёл

Добавлено через 22 минуты
Зачем проверка для чётного кол-во делителей
Python
1
if int(number ** 0.5) != number ** 0.5:
И ещё почему в range + 1?
Python
1
range(1, int(number ** 0.5) + 1):
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
18.01.2021, 04:38
gray621,
Зачем проверка для чётного кол-во делителей
Потому что для четных диапазон :
Python
1
range(1, int(number ** 0.5) + 1):
Для нечетных изначально можно не включать значение корня (для 36 число 6 уже входит -> count_of_dividers = 1)
Для четных нужно включать => допустим 42 -> его "целый" корень = 6 и для 6 парный делитель 7.
Если убрать проверку (что число не квадрат другого числа), то для N = 10 выведет ответ -> 36 -> посчитает пару (6 и 6)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.01.2021, 04:38
Помогаю со студенческими работами здесь

По количеству делителей числа определить само число
Название темы говорит само за себя, а теперь подробнее: По заданному количеству делителей числа требуется найти само это число. ...

Найти в диапазоне от M до N число с наибольшим количеством делителей. Функция: количество делителей заданного числа
Найти в диапазоне от M до N число с наибольшим количеством делителей. Функция: количество делителей заданного числа ...

Найти число, которое имеет максимальное число положительных целых делителей
Задано число n. Требуется найти число от 1 до n, включительно, которое имеет максимальное число положительных целых делителей. ...

Дано число P, нужно найти число от 1 до Р, с наибольшим количеством делителей
написал проггу, что не правильно уже 3 часа бьюсь... int p; int max=0,a = 0; Console.Write("Ведите...

Дано натуральное число N. Найти число от 1 до N с максимальной суммою делителей
Дано натуральное число N. Найти число от 1 до N с максимальной суммой делителей. Формат входных данных. Стандартный входной поток...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru