让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。
输入格式:每个测试输入包含1个测试用例,给出正整数N。
输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
输入样例:20输出样例:
4
简析:
本题先求出小于 N 的素数,然后将差值为2的素数对个数计算出来。用了两种方法写:
第一种方法很直观,将素数放入VEC容器中,然后比较,输出 cnt ,但是提交的时候显示段错误,扣掉2分,换成 long int 的时候运行超时,好忧伤。求指导啊!
第二种方法我用的数组来写,定义MAXSIZE=100000的整型数组,初始化为0,不是素数的标记1,没被标记的就是素数。程序AC通过。奇怪,这里的n还是有可能会取到超过 32767 的,没有显示段错误。忧伤~
代码如下:
方法一:
//方法一: /*********************************************** CSDN博客地址:http://blog.csdn.net/xiaqunfeng123 转载请注明出处,谢谢! ——Summer_ZJU ************************************************/ #include <iostream> #include <stdlib.h> #include <vector> #include <algorithm> using namespace std; int main() { int n; cin>>n; int cnt=0; vector<int> vec; vector<int>::iterator it1,it2; for(int temp=2;temp<=n;temp++) { bool flag=true; for (int i=2;i<=(int)(sqrt((double)temp)+1);i++) if(temp%i==0) { flag=false; } if(flag) vec.push_back(temp); } for (it1=vec.begin(),it2=it1+1;it2!=vec.end();it1++,it2++) { if(*it2-*it1==2) cnt++; } cout<<cnt; system("pause"); return 0; }
方法二:
//方法二: /*********************************************** CSDN博客地址:http://blog.csdn.net/xiaqunfeng123 转载请注明出处,谢谢! ——Summer_ZJU ************************************************/ #include<iostream> #include <cmath> #include <vector> #include<cstring> #include <stdlib.h> #define MAXSIZE 100000 using namespace std; int prime[MAXSIZE]; int main() { memset(prime,0,MAXSIZE);//初始化数组为0 int N,i,j; int k=0; vector<int> vec; vector<int>::iterator it1,it2; int m=(int)(sqrt(double(MAXSIZE))+0.5); cin>>N;//N也取不到100000,因为是整型的,这个地方是怎么处理的没有看明白 for ( i=2;i<m;i++) for ( j=i*i;j<MAXSIZE;j+=i)//从i*i开始,所有i的倍数都标志为1 prime[j]=1; for( i=2;i<=N;i++) { if (!prime[i]) vec.push_back(i); } for (it1=vec.begin(),it2=it1+1;it2!=vec.end();it1++,it2++) if (*it2-*it1 ==2) k++; cout<<k<<endl; system("pause"); return 0; }