用埃氏筛标记不超过 n 的素数,再枚举相差为 2 的素数对。
OJ: noi_openjudge
题目 ID: ch0112-10
难度:普及-
标签:素数筛法数学python
日期: 2026-07-30 23:01
题意
输出两个数都不超过 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;
}复杂度
筛法时间复杂度为
总结
需要一次判断大量小范围整数是否为素数时,筛法比逐个试除更合适。