1007 素数对猜想 (20 分)
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
AC代码
#include <iostream>
#include <cmath>
using namespace std;
int isPrime(int x);
int main() {
int N, Temp = 2, cnt = 0;
cin >> N;
for (int i = 3; i <= N; i++)
if (isPrime(i)) { if ((i - Temp) == 2) cnt++; Temp = i; }
cout << cnt;
return 0;
}
int isPrime(int x) {
int ret = 1;
for (int i = 2; i <= sqrt(x); i++) if (x%i == 0) { ret = 0; break; }
if (x == 1) ret = 0;
return ret;
}
二刷欧拉筛O(n)复杂度AC代码
使用模版【模版】欧拉筛
#include <iostream>
#include <cstdio>
#define MaxSize 100010 //最大数据量
using namespace std;
int n, cnt; //数据量 素数个数
int prime[MaxSize]; //存放素数
int v[MaxSize]; //是否访问过
void ola(int n){ //欧拉筛 O(n)复杂度
for (int i = 2; i <= n; i++){
if (!v[i]) prime[cnt++] = i;
for (int j = 0; j < cnt && i*prime[j] <= n; j++){
v[i*prime[j]] = 1;
if (i%prime[j] == 0) break; //实现O(n)的关键
}
}
}
int main(){
scanf("%d", &n);
ola(n); //获取n以内的素数放入prime[i]内
int ret = 0;
for (int i = 1; i < cnt; i++)
if (prime[i] - prime[i-1] == 2) ret++;
printf("%d\n", ret);
return 0;
}