Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/40: Рейтинг темы: голосов - 40, средняя оценка - 4.53
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283

Как быстро найти сумму делителей числа?

16.02.2017, 11:09. Показов 8466. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сейчас использую эту функцию.
C++
1
2
3
4
5
6
7
8
9
// нахождение суммы делителей числа
uint64_t SumD(uint64_t N)
{
    uint64_t sum = 1;
    uint64_t sqrtN = static_cast<uint64_t>(sqrt((double)N));
    for (uint64_t i = 2; i <= sqrtN; i++)
        if (N % i == 0) sum += (i + N / i);
    return sum;
}
Быстрой её никак не назовёшь.
main():
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main(int argc, char *argv[])
{
    std::chrono::high_resolution_clock::time_point t1;
    std::chrono::high_resolution_clock::time_point t2;
 
    t1 =  std::chrono::high_resolution_clock::now();
 
    uint64_t num = 11535948608896485110ULL; // 2 5 151 599 14159 29663 30367
 
    std::cout << "Number \t\t= " << num << endl;
    uint64_t sum = SumD(num);
    std::cout << "Sum of divisors = " << sum << endl;
 
    t2 = std::chrono::high_resolution_clock::now();
 
    std::chrono::duration<double> time_span = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1);
    std::cout.precision(4);
    std::cout << "============" << endl;
    std::cout << "Exec time   : " << time_span.count() << " seconds.";  std::cout << std::endl;
 
    return 0;
}

Результат:
C++
1
2
3
4
5
D:\aProjects\CudaTest\x64\Release>PrimeSearchCuda.exe
Number          = 11535948608896485110
Sum of divisors = 9404042840179226890
============
Exec time   : 21.56 seconds.
Ребятки, искать делители одного числа 20 секунд... сами понимаете..
Нет ли чего побыстрее? ... простенького и со вкусом. Желательно, чтобы можно было подсунуть компилятору.
(он у меня тупой, идеи совсем не понимает..)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.02.2017, 11:09
Ответы с готовыми решениями:

Найти сумму общих делителей числа
помогите найти ошибку, найти сумму общих делителей числа #include &lt;iostream&gt; // for cin cout using namespace std; class chislo ...

Найти сумму делителей натурального числа
4. Нахождение суммы делителей натурального числа (само число и единицу в качестве делителей не рассматривать).

Найти сумму нечетных делителей натурального числа
Найти сумму нечетных делителей натурального числа. Hапишите полный текст программы пожалуйста. Спасибо

19
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
16.02.2017, 11:31
Цитата Сообщение от SerVal Посмотреть сообщение
Нет ли чего побыстрее? ... простенького и со вкусом.
Можно разложить число на простые множители, и генерировать их композиции. Если предварительно составить таблицу простых чисел до корня из N, то поиск-разложение пойдет побыстрее.
Хороший выигрыш в скорости будет, если у числа есть небольшие простые делители.
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
16.02.2017, 11:51  [ТС]
Можно разложить число на простые множители..
С этим проблем нет:

// нахождение простых делителей числа. Например, 11535948608896485110
C++
1
2
3
4
5
6
7
8
9
10
11
12
void get_prime_factors(UINT64 N, std::vector<UINT64> &vec)
{
    UINT64 sqrtN = static_cast<UINT64>(sqrt((double)N));
    for (int i = 2; i <= sqrtN; ++i)
    {
        while (N % i == 0) // check for divisibility
        {
            N /= i;
            vec.push_back(i);
        }
    }
}
Результат: 2 5 151 599 14159 29663 30367
.
Получаем массив UINT64 prime_factors[7]={2, 5, 151, 599, 14159, 29663, 30367};
А дальше-то как? Похоже, надо найти произведение всех перестановок массива prime_factors, исключив повторяющиеся.
- это и будут оставшиеся делители.
Сделать это не получается совсем.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
16.02.2017, 12:19
SerVal, чуток не так. Если число N делится на i, надо делить столько раз, сколько можно. И запоминать, сколько раз разделилось. И sqrtN корректировать, конечно. Может быть здесь более уместен цикл
C++
1
for(i=2; i*i < N; i++)
И в вектор записывать пары (p, k), p - простое, k - сколько раз разделилось.
Цитата Сообщение от SerVal Посмотреть сообщение
А дальше-то как? Похоже, надо найти произведение всех перестановок массива prime_factors, исключив повторяющиеся. - это и будут оставшиеся делители.
Что такое "смешанная система счисления", знаете?
Вот вы получили вектор (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
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
16.02.2017, 13:38  [ТС]
Система счисления k1+1 - k2+1 - ... kn+1 и цифры k1 k2 ... kn). За ним - делитель
Мда... ничего не понятно. Ну да ладно... то что мне непонятно - это пол-беды.
Намного хуже то, что это непонятно компилятору.
Ему-то что подсунуть?... моя придурошная функция хоть и медленно, но считает.
Дорогой Байт, у меня такое впечатление, что Вы всё считали на бумажке.

Добавлено через 29 минут
Если предварительно составить таблицу простых чисел до корня из N
Попробовал для числа N = 11535948608896485110
Пока только посчитал их количество сегментированным решетом Эратосфена.
C++
1
2
3
4
5
6
7
Number          = 11535948608896485110
Sum of divisors = 9404042840179226890
Exec time   : 20.72 seconds.
============
Primes in range 0 .. sqrtN : 162564143
Exec time   : 74.16 seconds.
============
То есть, сумма делителей находится быстрее, чем заполняется таблица простых чисел.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
16.02.2017, 13:51
Цитата Сообщение от SerVal Посмотреть сообщение
у меня такое впечатление, что Вы всё считали на бумажке.
Да, конечно. Все мои измышления - это просто алгоритм и пояснения к нему. Никакого кода. А уж закодировать это, имхо, не так уж сложно.
Цитата Сообщение от SerVal Посмотреть сообщение
ничего не понятно
Что именно непонятно? Там есть 2 момента. Первый - получение вектора пар <p, k>. Этот момент очень похож на ваш код. Ну, скажем, так
C++
1
2
3
4
5
6
7
for (int p = 2; p*p <= N; ++i)  {
        if (N % p == 0)   {
           for(k=0; N%p==0; k++, N /= p)  // тело цикла пустое
           ;
           vec.push_back(<p,k>);  // это псевдокод
        }
}
Обратите внимание, что условие (N%p==0) будет выполняться только для простых p. Для всех остальных он прокручивается впустую. Просто потому, что на все меньшие мы уже N разделили. Значит здесь есть резерв увеличения скорости. Проходить только по простым. Но, конечно, для этого надо предварительно составить их табличку (массив, вектор). Это имеет смысл, когда вы решаете задачу для многих чисел
Второй момент - генерация делителей на основе полученного вектора vec <p,k> Как это делается, я показал на примере с числом N = 360. Посмотрите на него внимательнее. Это похоже на работу колесиков спидометра. На каждом колесике -Ki позиций. После Ki "щелчков" следующее (i-1)-е колесико поворачивается на 1, а текущее возвращается к нулю. Полная аналогия с последовательным прибавлением 1 к десятичному (или двоичному) числу.
Для двоичных (меньше писать) процесс происходит так. 001 010 011 100 101 110 111
В моем примере тоже самое. Но для каждого разряда (колесика) - разные пределы значений. Это и называется "смешанная система счисления."
А получив очередное число, мы легко находим делитель, просто перемножая соответствующие степени pi. Легко понять, что так мы получим все делители, и ни один не повторится.

Добавлено через 2 минуты
Цитата Сообщение от SerVal Посмотреть сообщение
сумма делителей находится быстрее, чем заполняется таблица простых чисел.
Да конечно. Это имеет смысл, когда задачу приходится решать много раз. А таблицу - раз составил и сохранил.

Добавлено через 3 минуты
Цитата Сообщение от SerVal Посмотреть сообщение
то что мне непонятно - это пол-беды.Намного хуже то, что это непонятно компилятору.
Позвольте не согласиться. Если вы поймете, то компилятору легко объясните. А если поймет только компилятор...То есть вы будете иметь код, который совершенно не понимаете... Я бы не хотел быть на вашем месте
1
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
16.02.2017, 14:46  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
То есть вы будете иметь код, который совершенно не понимаете... Я бы не хотел быть на вашем месте
Так-то оно так.. но голодному нужны не лекции по сельскому хозяйству, а кусок хлеба.
Спасибо Вам за желание помочь. Проблема однако ж в том, что я тут не самый умный...
... а компилятор - ещё тупее.

Поэтому, я всегда объясняю, как для тупых. Например:
// функция count_primes_in_range(Number from, Number to)
// возвращает число простых чисел в диапазоне от "from" до "to"
Кликните здесь для просмотра всего текста

C++
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
63
64
typedef UINT64 Number;
Number count_primes_in_range(Number from, Number to)
{
    if (from <= 2) from = 3;
    else
    {
        if ((from & 1) == 0)
            from = from + 1;
    }
    if (from >= to) return 0;
    
    const Number memorySize = (to - from + 1) / 2;
 
    char* isPrime = new char[memorySize];
    memset(isPrime, 1, memorySize);
 
    Number sqrtI = (Number)sqrt((double)to);
    //for (Number i = 3; i*i <= to; i += 2)
    for (Number i = 3; i <= sqrtI; i += 2)
    {
        // skip multiples of three: 9, 15, 21, 27, ...
        if (i >= 3 * 3 && i % 3 == 0)
            continue;
        // skip multiples of five
        if (i >= 5 * 5 && i % 5 == 0)
            continue;
        // skip multiples of seven
        if (i >= 7 * 7 && i % 7 == 0)
            continue;
        // skip multiples of eleven
        if (i >= 11 * 11 && i % 11 == 0)
            continue;
        // skip multiples of thirteen
        //if (i >= 13 * 13 && i % 13 == 0)
        //  continue;
 
        // skip numbers before current slice
        Number minJ = ((from + i - 1) / i)*i;
        if (minJ < i*i)
            minJ = i*i;
 
        // start value must be odd
        if ((minJ & 1) == 0)
            minJ += i;
 
        // find all odd non-primes
        for (Number j = minJ; j <= to; j += 2 * i)
        {
            Number index = j - from;
            isPrime[index / 2] = 0;
        }
    }
    
    // count primes in this block
    UINT32 found = 0;
    for (UINT32 i = 0; i < memorySize; i++)
        found += isPrime[i];
    
    if (from <= 2) // 2 is not odd
        found++;
 
    delete[] isPrime;
    return found;
}

функция main:
C++
1
2
3
4
5
6
7
8
int main(int argc, char *argv[])
{
   uint64_t N = 11535948608896485110ULL;
   uint64_t sqrtN = static_cast<uint64_t>(sqrt((double)N));
   uint64_t n_primes_in_range = count_primes_in_range(0, sqrtN);
   std::cout << "Primes in range 0 .. sqrtN : " << n_primes_in_range << endl;
return 0;
}
Во! И всё понятно. Хотите разбирайтесь, хотите нет.. Но всё работает! ... и компилятор доволен. А Вы объясняете непонятно.
Ах да, в теории работы холодильника я тоже не разбираюсь. Но надо, чтобы он работал, даже если в теории я ни бум-бум.

Добавлено через 12 минут
Ещё я полазил по Инету. Там вообще, всё самые умные и всем объясняют теорию.
А когда их просишь найти сумму делителей хотя бы для N = 11535948608896485110, в ответ выдают ещё больше теории..
... суммы делителей, разумеется, как не было, так и нет.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
16.02.2017, 17:14
Цитата Сообщение от SerVal Посмотреть сообщение
Ему-то что подсунуть?
Допустим, мы нашли все делители. Пусть это будет массив
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; //отнимаем само число,т.к. само число тоже попадает в результат
C++
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
UINT64 SumD(UINT64 *pd, int *pm, int n)
{
    int     i, j1, j2;
    UINT64  sum = 0;
    UINT64  num;
    int     *pi;
 
    if (n)
    {
        pi = new int[n];
 
        for (i=0; i<n; i++)
            pi[i]=0;
 
        while (true)
        {
            for (i=n-1; i>=0; i--)
            {
                if (++pi[i]<=pm[i]) 
                    break;
                pi[i]=0;
            }
            
            num = 1;
            for(j1=0; j1<n; j1++)
            {
                for(j2=0; j2<pi[j1]; j2++)
                    num *= pd[j1];
            }
            sum += num;
 
            if (i==-1) 
                break;
        }
        delete[] pi;
    }
    return sum;
}
Добавлено через 10 минут
Уточняю, что массив d - это массив простых делителей
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
16.02.2017, 17:23
_liv_, вот именно нечто подобное я и имел в виду. (код ваш проверять не стал. пусть этим займется ТС, а то ему совсем нечего делать будет )
Цитата Сообщение от _liv_ Посмотреть сообщение
отнимаем само число,т.к. само число тоже попадает в результат
Это дело поправимое, просто надо выйти, когда все pi[i] = pm[i]
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
16.02.2017, 17:30
Цитата Сообщение от Байт Посмотреть сообщение
Это дело поправимое, просто надо выйти, когда все pi[i] = pm[i]
Байт, я тоже так сначала думал, но отнять исходное число все же быстрее, чем проверять все индексы Впрочем, это не очень много. Можно и проверить. А так, считает мгновенно!
Кстати, и сам по себе алгоритм вложенных циклов с переменным количеством циклов весьма примечателен...
Аж самому понравилось
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
16.02.2017, 17:39
Цитата Сообщение от _liv_ Посмотреть сообщение
сам по себе алгоритм вложенных циклов с переменным количеством циклов весьма примечателен...
Кстати, да. Ту же технику можно применить. Вектор, управляющий перебором. А то тут на форуме встречались задачки... 6 циклов я, говорит, еще могу друг в друга вложить. Могу и 7. А если 8 понадобится, что, опять весь код переписывать?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
16.02.2017, 18:32
Лучший ответ Сообщение было отмечено SerVal как решение

Решение

SerVal, подправленная версия. Чтобы не отнимать исходное число
UINT64 sum = SumD(d,m,7);
Кстати, о птичках. Ваша программа считает немного неправильно. Учитывает единицу, т.е. добавляет 1
Реальная сумма всех делителей, не равных 1 и себе, на 1 меньше
C++
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
UINT64 SumD1(UINT64 *pd, int *pm, int n)
{
    int     i, j1, j2;
    UINT64  sum = 0;
    UINT64  num;
    int     *pi;
 
    if (n)
    {
        pi = new int[n];
 
        for (i=0; i<n; i++)
            pi[i]=0;
 
        while (true)
        {
            for (i=n-1; i>=0; i--)
            {
                if (++pi[i]<=pm[i]) 
                    break;
                pi[i]=0;
            }
            
            for(j1=0; j1<n; j1++)
                if (pi[j1] != pm[j1])
                    break;
            if (j1 == n)
                break;
 
            num = 1;
            for(j1=0; j1<n; j1++)
            {
                for(j2=0; j2<pi[j1]; j2++)
                    num *= pd[j1];
            }
            sum += num;
        }
        delete[] pi;
    }
    return sum;
}
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
16.02.2017, 18:32  [ТС]
Ребятки, огромное спасибо. Правда, я не мудрствуя лукаво и не обладая могучим умом, набрёл в недрах форума на классную программку вычисления суммы делителей числа: Найти сумму делителей
Подрихтовал и в конце вычел само число. Итого:
Нахождение суммы делителей числа: UINT64 SumD(UINT64 N);
Кликните здесь для просмотра всего текста

C++
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
UINT64 SumD(UINT64 N)
{
    UINT64 a = N;
    UINT64 sum = 1, k = 1, i;
    if (a == 1)
        return a;
    while ((a & 1) == 0)
    {
        k <<= 1;
        a >>= 1;
    }
    k = (k << 1) - 1;
    if (a == 1)
        return k;
    else
        sum = k;
    for (i = 3; i*i <= a; i += 2)
    {
        k = 1;
        while (a % i == 0)
        {
            k *= i;
            a /= i;
        }
        if (k > 1)
            sum *= ((k * i) - 1) / (i - 1);
    }
    if (a > 1)
        sum *= a + 1;
 
    sum -= N;
    return sum;
}

Вычисляет, вроде бы правильно.
Результат:
C++
1
2
3
4
5
6
7
Number          = 11535948608896485110
Sum of divisors     = 9404042840179226890
Exec time   : 20.71 seconds.
============
New Sum of divisors = 9404042840179226890
Exec time   : 0.002 seconds.
============
Пока не могу определить - не будет ли переполнение разрядной сетки при умножениях?
_liv_ - Вашу функцию тоже скомпилю, сравню результаты и померяю быстродействие. Потом напишу здесь.
*больше всего опасаюсь переполнения UINT64. C++ ничего об этом не скажет.
А потом надо будет посмотреть, какая из функций быстрее выполняется на видео-карте (CUDA).
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
16.02.2017, 18:36
Цитата Сообщение от SerVal Посмотреть сообщение
больше всего опасаюсь переполнения UINT64
Ваш пример - на грани... Помещается в разрядную сетку.
В общем случае, сумма делителей может и превысить.
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
16.02.2017, 18:44  [ТС]
Цитата Сообщение от _liv_ Посмотреть сообщение
Кстати, о птичках. Ваша программа считает немного неправильно. Учитывает единицу, т.е. добавляет 1
Единица - тоже делитель. Как и само число. Вообще-то всё это для программы поиска дружественных чисел.
А у них считаются все делители, кроме самого числа.
Ещё раз, спасибо.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
16.02.2017, 18:49
Цитата Сообщение от SerVal Посмотреть сообщение
набрёл в недрах форума на классную программку вычисления суммы делителей числа
Красиво И не надо предварительно искать простые делители...
Только одно замечание: та программа складывает и 1, и само число!
Почему не видно? Да потому, что сумма переходит через 0 (переполнение)!
Попробуйте число поменьше, например, 18, сумма должна быть 2+3+6+9 = 20.
А получится 20+1+18 = 39

Добавлено через 2 минуты
Цитата Сообщение от SerVal Посмотреть сообщение
А у них считаются все делители, кроме самого числа.
Тогда для той программы отнять само число все-равно придется
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
16.02.2017, 18:58  [ТС]
Цитата Сообщение от _liv_ Посмотреть сообщение
Попробуйте число поменьше, например, 18, сумма должна быть 2+3+6+9 = 20.
А получится 20+1+18 = 39
Я ж привёл функцию под спойлером, где в конце само число вычитается. А единичка нужна по определению.
C++
1
2
3
4
5
6
7
Number          = 18
Sum of divisors = 21
Exec time   : 0.004 seconds.
============
New Sum of divisors = 21
Exec time   : 0.003 seconds.
============
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
16.02.2017, 19:01
Значит, разобрались
Ну и славненько!
Удачи!
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
17.02.2017, 11:19
Да, красиво. Хорошая алгебра. Каждый новый простой делитель добавляет серию геометрических прогрессий. И остается только правильно вынести за скобки....
Имхо, разница по времени не должна быть велика. Но несомненный плюс - не требуется дополнительной памяти.

Добавлено через 16 часов 16 минут
Цитата Сообщение от Байт Посмотреть сообщение
разница по времени не должна быть велика.
Немножко подумав, понял, что неправ. При большом количестве простых делителей (k1+k2+...kn) предложенный алгоритм будет значительно быстрее.
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 минуты

Не по теме:

Сразу не заметил, SerVal уже нашел подобную формулу.

Цитата Сообщение от SerVal Посмотреть сообщение
набрёл в недрах форума на классную программку вычисления суммы делителей числа: Найти сумму делителей



Добавлено через 5 минут
Сумма делителей - пример мультипликативной функции
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.02.2017, 12:19
Помогаю со студенческими работами здесь

Найти сумму нечетных делителей натурального числа
Помогите написать программу. Найти сумму нечетных делителей натурального числа, через цикл с параметром (for). Это для четных...

Найти сумму четных делителей натурального числа
пишу вот так , но не пойму до конца логику расчетов...объясните что забыл? #include &lt;iostream&gt; #include &lt;cmath&gt; ...

Найти сумму четных делителей натурального числа
Найти сумму ЧЕТНЫХ делителей натурального числа

Найти сумму простых делителей каждого числа заданной последовательности
Вводится последовательность целых чисел, 0 – конец последовательности. Для каждого числа последовательности найти сумму его простых...

Посчитать сумму цифр и сумму делителей данного целого числа
помогите пожалуйста Составить программу, которая решает следующие задачи, используя только переменные динамической памяти: посчитать...


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

Или воспользуйтесь поиском по форуму:
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru