素数对

GitHub跳转原题关系图返回列表

用埃氏筛标记不超过 n 的素数,再枚举相差为 2 的素数对。

OJ: noi_openjudge

题目 ID: ch0112-10

难度:普及-

标签:素数筛法数学python

日期: 2026-07-30 23:01

题意

输出两个数都不超过 nn、且差为 2 的全部素数对;不存在则输出 empty

思路

埃氏筛先标记所有素数:从每个尚为素数的 number 开始,将其平方起的倍数标为合数。随后枚举 p 并检查 p + 2 是否也为素数即可。

代码

Python代码

python
limit = int(input())
is_prime = [True] * (limit + 1)
if limit >= 0:
    is_prime[0] = False
if limit >= 1:
    is_prime[1] = False

for number in range(2, int(limit**0.5) + 1):
    if is_prime[number]:
        is_prime[number * number : limit + 1 : number] = [False] * len(
            range(number * number, limit + 1, number)
        )

pairs = [(number, number + 2) for number in range(2, limit - 1) if is_prime[number] and is_prime[number + 2]]
if pairs:
    for first, second in pairs:
        print(first, second)
else:
    print("empty")

C++代码

cpp
#include <cstdio>

bool is_prime(int x){
    int i;
    for (i=2;i<x;i++){
        if( x % i == 0)
            return 0;
    }
    return 1;
}
int main(){
    int n;
    scanf("%d",&n);
    int i,cnt = 0;
    for (i=3;i<=n-2;i++){
        if( is_prime(i) && is_prime(i+2)){
            cnt++;
            printf("%d %d\n",i,i+2);
        }
    }
    if( !cnt)
        printf("empty");
    return 0;
}

复杂度

筛法时间复杂度为 O(nloglogn)O(n \log\log n),空间复杂度为 O(n)O(n)

总结

需要一次判断大量小范围整数是否为素数时,筛法比逐个试除更合适。