Número de suma de prefijos primos en la consulta de rango dado

Dada una array de enteros no negativos y una consulta de rango l, r, encuentre el número de suma de prefijos que son números primos en ese rango dado.
Requisito previo: suma de prefijo | Prueba de primalidad

Ejemplos: 

Input : {2, 3, 4, 7, 9, 10}, 
        l = 1, r = 5;
Output : 3
Explanation : prefixSum[0] = arr[l] = 3
         prefixSum[1] = prefixSum[0] + arr[2] = 7, 
         prefixSum[2] = prefixSum[1] + arr[3] = 14, 
         prefixSum[3] = prefixSum[2] + arr[4] = 23, 
         prefixSum[4] = prefixSum[3] + arr[5] = 33,
There are three primes in prefix sum array in given
range. The primes are 3, 7 and 23.

Input : {5, 7, 8, 10, 13}, 
         l = 0, r = 4;
Output : 2
         prefixSum[0] = arr[l] = 5, 
         prefixSum[1] = prefixSum[0] + arr[1] = 12, 
         prefixSum[2] = prefixSum[1] + arr[2] = 20, 
         prefixSum[3] = prefixSum[2] + arr[3] = 30, 
         prefixSum[4] = prefixSum[3] + arr[4] = 43, 
There are two primes in prefix sum array in given
range. The primes are 5 and 43

Enfoque: ejecute un ciclo a través de l a r, donde l y r son el rango de índices y complete la array de suma de prefijos que tendrá el mismo tamaño que la array, agregando el elemento anterior de la array de suma de prefijos y el elemento presente de la array, luego, verifique si la suma del prefijo en cada etapa es primo o no a través de la prueba de primalidad de verificación de números primos. Si la suma del prefijo es primo, aumente el conteo; de lo contrario, no.

C++

// C++ program to count the number of
// prefix sum which are prime or not
#include<bits/stdc++.h>
using namespace std;
 
// Primality test to check if prefix
// sum is prime or not
bool isPrime(int num)
{
    // Corner case
    if (num <= 1) return false;
    if (num <= 3) return true;
 
    // This is checked so that we can skip
    // middle five numbers in below loop
    if (num%2 == 0 || num%3 == 0)
        return false;
 
    for (int j = 5; j * j <= num; j = j + 6)
        if (num%j == 0 || num%(j+2) == 0)
        return false;
 
    return true;
}
 
// to calculate the prefix sum for
// the given range of query
int primesubArraySum(int arr[], int n, int l,
                     int r, int preSum[])
{
    int count = 0;   
    preSum[0] = arr[l];   
    if (isPrime(preSum[0]))
       count++;
     
     
    for (int i = l + 1, j = 1;
        i <= r && j < n; i++,j++)
    {
        preSum[j] = preSum[j - 1] + arr[i];
         
        // increase the count if the
        // prefix sum is prime
        if (isPrime(preSum[j]))
            count++;
    }
     
    return count;
}
 
//driver code
int main()
{
    int arr[] = {5, 7, 8, 10, 13};
    int n = sizeof(arr)/sizeof(arr[0]);
    int preSum[n];
    int l = 0, r = 4;
    
    cout << primesubArraySum(arr, n, l, r, preSum);
     
    return 0;
}

Java

// Java program to count the number of
// prefix sum which are prime or not
import java.util.*;
class GFG
{
    // Primality test to check if
    // prefix sum is prime or not
    public static boolean isPrime(int num)
    {
        // Corner cases
        if (num <= 1)
            return false;
        if (num <= 3)
            return true;
     
        // This is checked so that we can skip
        // middle five numbers in below loop
        if (num % 2 == 0 || num % 3 == 0)
                return false;
     
        for (int j = 5; j * j <= num; j = j + 6)
            if (num % j == 0 || num % (j + 2) == 0)
                return false;
     
        return true;
    }
     
    // to calculate the prefix sum for
    // the given range of query
    public static int primesubArraySum(int arr[], int n,
                                       int l, int r,
                                       int preSum[])
    {
        int count = 0;
     
        preSum[0] = arr[l];
     
        if (isPrime(preSum[0]) == true)
            count++;
     
        for (int i = l+1,j = 1; i <= r && j < n; i++,j++)
        {
            preSum[j] = preSum[j-1] + arr[i];
         
            // increase the count if the prefix sum is prime
            if (isPrime(preSum[j]) == true)
                count++;
        }
     
        return count;
    }
 
    // Driver code
    public static void main (String[] args)
    {
        int arr[] = {5, 7, 8, 10, 13};
        int n = arr.length;
        int preSum[] = new int[n];
        int l = 0, r = 4;
        System.out.println(primesubArraySum(arr, n,
                           l, r, preSum));
    }
}

Python3

# Python program to count the number
# of prefix sum which are prime or not
import numpy
import math
 
# Primality test to check if prefix
# sum is prime or not
def isPrime(num):
     
    # Corner case
    if (num <= 1):
        return False;
    if (num <= 3):
        return True;
 
    # This is checked so that we can skip
    # middle five numbers in below loop
    if (num % 2 == 0 or num % 3 == 0):
        return False;
 
    for j in range(5, (int)(math.sqrt(num)) + 1, 6):
        if (num % j == 0 or num % (j + 2) == 0):
            return False;
 
        return True;
 
# to calculate the prefix sum for
# the given range of query
def primesubArraySum(arr, n, l, r, preSum):
 
    count = 0;
    preSum[0] = arr[l];
 
    if (isPrime(preSum[0])):
        count = count + 1;
     
     
    for i in range(l + 1, r):
        for j in range(1, n):
            preSum[j] = preSum[j - 1] + arr[i];
             
            # increase the count if the
            # prefix sum is prime
            if (isPrime(preSum[j])):
                count = count + 1;
 
    return count;
 
# Driver code
arr = [5, 7, 8, 10, 13];
n = len(arr);
 
#a = numpy.arange(5)
preSum = numpy.arange(n);
l = 0;
r = 4;
print(primesubArraySum(arr, n, l, r, preSum));
     
# This code is contributed
# by Shivi_Aggarwal

C#

// C# program to count the number of
// prefix sum which are prime or not
using System;
 
class GFG {
     
    // Primality test to check if
    // prefix sum is prime or not
    public static bool isPrime(int num)
    {
         
        // Corner cases
        if (num <= 1)
            return false;
        if (num <= 3)
            return true;
     
        // This is checked so that we can skip
        // middle five numbers in below loop
        if (num % 2 == 0 || num % 3 == 0)
                return false;
     
        for (int j = 5; j * j <= num; j = j + 6)
            if (num % j == 0 || num % (j + 2) == 0)
                return false;
     
        return true;
    }
     
    // To calculate the prefix sum
    // for the given range of query
    public static int primesubArraySum(int []arr, int n,
                                       int l, int r,
                                       int []preSum)
    {
        int count = 0;
     
        preSum[0] = arr[l];
     
        if (isPrime(preSum[0]) == true)
            count++;
     
        for (int i = l+1,j = 1; i <= r &&
                          j < n; i++,j++)
        {
            preSum[j] = preSum[j-1] + arr[i];
         
            // increase the count if the
            // prefix sum is prime
            if (isPrime(preSum[j]) == true)
                count++;
        }
     
        return count;
    }
 
    // Driver code
    public static void Main ()
    {
        int []arr = {5, 7, 8, 10, 13};
        int n = arr.Length;
        int []preSum = new int[n];
        int l = 0, r = 4;
        Console.Write(primesubArraySum(arr, n,
                      l, r, preSum));
    }
}
 
// This code is contributed by Nitin Mittal.

PHP

<?php
// PHP program to count
// the number of prefix
// sum which are prime
// or not
 
// Primality test to check if
// prefix sum is prime or not
function isPrime($num)
{
    // Corner case
    if ($num <= 1) return false;
    if ($num <= 3) return true;
 
    // This is checked so
    // that we can skip
    // middle five numbers
    // in below loop
    if ($num % 2 == 0 ||
        $num % 3 == 0)
        return false;
 
    for ($j = 5; $j * $j <= $num;
                 $j = $j + 6)
        if ($num % $j == 0 ||
            $num % ($j + 2) == 0)
        return false;
 
    return true;
}
 
// To calculate the prefix
// sum for the given range
// of query
function primesubArraySum($arr, $n,    
                          $l,$r, $preSum)
{
    $count = 0;
    $preSum[0] = $arr[$l];
    if (isPrime($preSum[0]))
    $count++;
     
    for ($i = $l + 1, $j = 1;
         $i <= $r && $j < $n;
         $i++, $j++)
    {
        $preSum[$j] = $preSum[$j - 1] +
                              $arr[$i];
         
        // increase the count if 
        // the prefix sum is prime
        if (isPrime($preSum[$j]))
            $count++;
    }
     
    return $count;
}
 
// Driver code
$arr = array(5, 7, 8, 10, 13);
$n = sizeof($arr);
$preSum = array();
$l = 0; $r = 4;
 
echo primesubArraySum($arr, $n, $l,
                      $r, $preSum);
     
// This code is contributed by Ajit
?>

Javascript

<script>
 
// Javascript program to count the number of
// prefix sum which are prime or not
 
// Primality test to check if
// prefix sum is prime or not
function isPrime(num)
{
     
    // Corner cases
    if (num <= 1)
        return false;
    if (num <= 3)
        return true;
   
    // This is checked so that we can skip
    // middle five numbers in below loop
    if (num % 2 == 0 || num % 3 == 0)
            return false;
   
    for(let j = 5; j * j <= num; j = j + 6)
        if (num % j == 0 || num % (j + 2) == 0)
            return false;
   
    return true;
}
   
// To calculate the prefix sum
// for the given range of query
function primesubArraySum(arr, n, l, r, preSum)
{
    let count = 0;
   
    preSum[0] = arr[l];
   
    if (isPrime(preSum[0]) == true)
        count++;
   
    for(let i = l + 1, j = 1;
            i <= r && j < n;
            i++, j++)
    {
        preSum[j] = preSum[j - 1] + arr[i];
       
        // Increase the count if the
        // prefix sum is prime
        if (isPrime(preSum[j]) == true)
            count++;
    }
    return count;
}
 
// Driver code
let arr = [ 5, 7, 8, 10, 13 ];
let n = arr.length;
let preSum = new Array(n);
 
preSum.fill(0);
let l = 0, r = 4;
 
document.write(primesubArraySum(
    arr, n, l, r, preSum));
 
// This code is contributed by decode2207
 
</script>
Producción: 

2

 

Publicación traducida automáticamente

Artículo escrito por akash1295 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *