在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(boolcheck[],inttemp)中找到所有小于n的质数。
同样对于每个奇数temp,具有和temp的不重复对的计数将为temp/2。
除了2以外,所有素数都是奇数,因此,如果发现任何小于n的素数,则将temp/2添加到对数中。
将变量n作为输入。
函数prime_pair(intn)取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(boolcheck[],inttemp),用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