给定正数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