|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
||||||||||||||||
Как быстро найти сумму делителей числа?16.02.2017, 11:09. Показов 8466. Ответов 19
Метки нет (Все метки)
Сейчас использую эту функцию.
![]() main(): Кликните здесь для просмотра всего текста
Результат:
Нет ли чего побыстрее? ... простенького и со вкусом. Желательно, чтобы можно было подсунуть компилятору. (он у меня тупой, идеи совсем не понимает..)
0
|
||||||||||||||||
| 16.02.2017, 11:09 | |
|
Ответы с готовыми решениями:
19
Найти сумму общих делителей числа
|
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
||
| 16.02.2017, 11:31 | ||
|
Хороший выигрыш в скорости будет, если у числа есть небольшие простые делители.
0
|
||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
|||||||
| 16.02.2017, 11:51 [ТС] | |||||||
// нахождение простых делителей числа. Например, 11535948608896485110
. Получаем массив UINT64 prime_factors[7]={2, 5, 151, 599, 14159, 29663, 30367}; А дальше-то как? Похоже, надо найти произведение всех перестановок массива prime_factors, исключив повторяющиеся. - это и будут оставшиеся делители. Сделать это не получается совсем.
0
|
|||||||
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|||||||
| 16.02.2017, 12:19 | |||||||
|
SerVal, чуток не так. Если число N делится на i, надо делить столько раз, сколько можно. И запоминать, сколько раз разделилось. И sqrtN корректировать, конечно. Может быть здесь более уместен цикл
Вот вы получили вектор (p1, k1) (p2,k2) ... (pn, kn) И генерируете все числа от 1 до (k1-1) (k2-1) ... (kn-1) - В скобках "цифры" нашей с/с. А генерация более чем проста - проста +1. После перекура приведу пример. ![]() Добавлено через 11 минут N = 360 Вектор = (2,3) (3,2) (5,1) Число в с.с 4-3-2 (я там слегка ошибся. Система счисления k1+1 - k2+1 - ... kn+1 и цифры k1 k2 ... kn). За ним - делитель 001 5 010 3 011 3*5 = 15 020 3*3 = 9 021 3*3*5 = 45 100 2 101 2*5 =10 110 2*3 = 6 111 2*3*5 = 30 120 2*3*3 = 18 121 2*3*3*5 = 90 200 2*2 = 4 201 2*2*5 = 20 ... Уфф... Дальше продолжаете сами Последняя комбинация 321 не нужна. Она представляет 2*2*2*3*3*5 = 360 - само число N
1
|
|||||||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
||||||||
| 16.02.2017, 13:38 [ТС] | ||||||||
Намного хуже то, что это непонятно компилятору. ![]() Ему-то что подсунуть?... моя придурошная функция хоть и медленно, но считает. Дорогой Байт, у меня такое впечатление, что Вы всё считали на бумажке. Добавлено через 29 минут
Пока только посчитал их количество сегментированным решетом Эратосфена.
0
|
||||||||
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
||||||||||
| 16.02.2017, 13:51 | ||||||||||
Второй момент - генерация делителей на основе полученного вектора vec <p,k> Как это делается, я показал на примере с числом N = 360. Посмотрите на него внимательнее. Это похоже на работу колесиков спидометра. На каждом колесике -Ki позиций. После Ki "щелчков" следующее (i-1)-е колесико поворачивается на 1, а текущее возвращается к нулю. Полная аналогия с последовательным прибавлением 1 к десятичному (или двоичному) числу. Для двоичных (меньше писать) процесс происходит так. 001 010 011 100 101 110 111 В моем примере тоже самое. Но для каждого разряда (колесика) - разные пределы значений. Это и называется "смешанная система счисления." А получив очередное число, мы легко находим делитель, просто перемножая соответствующие степени pi. Легко понять, что так мы получим все делители, и ни один не повторится. Добавлено через 2 минуты Добавлено через 3 минуты
1
|
||||||||||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
||||||||||||
| 16.02.2017, 14:46 [ТС] | ||||||||||||
|
Спасибо Вам за желание помочь. Проблема однако ж в том, что я тут не самый умный... ... а компилятор - ещё тупее. ![]() Поэтому, я всегда объясняю, как для тупых. Например: // функция count_primes_in_range(Number from, Number to) // возвращает число простых чисел в диапазоне от "from" до "to" Кликните здесь для просмотра всего текста
функция main:
Ах да, в теории работы холодильника я тоже не разбираюсь. Но надо, чтобы он работал, даже если в теории я ни бум-бум. ![]() Добавлено через 12 минут Ещё я полазил по Инету. Там вообще, всё самые умные и всем объясняют теорию. А когда их просишь найти сумму делителей хотя бы для N = 11535948608896485110, в ответ выдают ещё больше теории.. ... суммы делителей, разумеется, как не было, так и нет.
0
|
||||||||||||
|
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
|||||||
| 16.02.2017, 17:14 | |||||||
|
UINT64 d[7] = {2, 5, 151, 599, 14159, 29663, 30367}; И нашли, что исходное число делится на каждый делитель столько раз: int m[7] = {1, 1, 1, 1, 1, 1, 1}; В примере Байта это будет, соответственно: UINT64 d[3] = {2, 3, 5}; int m[3] = {3, 2, 1}; Это так, в качество аналогии... Далее, наше число UINT64 num = 11535948608896485110; Тогда сумму всех делителей получим, как UINT64 sum = SumD(d,m,7)-num; //отнимаем само число,т.к. само число тоже попадает в результат
Уточняю, что массив d - это массив простых делителей
1
|
|||||||
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
||
| 16.02.2017, 17:23 | ||
|
_liv_, вот именно нечто подобное я и имел в виду. (код ваш проверять не стал. пусть этим займется ТС, а то ему совсем нечего делать будет
)
0
|
||
|
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
||
| 16.02.2017, 17:30 | ||
Впрочем, это не очень много. Можно и проверить. А так, считает мгновенно! Кстати, и сам по себе алгоритм вложенных циклов с переменным количеством циклов весьма примечателен... Аж самому понравилось
0
|
||
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
||
| 16.02.2017, 17:39 | ||
0
|
||
|
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
||||||
| 16.02.2017, 18:32 | ||||||
Сообщение было отмечено SerVal как решение
Решение
SerVal, подправленная версия. Чтобы не отнимать исходное число
![]() UINT64 sum = SumD(d,m,7); Кстати, о птичках. Ваша программа считает немного неправильно. Учитывает единицу, т.е. добавляет 1 Реальная сумма всех делителей, не равных 1 и себе, на 1 меньше ![]()
0
|
||||||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
|||||||||||
| 16.02.2017, 18:32 [ТС] | |||||||||||
|
Ребятки, огромное спасибо. Правда, я не мудрствуя лукаво и не обладая могучим умом, набрёл в недрах форума на классную программку вычисления суммы делителей числа: Найти сумму делителей
Подрихтовал и в конце вычел само число. Итого: Нахождение суммы делителей числа: UINT64 SumD(UINT64 N); Кликните здесь для просмотра всего текста
Вычисляет, вроде бы правильно. Результат:
_liv_ - Вашу функцию тоже скомпилю, сравню результаты и померяю быстродействие. Потом напишу здесь. *больше всего опасаюсь переполнения UINT64. C++ ничего об этом не скажет. А потом надо будет посмотреть, какая из функций быстрее выполняется на видео-карте (CUDA).
0
|
|||||||||||
|
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
||
| 16.02.2017, 18:36 | ||
|
В общем случае, сумма делителей может и превысить.
0
|
||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
||
| 16.02.2017, 18:44 [ТС] | ||
|
А у них считаются все делители, кроме самого числа. Ещё раз, спасибо.
0
|
||
|
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
|||
| 16.02.2017, 18:49 | |||
И не надо предварительно искать простые делители...Только одно замечание: та программа складывает и 1, и само число! Почему не видно? Да потому, что сумма переходит через 0 (переполнение)! Попробуйте число поменьше, например, 18, сумма должна быть 2+3+6+9 = 20. А получится 20+1+18 = 39 Добавлено через 2 минуты
0
|
|||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
|||||||
| 16.02.2017, 18:58 [ТС] | |||||||
0
|
|||||||
|
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
| 16.02.2017, 19:01 | |
|
Значит, разобрались
![]() Ну и славненько! ![]() Удачи!
0
|
|
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
||
| 17.02.2017, 11:19 | ||
|
Да, красиво. Хорошая алгебра. Каждый новый простой делитель добавляет серию геометрических прогрессий. И остается только правильно вынести за скобки....
![]() Имхо, разница по времени не должна быть велика. Но несомненный плюс - не требуется дополнительной памяти. Добавлено через 16 часов 16 минут
0
|
||
|
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
|
| 17.02.2017, 12:19 | |
|
Пример. Делители числа 27 * 5
1 5 3 3*5 9 9*5 27 27*5 Сумма делителей равна ( 1 + 3 + 9 + 27 ) * ( 1 + 5 ) = ( 81-1)/(3-1) * (25-1) / (5-1). SerVal, _liv_, можно заметить некоторую закономерность ![]() Добавлено через 4 минуты Добавлено через 5 минут Сумма делителей - пример мультипликативной функции
3
|
|
| 17.02.2017, 12:19 | |
|
Помогаю со студенческими работами здесь
20
Найти сумму четных делителей натурального числа
Посчитать сумму цифр и сумму делителей данного целого числа Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|