PAT(Basic Level) 1007 素数对猜想 (20)
让我们定义 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
# 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语言
#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;
}