Sum of all the prime divisors of a number

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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find sum of
// prime divisors of N
#include <bits/stdc++.h>
using namespace std;
#define N 1000005
  
// Function to check if the
// number is prime or not.
bool isPrime(int n)
{
    // Corner cases
    if (n <= 1)
        return false;
    if (n <= 3)
        return true;
  
    // This is checked so that we can skip
    // middle five numbers in below loop
    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;
}
  
// function to find sum of prime
// divisors of N
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;
}
// Driver code
int main()
{
    int n = 60;
    cout << "Sum of prime divisors of 60 is " << SumOfPrimeDivisors(n) << endl;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find sum 
// of prime divisors of N
import java.io.*;
import java.util.*;
  
class GFG
{
// Function to check if the
// number is prime or not.
static boolean isPrime(int n)
{
    // Corner cases
    if (n <= 1)
        return false;
    if (n <= 3)
        return true;
  
    // This is checked so that
    // we can skip middle five
    // numbers in below loop
    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;
}
  
// function to find 
// sum of prime
// divisors of N
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;
}
  
// Driver code
public static void main(String args[])
{
    int n = 60;
    System.out.print("Sum of prime divisors of 60 is "
                          SumOfPrimeDivisors(n) + "\n");
}
}

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find sum 
// of prime divisors of N
using System;
class GFG
{
      
// Function to check if the
// number is prime or not.
static bool isPrime(int n)
{
    // Corner cases
    if (n <= 1)
        return false;
    if (n <= 3)
        return true;
  
    // This is checked so that
    // we can skip middle five
    // numbers in below loop
    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;
}
  
// function to find 
// sum of prime
// divisors of N
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;
}
  
// Driver code
public static void Main()
{
    int n = 60;
    Console.WriteLine("Sum of prime divisors of 60 is "
                        SumOfPrimeDivisors(n) + "\n");
}
}
  
// This code is contributed
// by inder_verma.

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 program to find 
# sum of prime divisors of N
N = 1000005
  
# Function to check if the
# number is prime or not.
def isPrime(n):
      
    # Corner cases
    if n <= 1:
        return False
    if n <= 3:
        return True
  
    # This is checked so that  
    # we can skip middle five 
    # numbers in below loop
    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
  
# function to find sum 
# of prime divisors of N
def SumOfPrimeDivisors(n):
    sum = 0
    for i in range(1, n + 1) :
        if n % i == 0 :
            if isPrime(i):
                sum += i
      
    return sum
  
# Driver code
n = 60
print("Sum of prime divisors of 60 is " + 
              str(SumOfPrimeDivisors(n)))
  
# This code is contributed
# by ChitraNayal

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php 
// PHP program to find sum 
// of prime divisors of N
$N = 1000005;
  
// Function to check if the
// number is prime or not.
function isPrime($n)
{
    global $N;
    // Corner cases
    if ($n <= 1)
        return false;
    if ($n <= 3)
        return true;
  
    // This is checked so that 
    // we can skip middle five 
    // numbers in below loop
    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 to find sum 
// of prime divisors of N
function SumOfPrimeDivisors($n)
{
    $sum = 0;
    for ($i = 1; $i <= $n; $i++) 
    {
        if ($n % $i == 0) 
        {
            if (isPrime($i))
                $sum += $i;
        }
    }
    return $sum;
}
  
// Driver code
$n = 60;
echo "Sum of prime divisors of 60 is " .
                 SumOfPrimeDivisors($n);
  
// This code is contributed
// by ChitraNayal
?>

chevron_right


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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find prime divisors of
// all numbers from 1 to n
#include <bits/stdc++.h>
using namespace std;
  
// function to find prime divisors of
// all numbers from 1 to n
int Sum(int N)
{
    int SumOfPrimeDivisors[N+1] = { 0 };
  
    for (int i = 2; i <= N; ++i) {
  
        // if the number is prime
        if (!SumOfPrimeDivisors[i]) {
  
            // add this prime to all it's multiples
            for (int j = i; j <= N; j += i) {
  
                SumOfPrimeDivisors[j] += i;
            }
        }
    }
    return SumOfPrimeDivisors[N];
}
  
// Driver code
int main()
{
    int N = 60;
    cout << "Sum of prime divisors of 60 is "
         << Sum(N) << endl;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find
// prime divisors of
// all numbers from 1 to n
import java.io.*;
import java.util.*;
  
class GFG
{
      
// function to find prime 
// divisors of all numbers 
// from 1 to n
static int Sum(int N)
{
    int SumOfPrimeDivisors[] = new int[N + 1];
      
  
    for (int i = 2; i <= N; ++i) 
    {
  
        // if the number is prime
        if (SumOfPrimeDivisors[i] == 0
        {
  
            // add this prime to
            // all it's multiples
            for (int j = i; j <= N; j += i) 
            {
  
                SumOfPrimeDivisors[j] += i;
            }
        }
    }
    return SumOfPrimeDivisors[N];
}
  
// Driver code
public static void main(String args[])
{
    int N = 60;
    System.out.print("Sum of prime "
                "divisors of 60 is "
                       Sum(N) + "\n");
}
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 program to find
# prime divisors of
# all numbers from 1 to n
  
# function to find prime 
# divisors of all numbers 
# from 1 to n
def Sum(N):
   
    SumOfPrimeDivisors = [0] * (N + 1)
       
    for i in range(2, N + 1) :
       
        # if the number is prime
        if (SumOfPrimeDivisors[i] == 0) :
           
            # add this prime to
            # all it's multiples
            for j in range(i, N + 1, i) :
               
                SumOfPrimeDivisors[j] += i
               
    return SumOfPrimeDivisors[N]
   
# Driver code
N = 60
print("Sum of prime"
      "divisors of 60 is"
                  Sum(N));
                    
# This code is contributed 
# by Smitha

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find
// prime divisors of
// all numbers from 1 to n
using System;
  
class GFG
{
      
// function to find prime 
// divisors of all numbers 
// from 1 to n
static int Sum(int N)
{
    int []SumOfPrimeDivisors = new int[N + 1];
      
    for (int i = 2; i <= N; ++i) 
    {
  
        // if the number is prime
        if (SumOfPrimeDivisors[i] == 0) 
        {
  
            // add this prime to
            // all it's multiples
            for (int j = i; 
                     j <= N; j += i) 
            {
  
                SumOfPrimeDivisors[j] += i;
            }
        }
    }
      
    return SumOfPrimeDivisors[N];
}
  
// Driver code
public static void Main()
{
    int N = 60;
    Console.Write("Sum of prime "
                    "divisors of 60 is "
                         Sum(N) + "\n");
}
}
  
// This code is contributed
// by Smitha

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find prime 
// divisors of all numbers 
// from 1 to n
  
// function to find prime 
// divisors of all numbers 
// from 1 to n
function Sum($N)
{
    for($i = 0; $i <= $N; $i++)
        $SumOfPrimeDivisors[$i] = 0;
  
    for ($i = 2; $i <= $N; ++$i)
    {
  
        // if the number is prime
        if (!$SumOfPrimeDivisors[$i])
        {
  
            // add this prime to 
            // all it's multiples
            for ($j = $i; $j <= $N; $j += $i)
            {
  
                $SumOfPrimeDivisors[$j] += $i;
            }
        }
    }
    return $SumOfPrimeDivisors[$N];
}
  
// Driver code
$N = 60;
echo "Sum of prime divisors of 60 is " . Sum($N);
  
// This code is contributed by Mahadev99
?>

chevron_right


Output:

Sum of prime divisors of 60 is 10

Time Complexity: O(N * log N)



My Personal Notes arrow_drop_up

pawanasipugmailcom

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.