C++ 中求和为素数且小于 n 的对数


给定一个正数 n 作为输入。目标是找到可能的对数 (i,j),使得每对的和 (i+j) 为素数且小于 n。 此外 i != j 且 i,j>=1 如果 n 为 4,则只有一种可能的对 (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, 7, 7, 7 为素数且小于 10。

下面程序中使用的方案如下

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

此外,对于每个奇数 temp,具有和 temp 的不同对的数量将为 temp/2。

除了 2 之外,所有素数都是奇数,因此如果我们找到任何小于 n 的素数,我们将把 temp/2 加到对的数量中。

  • 将变量 n 作为输入。

  • 函数 prime_pair(int n) 获取 n 并返回和为素数且小于 n 的对的数量。

  • 将初始计数设为 0。

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

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

  • 使用函数 check_prime(bool check[], int temp),将 check[] 初始化为形式为 (i+j+2*i*j) 的数字的 true。 并且此和 < temp。

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

  • 对于每个 check[i] 为 false,素数将为 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

更新于: 2020-12-02

285 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告