📜  数组中第K个素数的乘积

📅  最后修改于: 2021-05-06 20:07:44             🧑  作者: Mango

给定一个整数“ k”和一个整数数组“ arr”(小于10 ^ 6),任务是找到数组中第K个素数的乘积。

例子:

一种简单的方法:遍历数组并找到数组中的每个第K个素数,然后计算正在运行的乘积。这样,我们将必须检查数组的每个元素是否为质数,随着数组大小的增加,这将花费更多时间。

高效方法:创建一个筛子,该筛子将存储数字是否为质数。然后,它可以用于检查O(1)时间中是否有素数。这样,我们只需要跟踪每个第K个素数并维护正在运行的乘积即可。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
#define MAX 1000000
bool prime[MAX + 1];
void SieveOfEratosthenes()
{
    // Create a boolean array "prime[0..n]"
    // and initialize all the entries as true.
    // A value in prime[i] will finally be false
    // if i is Not a prime, else true.
    memset(prime, true, sizeof(prime));
  
    // 0 and 1 are not prime numbers
    prime[1] = false;
    prime[0] = false;
  
    for (int p = 2; p * p <= MAX; p++) {
  
        // If prime[p] is not changed, 
        // then it is a prime
        if (prime[p] == true) {
  
            // Update all multiples of p
            for (int i = p * 2; i <= MAX; i += p)
                prime[i] = false;
        }
    }
}
  
// compute the answer
void productOfKthPrimes(int arr[], int n, int k)
{
    // count of primes
    int c = 0;
  
    // product of the primes
    long long int product = 1;
  
    // traverse the array
    for (int i = 0; i < n; i++) {
  
        // if the number is a prime
        if (prime[arr[i]]) {
  
            // increase the count
            c++;
  
            // if it is the K'th prime
            if (c % k == 0) {
                product *= arr[i];
                c = 0;
            }
        }
    }
    cout << product << endl;
}
  
// Driver code
int main()
{
  
    // create the sieve
    SieveOfEratosthenes();
  
    int n = 5, k = 2;
  
    int arr[n] = { 2, 3, 5, 7, 11 };
  
    productOfKthPrimes(arr, n, k);
  
    return 0;
}


Java
// Java implementation of the approach
  
class GFG
{
static int MAX=1000000;
static boolean[] prime=new boolean[MAX + 1];
static void SieveOfEratosthenes()
{
    // Create a boolean array "prime[0..n]"
    // and initialize all the entries as true.
    // A value in prime[i] will finally be false
    // if i is Not a prime, else true.
    //memset(prime, true, sizeof(prime));
  
    // 0 and 1 are not prime numbers
    prime[1] = true;
    prime[0] = true;
  
    for (int p = 2; p * p <= MAX; p++) {
  
        // If prime[p] is not changed, 
        // then it is a prime
        if (prime[p] == false) {
  
            // Update all multiples of p
            for (int i = p * 2; i <= MAX; i += p)
                prime[i] = true;
        }
    }
}
  
// compute the answer
static void productOfKthPrimes(int arr[], int n, int k)
{
    // count of primes
    int c = 0;
  
    // product of the primes
    int product = 1;
  
    // traverse the array
    for (int i = 0; i < n; i++) {
  
        // if the number is a prime
        if (!prime[arr[i]]) {
  
            // increase the count
            c++;
  
            // if it is the K'th prime
            if (c % k == 0) {
                product *= arr[i];
                c = 0;
            }
        }
    }
    System.out.println(product);
}
  
// Driver code
public static void main(String[] args)
{
  
    // create the sieve
    SieveOfEratosthenes();
  
    int n = 5, k = 2;
   
    int[] arr=new int[]{ 2, 3, 5, 7, 11 };
   
    productOfKthPrimes(arr, n, k);
}
}
// This code is contributed by mits


Python 3
# Python 3 implementation of the approach
  
MAX = 1000000
prime = [True]*(MAX + 1)
def SieveOfEratosthenes():
      
    # Create a boolean array "prime[0..n]"
    # and initialize all the entries as true.
    # A value in prime[i] will finally be false
    # if i is Not a prime, else true.
      
  
    # 0 and 1 are not prime numbers
    prime[1] = False;
    prime[0] = False;
  
    p = 2
    while p * p <= MAX:
  
        # If prime[p] is not changed, 
        # then it is a prime
        if (prime[p] == True):
  
            # Update all multiples of p
            for i in range(p * 2, MAX+1, p):
                prime[i] = False
        p+=1
  
# compute the answer
def productOfKthPrimes(arr, n, k):
  
    # count of primes
    c = 0
  
    # product of the primes
    product = 1
  
    # traverse the array
    for i in range( n):
  
        # if the number is a prime
        if (prime[arr[i]]):
  
            # increase the count
            c+=1
  
            # if it is the K'th prime
            if (c % k == 0) :
                product *= arr[i]
                c = 0
  
    print(product)
  
# Driver code
if __name__ == "__main__":
  
    # create the sieve
    SieveOfEratosthenes()
  
    n = 5
    k = 2
  
    arr = [ 2, 3, 5, 7, 11 ]
  
    productOfKthPrimes(arr, n, k)
  
# This code is contributed by ChitraNayal


C#
// C# implementation of the approach
class GFG
{
static int MAX = 1000000;
static bool[] prime = new bool[MAX + 1];
static void SieveOfEratosthenes()
{
    // Create a boolean array "prime[0..n]"
    // and initialize all the entries as 
    // true. A value in prime[i] will 
    // finally be false if i is Not a prime,
    // else true.
  
    // 0 and 1 are not prime numbers
    prime[1] = true;
    prime[0] = true;
  
    for (int p = 2; p * p <= MAX; p++)
    {
  
        // If prime[p] is not changed, 
        // then it is a prime
        if (prime[p] == false) 
        {
  
            // Update all multiples of p
            for (int i = p * 2;
                     i <= MAX; i += p)
                prime[i] = true;
        }
    }
}
  
// compute the answer
static void productOfKthPrimes(int[] arr,
                               int n, int k)
{
    // count of primes
    int c = 0;
  
    // product of the primes
    int product = 1;
  
    // traverse the array
    for (int i = 0; i < n; i++) 
    {
  
        // if the number is a prime
        if (!prime[arr[i]]) 
        {
  
            // increase the count
            c++;
  
            // if it is the K'th prime
            if (c % k == 0) 
            {
                product *= arr[i];
                c = 0;
            }
        }
    }
    System.Console.WriteLine(product);
}
  
// Driver code
static void Main()
{
  
    // create the sieve
    SieveOfEratosthenes();
  
    int n = 5, k = 2;
  
    int[] arr=new int[]{ 2, 3, 5, 7, 11 };
  
    productOfKthPrimes(arr, n, k);
}
}
  
// This code is contributed by mits


输出:
21

时间复杂度: O(n)