【PAT】1007. 素数对猜想 (20)
1007. 素数对猜想 (20)
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。
输入格式:每个测试输入包含1个测试用例,给出正整数N。
输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
输入样例:20输出样例:
4
关于素数判断函数:
第1种:按照定义进行判断,这种函数在N(<105)很大时,计算量非常大,在提交程序后显示“运算超时”:
1 bool prime(int num){ 2 int i; 3 if(num==1) return false; 4 for(i=2;i<num;i++) 5 if(num%i==0) return false; 6 return true; 7 }
第2种:在N的平方根范围内进行判断,大大减小运算量,故使用此函数:
1 bool prime(int num){ 2 int i,k; 3 if(num==1) return false; 4 k=int(sqrt(num)); 5 for(i=2;i<=k;i++) 6 if(num%i==0) return false; 7 return true; 8 }
程序设计:
方法一:
1.求出不超过N范围内的所有素数,并将其存储在数组prime_num[]中,由于105范围内一共有9592个素数,所以数组元素个数不应小于9592
2.对prime_num[]数组中的元素进行比较,求出后一位比前一位数值大2的对数
C++ 代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 bool prime(int num){ 4 int i,k; 5 if(num==1) return false; 6 k=int(sqrt(num)); 7 for(i=2;i<=k;i++) 8 if(num%i==0) return false; 9 return true; 10 } 11 int main() { 12 int prime_num[9600]; 13 int i,j=0,count=0; 14 long n; 15 cin>>n; 16 for(i=2;i<=n;i++){ 17 if(prime(i)){ 18 prime_num[j]=i; 19 j++; 20 } 21 else continue; 22 } 23 for(i=0;i<j-1;i++) 24 if(prime_num[i+1]-prime_num[i]==2) ++count; 25 cout<<count; 26 system("pause"); 27 return 0; 28 }
方法二:
当N>2时,所有的素数均为奇数,故只需求出相邻奇数中全为素数的对数即可
C++ 代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 bool prime(int num){ 4 int i,k; 5 if(num==1) return false; 6 k=int(sqrt(num)); 7 for(i=2;i<=k;i++) 8 if(num%i==0) return false; 9 return true; 10 } 11 int main() { 12 int i,count=0; 13 long n; 14 cin>>n; 15 for(i=3;i+2<=n;i+=2){ 16 if(prime(i)) 17 if(prime(i+2)) count++; 18 else continue; 19 } 20 cout<<count; 21 system("pause"); 22 return 0; 23 }