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

Посчитать кол-во чисел со всевозможными кол-вами делителей

01.03.2021, 23:25. Показов 2813. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вводится диапазон, например, от 0 до 1 000 000
Вывод
Количество чисел с 1 делителем: 1
Количество чисел с 2 делителями: ...
Количество чисел с 3 делителями: ...
Количество чисел с 4 делителями: ...
и т.д. до кол-ва чисел с максимальным кол-вом делителей
То есть нужно выводить для каждого кол-ва делителей, даже если 0 таких чисел

Вот программа, которая считает кол-во чисел с 4 делителями:

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
26
27
28
29
30
31
32
33
34
def prns(n):
    list_true = [True] * n
    for o in range(3, (int(n ** 0.5) + 1), 2):
        if list_true[o]:
            list_true[o * o::2 * o] = [False] * ((n - o * o - 1) // (2 * o) + 1)
    return [2] + [u for u in range(3, n, 2) if list_true[u]]
 
 
def check(n):
    if n & 1 == 0:
        return False
    d = 3
    while d * d <= n:
        if n % d == 0:
            return False
        d = d + 2
    return True
 
 
def solution():
    counter = 0
    e = int(input())
    f = int(input())
    prn = prns(int(f ** 0.5))
    for n in range(e, f + 1):
        for i in prn:
            if (i * i < n and not n % i and
                    check(n // i)):
                counter += 1
                break
    print(counter)
 
 
solution()
Например в диапазоне от 0 до 1000000 209867 чисел имеют 4 делителя
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.03.2021, 23:25
Ответы с готовыми решениями:

Составьте программу, которая определяет кол-во отрицательных, кол-во положительных и кол-во нулей среди введеных чисел
Составьте программу, которая определяет кол-во отрицательных, кол-во положительных и кол-во нулей среди введенных чисел. Количество...

Посчитать кол-во отрицательных и кол-во положительных элементов массива. Вывести массив на экран
Дан массив 5x5, заполнен случайными числами от -10 до 10. Посчитать кол-во отрицательных и кол-во положительных элементов массива. Вывести...

Посчитать кол-во слов в каждом абзаце и кол-во абзацев.
2. Посчитать количество слов в каждом абзаце и количество абзацев. Абзац начинается с S-ти пробелов. Всё это работа с текстовым файлом. ...

15
102 / 85 / 25
Регистрация: 21.05.2019
Сообщений: 481
02.03.2021, 10:10

Не по теме:

Ципихович Эндрю не твой родственник? :rofl:



Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from itertools import chain, groupby
 
num_of_div = 20
res_dict = {}
 
divs = lambda n: chain(*((d, n // d) for d in range(1, int(n ** 0.5) + 1) if n % d == 0))
lst =[list(set(i)) for i in[list(divs(i)) for i in range(1, num_of_div)]]
 
for i in range(1, num_of_div):
    res_dict["Делителей на {}".format(i)] = 0
 
for i in lst:
    for k in range(1, num_of_div):
        if k in i:
            res_dict["Делителей на {}".format(k)] += 1
 
print(res_dict)
Создаём функцию для получения делителя для конкретного числа
Получаем массив делителей для каждого числа и через set удаляем повторы
Создаём словарь с нулевыми значениями (иначе не сможем использовать += 1)
Преобразуем вложенный список в словарь

Вывод:
'Делителей на 1': 19, 'Делителей на 2': 9, 'Делителей на 3': 6, 'Делителей на 4': 4,
'Делителей на 5': 3, 'Делителей на 6': 3, 'Делителей на 7': 2, 'Делителей на 8': 2,
'Делителей на 9': 2, 'Делителей на 10': 1, 'Делителей на 11': 1, 'Делителей на 12': 1,
'Делителей на 13': 1, 'Делителей на 14': 1, 'Делителей на 15': 1, 'Делителей на 16': 1,
'Делителей на 17': 1, 'Делителей на 18': 1, 'Делителей на 19': 1
0
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
02.03.2021, 10:21  [ТС]
RSAX,

Не по теме:

нет, а почему вы подумали?



Добавлено через 1 минуту
RSAX, мне кажется ваша программа делает обратное: она ищет кол-во чисел, которые делятся на какое-то число, а нужно посчитать кол-во чисел с одним кол-во делителей
0
102 / 85 / 25
Регистрация: 21.05.2019
Сообщений: 481
02.03.2021, 14:15

Не по теме:

gray621, да код интересно пишешь



Так чтоли?

Python
1
2
3
4
5
6
7
8
from itertools import chain, groupby
from collections import Counter
 
num_of_div = 1000000
 
divs = lambda n: chain(*((d, n // d) for d in range(1, int(n ** 0.5) + 1) if n % d == 0))
lst =[list(set(i)) for i in[list(divs(i)) for i in range(1, num_of_div)]]
print(dict(Counter([len(i) for i in lst])))
Code
1
2
3
4
5
6
7
8
9
10
11
Вывод:
1: 1, 2: 78498, 3: 168, 4: 209892, 6: 43870, 5: 11, 8: 224427, 9: 291, 10: 8117, 
12: 91554, 7: 4, 16: 127275, 15: 109, 18: 9270, 14: 2059, 20: 15018, 24: 69142, 
21: 44, 30: 2779, 32: 40592, 27: 156, 28: 3356, 11: 2, 36: 12571, 25: 7, 40: 9199, 
48: 23663, 42: 669, 22: 168, 45: 86, 13: 2, 60: 2896, 35: 7, 54: 905, 50: 176, 56: 1681, 
64: 6746, 33: 11, 72: 4946, 26: 52, 63: 29, 80: 2157, 44: 195, 84: 510, 90: 276, 70: 75, 
96: 3304, 75: 13, 39: 5, 81: 25, 100: 120, 66: 49, 49: 1, 108: 448, 120: 667, 112: 265, 
52: 45, 17: 1, 55: 3, 128: 408, 126: 42, 88: 52, 144: 464, 105: 7, 160: 121, 135: 7, 
140: 23, 78: 11, 34: 5, 168: 54, 150: 13, 99: 2, 98: 6, 19: 1, 180: 39, 132: 12, 65: 1, 
192: 70, 162: 13, 110: 3, 104: 6, 200: 5, 216: 9, 51: 1, 224: 3, 189: 1, 240: 5, 77: 1, 
38: 1, 125: 1, 210: 1, 117: 1, 176: 1, 68: 1
Добавлено через 4 минуты
Или как принято на форуме в одну строчку

Python
1
print(dict(__import__("collections").Counter([len(i) for i in[list(set(i)) for i in[list((lambda n: __import__("itertools").chain(*((d, n // d) for d in range(1, int(n ** 0.5) + 1) if n % d == 0)))(i)) for i in range(1, 1000)]]])))
1
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
02.03.2021, 15:24  [ТС]
RSAX, в чём-то ошибка, в 1 000 000 209867 числа имеют 4 делителя, а не 209892, и можно как-то сделать упорядоченный вывод, почему-то после 4 делителей 6, после 189 делителей 240
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
02.03.2021, 17:04
gray621, у тебя ошибка на 25 чисел - это кубы простых чисел - 8, 27, 125, 343... До миллиона их 25
0
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
02.03.2021, 19:34  [ТС]
Gdez, ну так это у тебя ошибка, у кубов 4 делителя, поэтому на 25 больше

Добавлено через 15 минут
А нет, это я взял наверное твой старый код, прости

Добавлено через 16 минут
Gdez, RSAX, а как сделать упорядо,черный вывод из словаря?
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
02.03.2021, 22:19
Лучший ответ Сообщение было отмечено 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
26
27
28
29
30
31
32
from collections import Counter
from math import log
import numpy as np
def primes(n):
    nn = int(np.sqrt(n)) + 1
    pr = np.ones(nn, dtype = 'int')
    for p in range(3, int(np.sqrt(nn)) + 1, 2) :
        if pr[p] :
            pr[np.arange(p*p, nn, 2*p)] = 0
    res = np.array(np.nonzero(pr)).ravel()
    res = res[(res%2 == 1),]
    res[0,] = 2
    return res 
 
def main():
    k = 1000000
    pr = primes(k)
    arr = np.arange(1, k + 1)
    res = np.ones(k, dtype=int, order='F')
    for p in pr:
        tmp = np.ones(k, dtype=int, order='F')
        npow = int(log(k, p)) + 1
        for i in range(1, npow):
            tmp[(arr%p == 0)] += 1
            arr[(arr%p == 0)] //= p
        res = np.multiply(tmp, res)
    arr[(arr > 1)] = 2
    res = np.multiply(arr, res)
    res = Counter(res.tolist())
    print(sorted(res.items()))
 
main()
1
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
02.03.2021, 22:30  [ТС]
Gdez, функция primes медленная
0
 Аватар для Matrix3007
198 / 164 / 41
Регистрация: 13.05.2019
Сообщений: 844
02.03.2021, 22:35
Цитата Сообщение от gray621 Посмотреть сообщение
функция primes медленная
Напиши быструю.
0
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
02.03.2021, 22:36  [ТС]
Gdez,
Python
1
2
3
4
5
6
def prns(n):
    list_true = [True] * n
    for o in range(3, (int(n ** 0.5) + 1), 2):
        if list_true[o]:
            list_true[o * o::2 * o] = [False] * ((n - o * o - 1) // (2 * o) + 1)
    return [2] + [u for u in range(3, n, 2) if list_true[u]]
эта функция гораздо быстрее
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
02.03.2021, 22:42
gray621, ошибаешься
0
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
02.03.2021, 22:46  [ТС]
Gdez, она вроде до миллиарда не так долго выводила

Добавлено через 1 минуту
а ну все понятно она на numpy, но функция prns без
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
02.03.2021, 22:46
До 10^6 отстает немного, а уже при 10^9 - значительно
0
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
02.03.2021, 23:08  [ТС]
Gdez, можешь помочь сделать график на полученных данных, пж? Я не очень разбираюсь в matplotlib
0
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
03.03.2021, 18:48  [ТС]
Gdez, с графиком и выводом, но я не знаю как сделать график лучше, можете помочь, пожалуйста?

Добавлено через 24 секунды
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from collections import Counter
from math import log
import numpy as np
import matplotlib.pyplot as plt
 
 
def primes(n):
    nn = int(np.sqrt(n)) + 1
    pr = np.ones(nn, dtype='int')
    for p in range(3, int(np.sqrt(nn)) + 1, 2):
        if pr[p]:
            pr[np.arange(p * p, nn, 2 * p)] = 0
    res = np.array(np.nonzero(pr)).ravel()
    res = res[(res % 2 == 1)]
    res[0] = 2
    return res
 
 
def main():
    k = int(input())
    pr = primes(k)
    arr = np.arange(1, k + 1)
    res = np.ones(k, dtype=int, order='F')
 
    for p in pr:
        tmp = np.ones(k, dtype=int, order='F')
        npow = int(log(k, p)) + 1
 
        for i in range(1, npow):
            tmp[(arr % p == 0)] += 1
            arr[(arr % p == 0)] //= p
 
        res = np.multiply(tmp, res)
 
    arr[(arr > 1)] = 2
    res = np.multiply(arr, res)
    res = Counter(res.tolist())
    solution = sorted(res.items())
    for group_ in solution:
        print(f"Количество чисел с {group_[0]} делителем: {group_[1]}")
 
    fig, ax = plt.subplots()
    ax.set_facecolor('seashell')
    fig.set_facecolor('floralwhite')
    fig.set_figwidth(12)
    fig.set_figheight(6)
    ax.set_ylabel("Количество чисел")
    ax.set_title("Количество делителей")
    x_s = [group_[0] for group_ in solution]
    # plt.xticks(np.arange(0, max(x_s) + 1, 5))
    y_s = [group_[1] for group_ in solution]
    # plt.yticks(np.arange(0, max(y_s) + 1, 10000))
 
    for group_ in solution:
        x = group_[0]
        y = group_[1]
        ax.bar(x, y)
 
    plt.show()
 
 
main()
Добавлено через 3 минуты
Gdez, как посчитать до миллиарда? я компьютер оставил на 16 часов и он не посчитал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.03.2021, 18:48
Помогаю со студенческими работами здесь

Дан файл f, элементы которого являются целыми числами. найти кол-во удвоенных нечетных чисел и кол-во четных чисел
Дан файл f, элементы которого являются целыми числами. Найти количество удвоенных нечетных чисел и количество четных чисел среди...

Сделать таблицу n строк: адрес, кол-во проживающих, кол-во комнат и кол-во метров в каждой комнате
В задании нужно сделать таблицу n строк. Адрес, кол-во проживающих, кол-во комнат и кол-во метров в каждой комнате. public class second {...

Определить кол-во чисел, имеющих ровно 5 делителей, среди 1-го миллиона натуральных чисел
Среди первого миллиона десятичных натуральных чисел количество чисел, имеющих ровно пять делителей (единица и само число не учитываются),...

Определение суммы и кол-ва вещественных чисел принадлежащих отрезку [a,b] // Кол-во вхождений строки // Матрица
Помогите решить 3 задачи, пожалуйста! 1) Вводится последовательность вещественных чисел, оканчивающаяся нулём, и состоящая более чем...

Посчитать кол-во чисел в массиве
Сначала задаётся массив с числами, например: 15 1 1 1 2 3 5 5 7 8 8 4 3 3 3 3 Дальше задаётся массив чисел, которые мы будем...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru