用C ++中的素数求和子数组

给我们一个正整数数组。目的是找到数组中数字的子数组,以使每个子数组都将和作为素数。如果数组是{1,2,3,4}。然后,子数组将为{1,2},{2,3},{3,4}。此类子数组的数量为3。

让我们用例子来理解

输入− arr [] = {1,3,5,3,2};

输出-素数总和的子数组计数为:3

解释-子数组将是:{3,2} sum = 5素数,{3,5,3} sum = 11素数,{3,5,3,2} sum是13素数。

输入− arr [] = {2,4,6};

输出-具有素数和的子数组的计数为:0

说明-所有子数组都具有非素数和。{2,4} = 6,{4,6} = 10

以下程序中使用的方法如下

我们将使用筛子查找所有小于最大值107的质数,并将其存储在vector <bool>检查中。如果任何数字为素数,则check [i]为true,否则为false。然后使用两个for循环遍历该数组,继续在子数组的和中添加元素,并使用check [sum]检查它是否为素数。如果是,则用素数和增加子数组的计数。

  • 取正整数的数组arr []。

  • 函数sub_prime(int arr [],int size)接收数组,并返回以sum为质数的子数组的计数。

  • 将初始计数设为0。

  • 将temp = pow(10,7)初始化为最大值。

  • 用true初始化向量检查。

  • check [0]和check [1]为假,因为它们不是素数。

  • 从i = 2到i * i <temp。所有数字均为假,因为它们不是非素数。

  • 现在,如果我是素数,向量check [i]为true,否则为false。

  • 再次遍历数组使用两个for循环。

  • 将可变总数作为子数组中元素的总和。Arr [i]到arr [j]。其中i = 0到i <size-1,j = i + 1到j <size。

  • 如果有任何check [total]为true。(总和为素数)。增量计数。

  • 结果在所有循环结束时返回计数。

示例

#include <bits/stdc++.h>
using namespace std;
int sub_prime(int arr[], int size){
   int count = 0;
   int temp = int(pow(10, 7));
   vector check(temp + 1, true);
   check[0] = false;
   check[1] = false;
   for (int i = 2; i * i <= temp; i++){
      if (check[i] == true){
         for (int j = i * 2; j <= temp; j += i){
            check[j] = false;
         }
      }
   }
   for (int i = 0; i < size - 1; ++i){
      int total = arr[i];
      for (int j = i + 1; j < size; ++j){
         total += arr[j];
         if (check[total]){
            ++count;
         }
      }
   }
   return count;
}
int main(){
   int arr[] = { 3, 5, 1, 9, 5 };
   int size = sizeof(arr) / sizeof(arr[0]);
   cout<<"Count of subarrays with Prime sum are: "<<sub_prime(arr, size);
   return 0;
}

输出结果

如果我们运行上面的代码,它将生成以下输出-

Count of subarrays with Prime sum are: 1