在C ++中以sum为质数的计数对小于n

给定正数n作为输入。目的是找到可能的对(i,j)的数量,以使每对具有素数且小于n的总和(i + j)。同样,i!= j且i,j> = 1如果n为4,则仅1对是可能的,即(1,2)。这里1 + 2 = 3是质数,小于4。另外1,2> = 1。

让我们通过示例来理解。

输入-n = 7

输出-以和为质数且小于n的对数为-3

说明-对将是(1,2),(1,4),(2,3)。总和3、5、5是质数且小于7。

输入-n = 10

输出-以和为质数且小于n的对数为-6

说明-

对将是(1,2),(1,4),(2,3),(1,6),(2,5),(3,4)。

总和3、5、5、5、7、7、7是素数且小于10。

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

在这种方法中,我们将首先使用sundaram的Sieve在函数check_prime(bool check [],int temp)中找到所有小于n的质数。

同样对于每个奇数temp,具有和temp的不重复对的计数将为temp / 2。

除了2以外,所有素数都是奇数,因此,如果发现任何小于n的素数,则将temp / 2添加到对数中。

  • 将变量n作为输入。

  • 函数prime_pair(int n)取n并返回以sum为质数且小于n的对数。

  • 将初始计数设为0。

  • 由于Sundaram的Sieve为输入n生成了小于2 * n + 2的质数。我们将n减少到一半并存储在temp_2中。

  • 创建一个长度为temp_2的Check []数组,以将形式(i + j + 2 * i * j)的所有数字标记为True。使用所有元素将其初始化为false。

  • 使用函数check_prime(bool check [],int temp),用true初始化check []以表示形式(i + j + 2 * i * j)的数字。而这个总和<temp。

  • 现在使用for循环从索引i = 0到i <temp_2遍历Check []。

  • 对于每个check [i]为假的,素数将为temp = 2 * i + 1。

  • 总计为temp的对将为temp / 2。

  • 加temp / 2进行计数。

  • 在for循环的末尾,我们将有总计对,且总和为质数且小于n。

  • 返回计数作为结果。

示例

#include <bits/stdc++.h>
using namespace std;
void check_prime(bool check[], int temp){
   for (int i=1; i<=temp; i++){
      for (int j=i; (i + j + 2*i*j) <= temp; j++){
         check[i + j + 2*i*j] = true;
      }
   }
}
int prime_pair(int n){
   int count = 0;
   int temp;
   int temp_2 = (n-2)/2;
   bool check[temp_2 + 1];
   memset(check, false, sizeof(check));
   check_prime(check, temp_2);
   for (int i=1; i <= temp_2; i++){
      if (check[i] == false){
         temp = 2*i + 1;
         count += (temp / 2);
      }
   }
   return count;
}
int main(){
   int n = 10;
   cout<<"Count of pairs with sum as a prime number and less than n are: " <<prime_pair(n);
   return 0;
}

输出结果

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

Count of pairs with sum as a prime number and less than n are: 6
猜你喜欢