给定两个整数L和R。任务是找到范围[LR]中每个数字的所有质数因子的总和。
例子:
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
天真的方法是开始迭代从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现场课程美国》。