📌  相关文章
📜  LR范围内所有数字的所有主除数的总和

📅  最后修改于: 2021-06-26 01:05:25             🧑  作者: Mango

给定两个整数L和R。任务是找到范围[LR]中每个数字的所有质数因子的总和。

例子:

天真的方法是开始迭代从l到r的所有数字。对于每次迭代,从2开始到i,然后查找i是否可被该数字整除,如果可将其整除,我们只需添加i并继续。

下面是上述方法的实现。

C++
// C++ program to find the sum of prime
// factors of all numbers in range [L-R]
 
#include 
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;
}


Java
// 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));
    }
}


Python3
# 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


C#
// 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)


PHP


Javascript


C++
// C++ program to find the sum of prime
// factors of all numbers in range [L-R]
#include
using namespace std;
 
#define N 10000
long arr[N];
 
    // function to compute the sieve
    void sieve()
    {
        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 sieve
        sieve();
 
        // 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


Java
// 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 sieve
    static void sieve()
    {
        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 sieve
        sieve();
 
        // 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));
    }
}


Python3
# Python3 program to find the sum of prime
# factors of all numbers in range [L-R]
N = 10000;
arr = [0] * N;
 
# function to compute the sieve
def sieve():
    i = 2;
    while(i * i < N):
         
        # i is prime
        if (arr[i] == 0):
             
            # add i to all the multiple
            # of i till N
            j = 2;
            while (i * j < N):
                arr[i * j] += i;
                j += 1;
        i += 1;
 
# function that returns the sum
def sum(l, r):
 
    # Function call to compute sieve
    sieve();
 
    # prefix array to keep the
    # sum of all arr[i] till i
    pref_arr = [0] * (r + 1);
    pref_arr[0] = arr[0];
 
    # calculate the prefix sum
    # of prime divisors
    for i in range(1, r + 1):
        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
l = 5;
r = 10;
print(sum(l, r));
 
# This code is contributed by mits


C#
// 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 sieve
    static void sieve()
    {
        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 sieve
        sieve();
 
        // 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)


PHP


Javascript


输出:
45

时间复杂度: O(N * N * sqrt(N))

一种有效的方法是稍微修改掉橡皮擦的筛子,以找到所有主要除数的和。接下来,维护一个前缀数组,以保持所有素数和的总和直到索引i。因此, pref_arr [r] – pref_arr [l-1]将给出答案。

下面是上述方法的实现。

C++

// C++ program to find the sum of prime
// factors of all numbers in range [L-R]
#include
using namespace std;
 
#define N 10000
long arr[N];
 
    // function to compute the sieve
    void sieve()
    {
        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 sieve
        sieve();
 
        // 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

Java

// 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 sieve
    static void sieve()
    {
        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 sieve
        sieve();
 
        // 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));
    }
}

Python3

# Python3 program to find the sum of prime
# factors of all numbers in range [L-R]
N = 10000;
arr = [0] * N;
 
# function to compute the sieve
def sieve():
    i = 2;
    while(i * i < N):
         
        # i is prime
        if (arr[i] == 0):
             
            # add i to all the multiple
            # of i till N
            j = 2;
            while (i * j < N):
                arr[i * j] += i;
                j += 1;
        i += 1;
 
# function that returns the sum
def sum(l, r):
 
    # Function call to compute sieve
    sieve();
 
    # prefix array to keep the
    # sum of all arr[i] till i
    pref_arr = [0] * (r + 1);
    pref_arr[0] = arr[0];
 
    # calculate the prefix sum
    # of prime divisors
    for i in range(1, r + 1):
        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
l = 5;
r = 10;
print(sum(l, r));
 
# This code is contributed by mits

C#

// 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 sieve
    static void sieve()
    {
        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 sieve
        sieve();
 
        // 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)

的PHP


Java脚本


输出:
17

如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。