给定正整数N,计算前N个素数的乘积。
例子:
Input : N = 3
Output : 30
Explanation : First 3 prime numbers are 2, 3, 5.
Input : N = 5
Output : 2310
方法:
- 创建一个筛子,这将帮助我们确定数字在O(1)时间内是否为质数。
- 运行一个从1开始的循环,直到,除非我们找到n个质数。
- 将所有质数相乘,而忽略非质数。
- 然后,显示第1个N质数的乘积。
时间复杂度– O(Nlog(logN))
下面是上述方法的实现:
C++
// C++ implementation of above solution
#include "cstring"
#include
using namespace std;
#define MAX 10000
// Create a boolean array "prime[0..n]" and initialize
// all entries it as true. A value in prime[i] will
// finally be false if i is Not a prime, else true.
bool prime[MAX + 1];
void SieveOfEratosthenes()
{
memset(prime, true, sizeof(prime));
prime[1] = false;
for (int p = 2; p * p <= MAX; p++) {
// If prime[p] is not changed, then it is a prime
if (prime[p] == true) {
// Set all multiples of p to non-prime
for (int i = p * 2; i <= MAX; i += p)
prime[i] = false;
}
}
}
// find the product of 1st N prime numbers
int solve(int n)
{
// count of prime numbers
int count = 0, num = 1;
// product of prime numbers
long long int prod = 1;
while (count < n) {
// if the number is prime add it
if (prime[num]) {
prod *= num;
// increase the count
count++;
}
// get to next number
num++;
}
return prod;
}
// Driver code
int main()
{
// create the sieve
SieveOfEratosthenes();
int n = 5;
// find the value of 1st n prime numbers
cout << solve(n);
return 0;
}
Java
// Java implementation of above solution
class GFG
{
static int MAX=10000;
// Create a boolean array "prime[0..n]" and initialize
// all entries it as true. A value in prime[i] will
// finally be false if i is Not a prime, else true.
static boolean[] prime=new boolean[MAX + 1];
static void SieveOfEratosthenes()
{
prime[1] = true;
for (int p = 2; p * p <= MAX; p++) {
// If prime[p] is not changed, then it is a prime
if (prime[p] == false) {
// Set all multiples of p to non-prime
for (int i = p * 2; i <= MAX; i += p)
prime[i] = true;
}
}
}
// find the product of 1st N prime numbers
static int solve(int n)
{
// count of prime numbers
int count = 0, num = 1;
// product of prime numbers
int prod = 1;
while (count < n) {
// if the number is prime add it
if (!prime[num]) {
prod *= num;
// increase the count
count++;
}
// get to next number
num++;
}
return prod;
}
// Driver code
public static void main(String[] args)
{
// create the sieve
SieveOfEratosthenes();
int n = 5;
// find the value of 1st n prime numbers
System.out.println(solve(n));
}
}
// This code is contributed by mits
C#
// C# implementation of above solution
class GFG
{
static int MAX=10000;
// Create a boolean array "prime[0..n]" and initialize
// all entries it as true. A value in prime[i] will
// finally be false if i is Not a prime, else true.
static bool[] prime=new bool[MAX + 1];
static void SieveOfEratosthenes()
{
prime[1] = true;
for (int p = 2; p * p <= MAX; p++) {
// If prime[p] is not changed, then it is a prime
if (prime[p] == false) {
// Set all multiples of p to non-prime
for (int i = p * 2; i <= MAX; i += p)
prime[i] = true;
}
}
}
// find the product of 1st N prime numbers
static int solve(int n)
{
// count of prime numbers
int count = 0, num = 1;
// product of prime numbers
int prod = 1;
while (count < n) {
// if the number is prime add it
if (!prime[num]) {
prod *= num;
// increase the count
count++;
}
// get to next number
num++;
}
return prod;
}
// Driver code
public static void Main()
{
// create the sieve
SieveOfEratosthenes();
int n = 5;
// find the value of 1st n prime numbers
System.Console.WriteLine(solve(n));
}
}
// This code is contributed by mits
Python
'''
python3 implementation of above solution'''
import math as mt
MAX=10000
'''
Create a boolean array "prime[0..n]" and initialize
all entries it as true. A value in prime[i] will
finally be false if i is Not a prime, else true.'''
prime=[True for i in range(MAX+1)]
def SieveOfErastosthenes():
prime[1]=False
for p in range(2,mt.ceil(mt.sqrt(MAX))):
#if prime[p] is not changes, then it is a prime
if prime[p]:
#set all multiples of p to non-prime
for i in range(2*p,MAX+1,p):
prime[i]=False
#find the product of 1st N prime numbers
def solve(n):
#count of prime numbers
count,num=0,1
#product of prime numbers
prod=1
while count
PHP
输出:
2310
注意:对于较大的N值,乘积可能会给出整数溢出错误。
同样对于多个查询,可以使用前缀数组技术,该技术将在首先制作前缀数组(这将花费O(N)时间)之后在O(1)中给出每个查询的输出。