让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

项目 要求
时间限制 400 ms
内存限制 65536 kB
代码长度限制 8000 B
判题程序 Standard
作者 CHEN, Yue

让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。

输入格式

每个测试输入包含1个测试用例,给出正整数N。

输出格式

每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。

输入样例

20

输出样例

4

代码实现

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# python 最后一个示例运行超时。
import math


def check_prime(n):
is_prime = 1
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
is_prime = 0
break
return is_prime


def cnt_prime_pairs(n):
cnt = 0
pn = 1
for i in range(2, n + 1):
if check_prime(i):
dn = i - pn
pn = i
if dn == 2:
cnt += 1
return cnt


if __name__ == '__main__':
num = int(input())
print(cnt_prime_pairs(num))

C语言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<stdio.h>
#include<math.h>

int check_prime(int n) {
int is_prime = 1;
//直接使用"%d" sqrt(n) 为一个特别大的数,因此强制转换为 int 型 (int)sqrt(n)
for ( int i = 2; i < (int)sqrt(n) + 1; i++ ) {
if ( n % i == 0) {
is_prime = 0;
break;
}
}
return is_prime;
}


int main() {
int num;
int cnt = 0;
int pn = 1;
int dn;

scanf("%d", &num);
for ( int i = 2; i < num + 1; i++ ) {
if ( check_prime(i) ) {
dn = i - pn;
pn = i;
if ( dn == 2 ) {
cnt++;
}
}
}
printf("%d", cnt);

return 0;
}