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