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

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

Сумма простых делителей числа

Число

Разделитель групп разрядов

Округлить до

Число прописью

Скачать калькулятор

Рейтинг: 3.2 (Голосов 22)

×

Пожалуйста напишите с чем связна такая низкая оценка:

×

Для установки калькулятора на iPhone – просто добавьте страницу
«На главный экран»

Для установки калькулятора на Android – просто добавьте страницу
«На главный экран»

Сообщить об ошибке

Смотрите также

Неполное частное Деление столбиком Округление чисел Количество разрядов в числе
Найти делимое Все делители числа Деление с остатком Выгодность пиццы

Given a number N. The task is to find the sum of all the prime divisors of N. 

Examples: 

Input: 60
Output: 10
2, 3, 5 are prime divisors of 60

Input: 39
Output: 16
3, 13 are prime divisors of 39

A naive approach will be to iterate for all numbers till N and check if the number divides N. If the number divides N, check if that number is prime or not. Add all the prime numbers till N which divides N. 

Below is the implementation of the above approach:  

C++

#include <bits/stdc++.h>

using namespace std;

#define N 1000005

bool isPrime(int n)

{

    if (n <= 1)

        return false;

    if (n <= 3)

        return true;

    if (n % 2 == 0 || n % 3 == 0)

        return false;

    for (int i = 5; i * i <= n; i = i + 6)

        if (n % i == 0 || n % (i + 2) == 0)

            return false;

    return true;

}

int SumOfPrimeDivisors(int n)

{

    int sum = 0;

    for (int i = 1; i <= n; i++) {

        if (n % i == 0) {

            if (isPrime(i))

                sum += i;

        }

    }

    return sum;

}

int main()

{

    int n = 60;

    cout << "Sum of prime divisors of 60 is " << SumOfPrimeDivisors(n) << endl;

}

C

#include <stdio.h>

#include <stdbool.h>

#define N 1000005

bool isPrime(int n)

{

    if (n <= 1)

        return false;

    if (n <= 3)

        return true;

    if (n % 2 == 0 || n % 3 == 0)

        return false;

    for (int i = 5; i * i <= n; i = i + 6)

        if (n % i == 0 || n % (i + 2) == 0)

            return false;

    return true;

}

int SumOfPrimeDivisors(int n)

{

    int sum = 0;

    for (int i = 1; i <= n; i++) {

        if (n % i == 0) {

            if (isPrime(i))

                sum += i;

        }

    }

    return sum;

}

int main()

{

    int n = 60;

    printf("Sum of prime divisors of 60 is %dn",SumOfPrimeDivisors(n));

}

Java

import java.io.*;

import java.util.*;

class GFG

{

static boolean isPrime(int n)

{

    if (n <= 1)

        return false;

    if (n <= 3)

        return true;

    if (n % 2 == 0 || n % 3 == 0)

        return false;

    for (int i = 5;

             i * i <= n; i = i + 6)

        if (n % i == 0 ||

            n % (i + 2) == 0)

            return false;

    return true;

}

static int SumOfPrimeDivisors(int n)

{

    int sum = 0;

    for (int i = 1;

             i <= n; i++)

    {

        if (n % i == 0)

        {

            if (isPrime(i))

                sum += i;

        }

    }

    return sum;

}

public static void main(String args[])

{

    int n = 60;

    System.out.print("Sum of prime divisors of 60 is " +

                          SumOfPrimeDivisors(n) + "n");

}

}

C#

using System;

class GFG

{

static bool isPrime(int n)

{

    if (n <= 1)

        return false;

    if (n <= 3)

        return true;

    if (n % 2 == 0 || n % 3 == 0)

        return false;

    for (int i = 5;

             i * i <= n; i = i + 6)

        if (n % i == 0 ||

            n % (i + 2) == 0)

            return false;

    return true;

}

static int SumOfPrimeDivisors(int n)

{

    int sum = 0;

    for (int i = 1;

            i <= n; i++)

    {

        if (n % i == 0)

        {

            if (isPrime(i))

                sum += i;

        }

    }

    return sum;

}

public static void Main()

{

    int n = 60;

    Console.WriteLine("Sum of prime divisors of 60 is " +

                        SumOfPrimeDivisors(n) + "n");

}

}

Python3

N = 1000005

def isPrime(n):

    if n <= 1:

        return False

    if n <= 3:

        return True

    if n % 2 == 0 or n % 3 == 0:

        return False

    i = 5

    while i * i <= n:

        if (n % i == 0 or

            n % (i + 2) == 0):

            return False

        i = i + 6

    return True

def SumOfPrimeDivisors(n):

    sum = 0

    for i in range(1, n + 1) :

        if n % i == 0 :

            if isPrime(i):

                sum += i

    return sum

n = 60

print("Sum of prime divisors of 60 is " +

              str(SumOfPrimeDivisors(n)))

PHP

<?php

$N = 1000005;

function isPrime($n)

{

    global $N;

    if ($n <= 1)

        return false;

    if ($n <= 3)

        return true;

    if ($n % 2 == 0 || $n % 3 == 0)

        return false;

    for ($i = 5; $i * $i <= $n;

                 $i = $i + 6)

        if ($n % $i == 0 ||

            $n % ($i + 2) == 0)

            return false;

    return true;

}

function SumOfPrimeDivisors($n)

{

    $sum = 0;

    for ($i = 1; $i <= $n; $i++)

    {

        if ($n % $i == 0)

        {

            if (isPrime($i))

                $sum += $i;

        }

    }

    return $sum;

}

$n = 60;

echo "Sum of prime divisors of 60 is " .

                 SumOfPrimeDivisors($n);

?>

Javascript

<script>

    let N = 1000005;

    function isPrime(n)

    {

    if (n <= 1)

        return false;

    if (n <= 3)

        return true;

    if (n % 2 == 0 || n % 3 == 0)

        return false;

    for (let i = 5; i * i <= n; i = i + 6)

        if (n % i == 0 || n % (i + 2) == 0)

            return false;

    return true;

    }

    function SumOfPrimeDivisors(n)

    {

        let sum = 0;

    for (let i = 1; i <= n; i++) {

        if (n % i == 0) {

            if (isPrime(i))

                sum += i;

        }

    }

    return sum;

    }

    let n = 60;

    document.write("Sum of prime divisors of 60 is "+SumOfPrimeDivisors(n));

</script>

Output

Sum of prime divisors of 60 is 10

Time Complexity: O(N * sqrt(N)) 

Efficient Approach: The complexity can be reduced using Sieve of Eratosthenes with some modifications. The modifications are as follows:  

  • Take an array of size N and substitute zero in all the indexes(initially consider all the numbers are prime).
  • Iterate for all the numbers whose indexes have zero(i.e., it is prime numbers).
  • Add this number to all it’s multiples less than N
  • Return the array[N] value which has the sum stored in it.

Below is the implementation of the above approach.  

C++

#include <bits/stdc++.h>

using namespace std;

int Sum(int N)

{

    int SumOfPrimeDivisors[N+1] = { 0 };

    for (int i = 2; i <= N; ++i) {

        if (!SumOfPrimeDivisors[i]) {

            for (int j = i; j <= N; j += i) {

                SumOfPrimeDivisors[j] += i;

            }

        }

    }

    return SumOfPrimeDivisors[N];

}

int main()

{

    int N = 60;

    cout << "Sum of prime divisors of 60 is "

         << Sum(N) << endl;

}

Java

import java.io.*;

import java.util.*;

class GFG

{

static int Sum(int N)

{

    int SumOfPrimeDivisors[] = new int[N + 1];

    for (int i = 2; i <= N; ++i)

    {

        if (SumOfPrimeDivisors[i] == 0)

        {

            for (int j = i; j <= N; j += i)

            {

                SumOfPrimeDivisors[j] += i;

            }

        }

    }

    return SumOfPrimeDivisors[N];

}

public static void main(String args[])

{

    int N = 60;

    System.out.print("Sum of prime " +

                "divisors of 60 is " +

                       Sum(N) + "n");

}

}

Python3

def Sum(N):

    SumOfPrimeDivisors = [0] * (N + 1)

    for i in range(2, N + 1) :

        if (SumOfPrimeDivisors[i] == 0) :

            for j in range(i, N + 1, i) :

                SumOfPrimeDivisors[j] += i

    return SumOfPrimeDivisors[N]

N = 60

print("Sum of prime" ,

      "divisors of 60 is",

                  Sum(N));

C#

using System;

class GFG

{

static int Sum(int N)

{

    int []SumOfPrimeDivisors = new int[N + 1];

    for (int i = 2; i <= N; ++i)

    {

        if (SumOfPrimeDivisors[i] == 0)

        {

            for (int j = i;

                     j <= N; j += i)

            {

                SumOfPrimeDivisors[j] += i;

            }

        }

    }

    return SumOfPrimeDivisors[N];

}

public static void Main()

{

    int N = 60;

    Console.Write("Sum of prime " +

                    "divisors of 60 is " +

                         Sum(N) + "n");

}

}

PHP

<?php

function Sum($N)

{

    for($i = 0; $i <= $N; $i++)

        $SumOfPrimeDivisors[$i] = 0;

    for ($i = 2; $i <= $N; ++$i)

    {

        if (!$SumOfPrimeDivisors[$i])

        {

            for ($j = $i; $j <= $N; $j += $i)

            {

                $SumOfPrimeDivisors[$j] += $i;

            }

        }

    }

    return $SumOfPrimeDivisors[$N];

}

$N = 60;

echo "Sum of prime divisors of 60 is " . Sum($N);

?>

Javascript

<script>

    function Sum(N)

    {

        let SumOfPrimeDivisors = new Array(N+1);

        for(let i=0;i<SumOfPrimeDivisors.length;i++)

        {

            SumOfPrimeDivisors[i]=0;

        }

        for (let i = 2; i <= N; ++i)

        {

            if (SumOfPrimeDivisors[i] == 0)

            {

                for (let j = i; j <= N; j += i)

                {

                    SumOfPrimeDivisors[j] += i;

                }

            }

        }

        return SumOfPrimeDivisors[N];

    }

    let N = 60;

    document.write("Sum of prime " +

                "divisors of 60 is " +

                       Sum(N) + "<br>");

</script>

Output

Sum of prime divisors of 60 is 10

Time Complexity: O(N * log N) 

Efficient Approach:

Time complexity can be reduced by finding all the factors efficiently. Below approach describe how to find all the factors efficiently. If we look carefully, all the divisors are present in pairs. For example if n = 100, then the various pairs of divisors are: (1,100), (2,50), (4,25), (5,20), (10,10) Using this fact we could speed up our program significantly. We, however, have to be careful if there are two equal divisors as in the case of (10, 10). In such case, we’d take only one of them. 

Below is the implementation of the above approach. 

C++

#include <bits/stdc++.h>

using namespace std;

bool isPrime(int n)

{

    if (n <= 1)

        return false;

    if (n <= 3)

        return true;

    if (n % 2 == 0 || n % 3 == 0)

        return false;

    for (int i = 5; i * i <= n; i = i + 6)

        if (n % i == 0 || n % (i + 2) == 0)

            return false;

    return true;

}

int SumOfPrimeDivisors(int n)

{

    int sum = 0;

    int root_n = (int)sqrt(n);

    for (int i = 1; i <= root_n; i++) {

        if (n % i == 0) {

            if (i == n / i && isPrime(i)) {

                sum += i;

            }

            else {

                if (isPrime(i)) {

                    sum += i;

                }

                if (isPrime(n / i)) {

                    sum += (n / i);

                }

            }

        }

    }

    return sum;

}

int main()

{

    int n = 60;

    cout << "Sum of prime divisors of 60 is "

         << SumOfPrimeDivisors(n) << endl;

}

C

#include <stdio.h>

#include <stdbool.h>

#include <math.h>

bool isPrime(int n)

{

    if (n <= 1)

        return false;

    if (n <= 3)

        return true;

    if (n % 2 == 0 || n % 3 == 0)

        return false;

    for (int i = 5; i * i <= n; i = i + 6)

        if (n % i == 0 || n % (i + 2) == 0)

            return false;

    return true;

}

int SumOfPrimeDivisors(int n)

{

    int sum = 0;

    int root_n = (int)sqrt(n);

    for (int i = 1; i <= root_n; i++) {

        if (n % i == 0) {

            if (i == n / i && isPrime(i)) {

                sum += i;

            }

            else {

                if (isPrime(i)) {

                    sum += i;

                }

                if (isPrime(n / i)) {

                    sum += (n / i);

                }

            }

        }

    }

    return sum;

}

int main()

{

    int n = 60;

    printf("Sum of prime divisors of 60 is %dn",SumOfPrimeDivisors(n));

}

Java

class GFG{

static boolean isPrime(int n)

{

    if (n <= 1)

        return false;

    if (n <= 3)

        return true;

    if (n % 2 == 0 || n % 3 == 0)

        return false;

    for(int i = 5; i * i <= n; i = i + 6)

        if (n % i == 0 || n % (i + 2) == 0)

            return false;

    return true;

}

static int SumOfPrimeDivisors(int n)

{

    int sum = 0;

    int root_n = (int)Math.sqrt(n);

    for(int i = 1; i <= root_n; i++)

    {

        if (n % i == 0)

        {

            if (i == n / i && isPrime(i))

            {

                sum += i;

            }

            else

            {

                if (isPrime(i))

                {

                    sum += i;

                }

                if (isPrime(n / i))

                {

                    sum += (n / i);

                }

            }

        }

    }

    return sum;

}

public static void main(String[] args)

{

    int n = 60;

    System.out.println("Sum of prime divisors of 60 is " +

                       SumOfPrimeDivisors(n));

}

}

Python3

import math

def isPrime(n) :

    if (n <= 1) :

        return False

    if (n <= 3) :

        return True

    if (n % 2 == 0 or n % 3 == 0) :

        return False

    i = 5

    while i * i <= n :

        if (n % i == 0 or n % (i + 2) == 0) :

            return False

        i = i + 6

    return True

def SumOfPrimeDivisors(n) :

    Sum = 0

    root_n = (int)(math.sqrt(n))

    for i in range(1, root_n + 1) :

        if (n % i == 0) :

            if (i == (int)(n / i) and isPrime(i)) :

                Sum += i

            else :

                if (isPrime(i)) :

                    Sum += i

                if (isPrime((int)(n / i))) :

                    Sum += (int)(n / i)

    return Sum

n = 60

print("Sum of prime divisors of 60 is", SumOfPrimeDivisors(n))

C#

using System;

class GFG {

    static bool isPrime(int n)

    {

        if (n <= 1)

            return false;

        if (n <= 3)

            return true;

        if (n % 2 == 0 || n % 3 == 0)

            return false;

        for (int i = 5; i * i <= n; i = i + 6)

            if (n % i == 0 || n % (i + 2) == 0)

                return false;

        return true;

    }

    static int SumOfPrimeDivisors(int n)

    {

        int sum = 0;

        int root_n = (int)Math.Sqrt(n);

        for (int i = 1; i <= root_n; i++) {

            if (n % i == 0) {

                if (i == n / i && isPrime(i)) {

                    sum += i;

                }

                else {

                    if (isPrime(i)) {

                        sum += i;

                    }

                    if (isPrime(n / i)) {

                        sum += (n / i);

                    }

                }

            }

        }

        return sum;

    }

  static void Main() {

    int n = 60;

    Console.WriteLine("Sum of prime divisors of 60 is " + SumOfPrimeDivisors(n));

  }

}

Javascript

<script>

    function isPrime(n)

    {

        if (n <= 1)

            return false;

        if (n <= 3)

            return true;

        if (n % 2 == 0 || n % 3 == 0)

            return false;

        for (let i = 5; i * i <= n; i = i + 6)

            if (n % i == 0 || n % (i + 2) == 0)

                return false;

        return true;

    }

    function SumOfPrimeDivisors(n)

    {

        let sum = 0;

        let root_n = parseInt(Math.sqrt(n), 10);

        for (let i = 1; i <= root_n; i++) {

            if (n % i == 0) {

                if (i == parseInt(n / i, 10) && isPrime(i)) {

                    sum += i;

                }

                else {

                    if (isPrime(i)) {

                        sum += i;

                    }

                    if (isPrime(parseInt(n / i, 10))) {

                        sum += (parseInt(n / i, 10));

                    }

                }

            }

        }

        return sum;

    }

    let n = 60;

    document.write("Sum of prime divisors of 60 is "

         + SumOfPrimeDivisors(n) + "</br>");

</script>

Output

Sum of prime divisors of 60 is 10

Time Complexity: O(sqrt(N) * sqrt(N)) 

Approach#4: Using filter, lambda, map

This approach defines two functions is_prime(n) and prime_divisor_sum(n) to determine whether a number is prime or not and to find the sum of all prime divisors of a number, respectively. The is_prime(n) function is used to filter out non-prime divisors using the filter() function inside prime_divisor_sum(n). Finally, the sum() function is used, to sum up all the prime divisors of the given number.

Algorithm

1. Define the function is_prime(n) to check if a number is prime or not. It returns True if the given number is prime, and False otherwise.
2. Define the function prime_divisor_sum(n) to find the sum of all prime divisors of the given number.
3. Use the filter() function inside prime_divisor_sum(n) to filter out all non-prime divisors from the range of 2 to n using a lambda function that checks if a number is a prime divisor of n.
4. Use the map() function to create an iterator that returns each element of the filtered iterator. The lambda function lambda x: x is used as the mapping function. It simply returns its input argument.
5. Finally, use the sum() function to sum up all the elements of the mapped iterator, giving the sum of all prime divisors of n.

Python3

def is_prime(n):

    if n <= 1:

        return False

    for i in range(2, int(n**0.5)+1):

        if n % i == 0:

            return False

    return True

def prime_divisor_sum(n):

    divisors = filter(lambda x: n % x == 0 and is_prime(x), range(2, n+1))

    return sum(map(lambda x: x, divisors))

n=60

print(prime_divisor_sum(n))

Time complexity: O(sqrt(n)), as it checks all numbers from 2 to sqrt(n) to see if n is divisible by any of them. The time complexity of the filter() function is also O(sqrt(n)), as it applies the lambda function to each number from 2 to n and returns an iterator of prime divisors. The time complexity of the map() function is O(k), where k is the number of elements in the filtered iterator. The time complexity of the sum() function is O(k), where k is the number of elements in the mapped iterator. Therefore, the overall time complexity of the code is O(sqrt(n) + k).

Space complexity: O(k), where k is the number of prime divisors of n, since we store them in the filtered and mapped iterators.

Last Updated :
27 Apr, 2023

Like Article

Save Article

Число и сумма натуральных делителей натурального числа
Основная теорема арифметики. Всякое натуральное число п > 1 либо просто, либо может быть представлено, и притом единственным образом – с точностью до порядка следования сомножителей, в виде произведения простых чисел (можно считать, что любое натуральное число, большее 1, можно представить в виде произведения простых чисел, если считать , что это произведение может содержать всего лишь один множитель).
Среди простых сомножителей, присутствующих в разложении `n = p1*p2*…*pk`, могут быть и одинаковые. Например, `24=2*2*2*3`. Их можно объединить, воспользовавшись операцией возведения в степень. Кроме того, простые сомножители можно упорядочить по величине. В результате получается разложение
`n = p_1^(alpha_1)*p_2^(alpha_2)*…….*p_k^(alpha_k)`, где `alpha_1, alpha_2, ……, alpha_k in NN`
(1)
Такое представление числа называется каноническим разложением его на простые сомножители. Например, каноническое представление числа 2 520 имеет вид 2 520 = 23 • З2 • 5 • 7.
Из канонического разложения числа легко можно вывести следующую лемму: Если n имеет вид (1), то , то все делители этого числа имеют вид:
`d = p_1^(beta_1)*p_2^(beta_2)*……*p_k^(beta^k)`, где `0 <= beta_m <= alpha_m` ( `m = 1,2,…, k`)
(2)
В самом деле, очевидно, что всякое d вида (2) делит а. Обратно, пусть d делит а, тогда a=cd, где с — некоторое натуральное число и, следовательно, все простые делители числа d входят в каноническое разложение числа а с показателями, не превышающими соответствующих показателей числа а.
Рассмотрим две функции, заданные на множестве натуральных чисел:
а) τ(n) – число всех натуральных делителей n;
2) σ(n) сумма всех натуральных делителей числа n.
Пусть n имеет каноническое разложение (1). Выведем формулы для числа и суммы его его натуральных делителей.
Теорема 1. Число натуральных делителей числа n
`tau(n) = (alpha_1 + 1)*(alpha_2 + 1)*…..*(alpha_k + 1);`
(3)
Доказательство.
читать дальше
Пример. Число 2 520 = 23 • З2 • 5 • 7. имеет (3+1)(2+1)(1+1)(1+1) = 48 делителей.
Теорема 2. Пусть n имеет каноническое разложение (1). Тогда сумма натуральных делителей числа n равна
`sigma(n) = (1 + p_1 + p_1^2 + ….. + p_1^(alpha_1))*(1 + p_2 + p_2^2 + ….. + p_2^(alpha_2))* …………..* (1 + p_k + p_k^2 + …..+ p_k^(alpha_k));`
(4)
Доказательство.
читать дальше
Пример. Найти сумму всех делителей числа 90.
90=2 • З2 • 5. Тогда σ(90)=[(22-1)/(2-1)]• [З3-1)/(3-1)]• [(52-1)/(5-1)]=234
Формула (4) может помочь найти все делители числа.Так, например, чтобы найти все делители числа 90, раскроем скобки в следующем произведении (не производя операцию сложения): (1+2)(1+3+З2)(1+5)=(1+1*3+1*З2+1*2+2*3+2*З2)(1+5) = 1+3+З2+2+2*3+2*З2+ 5+3*5+З2*5+2*5+2*3*5+2*З2*5 = 1+3+9+2+6+18+5+15+45+10+30+90 – слагаемыми являются делители числа 90.
Решим несколько задач на тему “Число и сумма натуральных делителей натурального числа”
Задание 1. Найдите натуральное число, зная, что оно имеет только два простых делителя, что число всех делителей равно 6, а сумма всех делителей — 28.
Решение
Задания из сборника TTZ – ЕГЭ 2010. Математика. Типовые тестовые задания
Задание 2. TTZ.С6.2 Найдите все натуральные числа, которые делятся на 42 и имеют ровно 42 различных натуральных делителя (включая единицу и само число).
Решение
Задание 3. TTZ.С6.9 Найдите все натуральные числа, последняя десятичная цифра которых 0 и которые имеют ровно 15 различных натуральных делителей(включая единицу и само число).
Решение
Задание 4. SPI.С6.9. У натурального числа n ровно 6 делителей. Сумма этих делителей равна 3500. Найти n.
Решение  VEk:
Решение

Задания для самостоятельной работы
SR1. Найти все числа, имеющие ровно 2 простых делителя, всего 8 делителей, сумма которых равна 60.
SR2. Найти натуральные числа, которые делятся на 3 и на 4 и имеют ровно 21 натуральный делитель.
SR3. Найти наименьшее натуральное число, имеющее ровно 18 натуральных делителей.
SR4. Найти наименьшее число, кратное 5, имеющее 18 натуральных делителей.
SR5. Некоторое натуральное число имеет два простых делителя. Его квадрат имеет всего 15 делителей. Сколько делителей имеет куб этого числа?
SR6. Некоторое натуральное число имеет два простых делителя. Его квадрат имеет всего 81 делитель. Сколько делителей имеет куб этого числа?
SR7. Найти число вида m = 2x3y5z, зная, что половина его имеет на 30 делителей меньше, треть —на 35 и пятая часть — на 42 делителя меньше, чем само число.

Топик поднят, поскольку по теме топика постоянно появляются вопросы.

Добавить комментарий