给定N个整数的数组arr [] ,任务是计算给定数组的前缀和数组中的素数。
例子:
Input: arr[] = {1, 4, 8, 4}
Output: 3
The prefix sum array is {1, 5, 13, 17}
and the three primes are 5, 13 and 17.
Input: arr[] = {1, 5, 2, 3, 7, 9}
Output: 1
方法:创建前缀和数组,然后使用Eratosthenes筛子计算前缀和数组中的素数。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to return the count of primes
// in the given array
int primeCount(int arr[], int n)
{
// Find maximum value in the array
int max_val = *max_element(arr, arr + n);
// USE SIEVE TO FIND ALL PRIME NUMBERS LESS
// THAN OR EQUAL TO max_val
// Create a boolean array "prime[0..n]". A
// value in prime[i] will finally be false
// if i is Not a prime, else true.
vector prime(max_val + 1, true);
// Remaining part of SIEVE
prime[0] = false;
prime[1] = false;
for (int p = 2; p * p <= max_val; 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_val; i += p)
prime[i] = false;
}
}
// Find all primes in arr[]
int count = 0;
for (int i = 0; i < n; i++)
if (prime[arr[i]])
count++;
return count;
}
// Function to generate the prefix array
void getPrefixArray(int arr[], int n, int pre[])
{
// Fill the prefix array
pre[0] = arr[0];
for (int i = 1; i < n; i++) {
pre[i] = pre[i - 1] + arr[i];
}
}
// Driver code
int main()
{
int arr[] = { 1, 4, 8, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
// Prefix array of arr[]
int pre[n];
getPrefixArray(arr, n, pre);
// Count of primes in the prefix array
cout << primeCount(pre, n);
return 0;
}
Java
// Java implementation of the approach
import java.util.*;
class GFG
{
//returns the max element
static int max_element(int a[])
{
int m = a[0];
for(int i = 0; i < a.length; i++)
m = Math.max(a[i], m);
return m;
}
// Function to return the count of primes
// in the given array
static int primeCount(int arr[], int n)
{
// Find maximum value in the array
int max_val = max_element(arr);
// USE SIEVE TO FIND ALL PRIME NUMBERS LESS
// THAN OR EQUAL TO max_val
// Create a boolean array "prime[0..n]". A
// value in prime[i] will finally be false
// if i is Not a prime, else true.
boolean prime[] = new boolean[max_val + 1];
for (int p = 0; p <= max_val; p++)
prime[p] = true;
// Remaining part of SIEVE
prime[0] = false;
prime[1] = false;
for (int p = 2; p * p <= max_val; 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_val; i += p)
prime[i] = false;
}
}
// Find all primes in arr[]
int count = 0;
for (int i = 0; i < n; i++)
if (prime[arr[i]])
count++;
return count;
}
// Function to generate the prefix array
static int[] getPrefixArray(int arr[], int n, int pre[])
{
// Fill the prefix array
pre[0] = arr[0];
for (int i = 1; i < n; i++)
{
pre[i] = pre[i - 1] + arr[i];
}
return pre;
}
// Driver code
public static void main(String args[])
{
int arr[] = { 1, 4, 8, 4 };
int n = arr.length;
// Prefix array of arr[]
int pre[]=new int[n];
pre=getPrefixArray(arr, n, pre);
// Count of primes in the prefix array
System.out.println(primeCount(pre, n));
}
}
// This code is contributed by Arnab Kundu
Python3
# Python3 implementation of the approach
# Function to return the count
# of primes in the given array
def primeCount(arr, n):
# Find maximum value in the array
max_val = max(arr)
# USE SIEVE TO FIND ALL PRIME NUMBERS LESS
# THAN OR EQUAL TO max_val
# Create a boolean array "prime[0..n]". A
# value in prime[i] will finally be False
# if i is Not a prime, else True.
prime = [True] * (max_val+1)
# Remaining part of SIEVE
prime[0] = prime[1] = False
p = 2
while p * p <= max_val:
# 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_val+1, p):
prime[i] = False
p += 1
# Find all primes in arr[]
count = 0
for i in range(0, n):
if prime[arr[i]]:
count += 1
return count
# Function to generate the prefix array
def getPrefixArray(arr, n, pre):
# Fill the prefix array
pre[0] = arr[0]
for i in range(1, n):
pre[i] = pre[i - 1] + arr[i]
# Driver code
if __name__ == "__main__":
arr = [1, 4, 8, 4]
n = len(arr)
# Prefix array of arr[]
pre = [None] * n
getPrefixArray(arr, n, pre)
# Count of primes in the prefix array
print(primeCount(pre, n))
# This code is contributed by Rituraj Jain
C#
// C# implementation of the approach
using System;
class GFG
{
// returns the max element
static int max_element(int[] a)
{
int m = a[0];
for(int i = 0; i < a.Length; i++)
m = Math.Max(a[i], m);
return m;
}
// Function to return the count of primes
// in the given array
static int primeCount(int[] arr, int n)
{
// Find maximum value in the array
int max_val = max_element(arr);
// USE SIEVE TO FIND ALL PRIME NUMBERS LESS
// THAN OR EQUAL TO max_val
// Create a bool array "prime[0..n]". A
// value in prime[i] will finally be false
// if i is Not a prime, else true.
bool[] prime = new bool[max_val + 1];
for (int p = 0; p <= max_val; p++)
prime[p] = true;
// Remaining part of SIEVE
prime[0] = false;
prime[1] = false;
for (int p = 2; p * p <= max_val; 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_val; i += p)
prime[i] = false;
}
}
// Find all primes in arr[]
int count = 0;
for (int i = 0; i < n; i++)
if (prime[arr[i]])
count++;
return count;
}
// Function to generate the prefix array
static int[] getPrefixArray(int[] arr, int n, int[] pre)
{
// Fill the prefix array
pre[0] = arr[0];
for (int i = 1; i < n; i++)
{
pre[i] = pre[i - 1] + arr[i];
}
return pre;
}
// Driver code
public static void Main()
{
int[] arr = { 1, 4, 8, 4 };
int n = arr.Length;
// Prefix array of arr[]
int[] pre = new int[n];
pre = getPrefixArray(arr, n, pre);
// Count of primes in the prefix array
Console.Write(primeCount(pre, n));
}
}
// This code is contributed by ChitraNayal
PHP
输出:
3