📜  查找前N个素数的乘积

📅  最后修改于: 2021-04-27 05:02:09             🧑  作者: Mango

给定正整数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)中给出每个查询的输出。