1007 素数对猜想 (20 point(s))
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
第一种做法:
思路:
用筛法把素数筛出来,然后存进vector中,最后进行比较就行了
#include <iostream>
#include <vector>
using namespace std;
bool book[100010] = {false};
vector<int> v;
void prime(int n) {
for (int i = 2; i <= n; i++) {
if (!book[i]) {
v.push_back(i);
for (int j = 2 * i; j <= n; j += i) book[j] = true;
}
}
}
int main() {
int n, sum = 0;
scanf("%d", &n);
prime(n);
for (int i = 0; i < v.size(); i++) {
if (v[i + 1] - v[i] == 2) sum++;
}
printf("%d", sum);
return 0;
}
第二种做法:
思路:
遍历,然后看看是否是素数,是的话存进数组,最后比较,这种做法的时间复杂度比上面的做法大。
#include<iostream>
#include<cmath>
using namespace std;
int pdss(int x);
int pdssd(int x, int y);
int main()
{
int n, a[10001], s, m = 0, sum = 0;
cin >> n;
for(int i = 2; i <= n; i++){
s = pdss(i);
if(s == 1) a[m++] = i;
}
for(int i = 1; a[i] != '\0'; i++){
sum += pdssd(a[i - 1], a[i]);
}
cout << sum;
return 0;
}
int pdss(int x)
{
if(x == 0 || x == 1) return 0;
for(int i = 2; i <= sqrt(x); i++){
if(x % i == 0) return 0;
}
return 1;
}
int pdssd(int x, int y)
{
if(y - x == 2) return 1;
return 0;
}