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;
}