1007 素数对猜想 (20分)
标签:bin style flex UNC ble 方法 names png mic
让我们定义d?n??为:d?n??=p?n+1??−p?n??,其中p?i??是第i个素数。显然有d?1??=1,且对于n>1有d?n??是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<10?5??),请计算不超过N
的满足猜想的素数对的个数。
输入在一行给出正整数N
。
在一行中输出不超过N
的满足猜想的素数对的个数。
20
4
这道题还是颇费了点儿功夫的,始用暴力查找,但是很明显这是行不通的的,因为会超时。但是我又不会其他方法了,于是去网上看了看。找到了一个埃拉托斯特尼筛子法,
它的基本思路是,删掉所有的合数,剩下的一定就是素数。于是这道题我们就用这个方法来寻找所有的素数,而且效率也很高。 看代码,代码注释的比较详细
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int main() 5 {//寻找素数用埃拉托斯特尼筛子法,基本思路:不是挑选出所有素数,而是筛掉所有的合数 6 int n; 7 cin>>n; 8 vector<int> v(n,0); 9 int k=0; 10 for(int i=2;i<=n/2;i++) //只需要一半就行,剔除v中的合数,剩下的即为素数 11 { 12 k=i; 13 if(v[k] == 0) 14 { 15 while (k<n) 16 { 17 k += i; 18 if(k<n) 19 v[k]=1; //标记为1代表不是素数 20 } 21 } 22 } 23 vector<int> v1; 24 for(int i=2;i<n;i++) 25 { 26 if (v[i] == 0) 27 v1.push_back(i); 28 } 29 int count=0; 30 for(unsigned int i=1;i<v1.size();i++) 31 { 32 if(v1[i]-v1[i-1]==2) 33 count++; 34 } 35 cout<<count; 36 return 0; 37 }
有一个测试点没通过,找不出哪里有问题
标签:bin style flex UNC ble 方法 names png mic
原文地址:https://www.cnblogs.com/buanxu/p/12812606.html