Sum of all prime divisors of all the numbers in range L-R

Given two integers L and R. The task is to find the sum of all prime factors of every number in the range[L-R].

Examples:

Input: l = 5, r = 10
Output: 17
5 is prime, hence sum of factors = 0
6 has prime factors 2 and 3, hence sum = 5
7 is prime, hence sum = 0
8 has prime factor 2, hence sum = 2
9 has prime factor 3, hence sum = 3
10 has prime factors 2 and 5, hence sum = 7
Hence, total sum = 5 + 2 + 3 + 7 = 17

Input: l = 18, r = 25
Output: 45
18 has prime factors 2, 3 hence sum = 5
19 is prime, hence sum of factors = 0
20 has prime factors 2 and 5, hence sum = 7
21 has prime factors 3 and 7, hence sum = 10
22 has prime factors 2 and 11, hence sum = 13
23 is prime. hence sum = 0
24 has prime factors 2 and 3, hence sum = 5
25 has prime factor 5, hence sum = 5
Hence, total sum = 5 + 7 + 10 + 13 + 5 + 5 = 45



A naive approach would be to start iterating through all numbers from l to r. For each iteration, start from 2 to i and find if i is divisible by that number, if it is divisible, we simply add i and proceed.

Below is the implementation of the above approach.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the sum of prime 
// factors of all numbers in range [L-R] 
  
#include <iostream>
using namespace std;
 bool isPrime(int n) 
    
        for (int i = 2; i * i <= n; i++) { 
  
            // n has a factor, hence not a prime 
            if (n % i == 0) 
                return false
        
        // we reach here if n has no factors 
        // and hence n is a prime number 
        return true
    
     int sum(int l, int r) 
    
        int sum = 0; 
  
        // iterate from lower to upper 
        for (int i = l; i <= r; i++) { 
  
            // if i is prime, it has no factors 
            if (isPrime(i)) 
                continue
            for (int j = 2; j < i; j++) { 
  
                // check if j is a prime factor of i 
                if (i % j == 0 && isPrime(j)) 
                    sum += j; 
            
        
        return sum; 
    
// Driver code
int main() {
        int l = 18, r = 25; 
        cout<<(sum(l, r)); 
      
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the sum of prime
// factors of all numbers in range [L-R]
class gfg {
    static boolean isPrime(int n)
    {
        for (int i = 2; i * i <= n; i++) {
  
            // n has a factor, hence not a prime
            if (n % i == 0)
                return false;
        }
        // we reach here if n has no factors
        // and hence n is a prime number
        return true;
    }
    static int sum(int l, int r)
    {
        int sum = 0;
  
        // iterate from lower to upper
        for (int i = l; i <= r; i++) {
  
            // if i is prime, it has no factors
            if (isPrime(i))
                continue;
            for (int j = 2; j < i; j++) {
  
                // check if j is a prime factor of i
                if (i % j == 0 && isPrime(j))
                    sum += j;
            }
        }
        return sum;
    }
    // Driver code
    public static void main(String[] args)
    {
        int l = 18, r = 25;
        System.out.println(sum(l, r));
    }
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find the sum of prime 
# factors of all numbers in range [L-R] 
  
def isPrime(n):
      
    i = 2
    while i * i <= n:
  
        # n has a factor, hence not a prime 
        if (n % i == 0):
            return False
        i += 1
          
    # we reach here if n has no factors 
    # and hence n is a prime number 
    return True
      
def sum(l, r):
    sum = 0
  
    # iterate from lower to upper 
    for i in range(l, r + 1) :
  
        # if i is prime, it has no factors 
        if (isPrime(i)) :
            continue
        for j in range(2, i):
  
            # check if j is a prime factor of i 
            if (i % j == 0 and isPrime(j)) :
                sum += j
          
    return sum
      
# Driver code
if __name__ == "__main__":
        l = 18
        r = 25
        print(sum(l, r))
  
# This code is contributed by ita_c

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find the sum 
// of prime factors of all 
// numbers in range [L-R]
using System;
  
class GFG
{
    static bool isPrime(int n)
    {
        for (int i = 2; 
                 i * i <= n; i++) 
        {
  
            // n has a factor, 
            // hence not a prime
            if (n % i == 0)
                return false;
        }
          
        // we reach here if n has 
        // no factors and hence n 
        // is a prime number
        return true;
    }
      
    static int sum(int l, int r)
    {
        int sum = 0;
  
        // iterate from lower to upper
        for (int i = l; i <= r; i++)
        {
  
            // if i is prime, it
            // has no factors
            if (isPrime(i))
                continue;
            for (int j = 2; j < i; j++) 
            {
  
                // check if j is a 
                // prime factor of i
                if (i % j == 0 && isPrime(j))
                    sum += j;
            }
        }
        return sum;
    }
      
    // Driver code
    public static void Main()
    {
        int l = 18, r = 25;
        Console.WriteLine(sum(l, r));
    }
}
  
// This code is contributed 
// by Akanksha Rai(Abby_akku)

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find the 
// sum of prime factors of 
// all numbers in range [L-R]
function isPrime($n)
{
    for ($i = 2; $i * $i <= $n; $i++) 
    {
        // n has a factor, hence
        // not a prime
        if ($n % $i == 0)
            return false;
    }
      
    // we reach here if n has 
    // no factors and hence n 
    // is a prime number
    return true;
}
  
function sum1($l, $r)
{
        $sum = 0;
  
        // iterate from lower to upper
        for ($i = $l; $i <= $r; $i++) 
        {
  
            // if i is prime, it 
            // has no factors
            if (isPrime($i))
                continue;
            for ($j = 2; $j < $i; $j++) 
            {
  
                // check if j is a 
                // prime factor of i
                if ($i % $j == 0 && isPrime($j))
                    $sum += $j;
            }
        }
        return $sum;
}
  
// Drive Code
$l = 18;
$r = 25;
echo sum1($l, $r);
  
// This code is contributed by mits
?>

chevron_right


Output:

45

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

An efficient approach is to modify sieve of eratosthenes slightly to find sum of all prime divisors. Next, maintain a prefix array to keep the sum of sum of all prime divisors upto index i. Hence pref_arr[r] – pref_arr[l-1] would give the answer.

Below is the implementation of the above approach.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the sum of prime
// factors of all numbers in range [L-R]
#include<bits/stdc++.h>
using namespace std;
  
#define N 10000
long arr[N];
  
    // function to compute the seive
    void seive()
    {
        for (int i = 2; i * i < N; i++) 
        {
  
            // i is prime
            if (arr[i] == 0) 
            {
  
                // add i to all the multiples of i till N
                for (int j = 2; i * j < N; j++) 
                {
                    arr[i * j] += i;
                }
            }
        }
    }
  
    // function that returns the sum
    long sum(int l, int r)
    {
  
        // Function call to compute seive
        seive();
  
        // prefix array to keep the 
        // sum of all arr[i] till i
        long pref_arr[r+1];
        pref_arr[0] = arr[0];
  
        // calculate the prefix sum of prime divisors
        for (int i = 1; i <= r; i++) {
            pref_arr[i] = pref_arr[i - 1] + arr[i];
        }
  
        // lower is the beginning of array
        if (l == 1)
            return (pref_arr[r]);
  
        // lower is not the beginning of the array
        else
            return (pref_arr[r] - pref_arr[l - 1]);
    }
  
    // Driver Code
    int main()
    {
        int l = 5, r = 10;
        cout<<(sum(l, r));
        return 0;
    }
      
// This code is contributed by Rajput-Ji

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the sum of prime
// factors of all numbers in range [L-R]
public class gfg {
  
    static int N = 10000;
    static long arr[] = new long[N];
  
    // function to compute the seive
    static void seive()
    {
        for (int i = 2; i * i < N; i++) {
  
            // i is prime
            if (arr[i] == 0) {
  
                // add i to all the multiples of i till N
                for (int j = 2; i * j < N; j++) {
                    arr[i * j] += i;
                }
            }
        }
    }
  
    // function that returns the sum
    static long sum(int l, int r)
    {
  
        // Function call to compute seive
        seive();
  
        // prefix array to keep the sum of all arr[i] till i
        long[] pref_arr = new long[r + 1];
        pref_arr[0] = arr[0];
  
        // calculate the prefix sum of prime divisors
        for (int i = 1; i <= r; i++) {
            pref_arr[i] = pref_arr[i - 1] + arr[i];
        }
  
        // lower is the beginning of array
        if (l == 1)
            return (pref_arr[r]);
  
        // lower is not the beginning of the array
        else
            return (pref_arr[r] - pref_arr[l - 1]);
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        int l = 5, r = 10;
        System.out.println(sum(l, r));
    }
}

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find the sum 
// of prime factors of all 
// numbers in range [L-R]
using System;
  
class GFG 
{
    static int N = 10000;
    static long[] arr = new long[N];
  
    // function to compute
    // the seive
    static void seive()
    {
        for (int i = 2; i * i < N; i++)
        {
  
            // i is prime
            if (arr[i] == 0)
            {
  
                // add i to all the multiples
                // of i till N
                for (int j = 2; 
                         i * j < N; j++) 
                {
                    arr[i * j] += i;
                }
            }
        }
    }
  
    // function that 
    // returns the sum
    static long sum(int l, int r)
    {
  
        // Function call to
        // compute seive
        seive();
  
        // prefix array to keep the
        // sum of all arr[i] till i
        long[] pref_arr = new long[r + 1];
        pref_arr[0] = arr[0];
  
        // calculate the prefix 
        // sum of prime divisors
        for (int i = 1; i <= r; i++) 
        {
            pref_arr[i] = pref_arr[i - 1] + 
                               arr[i];
        }
  
        // lower is the beginning
        // of array
        if (l == 1)
            return (pref_arr[r]);
  
        // lower is not the 
        // beginning of the array
        else
            return (pref_arr[r] - 
                    pref_arr[l - 1]);
    }
  
    // Driver Code
    public static void Main()
    {
        int l = 5, r = 10;
        Console.WriteLine(sum(l, r));
    }
}
  
// This code is contributed 
// by Akanksha Rai(Abby_akku)

chevron_right


Output:

17


My Personal Notes arrow_drop_up

IT undergrad

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.