XTU-OJ 《C语言程序设计》 1237-Prime Twins

文章讲述了如何使用埃氏筛和前缀和技巧求解区间内孪生素数对的数量,涉及素数检测和排除边界条件。
题目描述

如果n和n+2都是素数,我们称其为孪生素数,比如3和5,5和7都是孪生素数。 给你一个区间[a,b],请问期间有多少对孪生素数?

输入

第一行是一个整数K(K≤ 10000),表示样例的个数。 以后每行一个样例,为两个整数,a和b,1≤a≤b≤5000000。

输出

每行输出一个样例的结果。

样例输入
5 
1 3 
1 10 
1 100 
1 1000 
1 5000000
样例输出
0 
2 
8 
35 
32463

解题思路: 这题和 1098-素数个数 这题大同小异,都是用 前缀和 的方法去解。

这次我们不用 欧拉筛 来判断素数,选用一个较为简单直观的方法——埃氏筛。 同样的筛完之后就开始打表得到 前缀和数组。

*注:为什么最后是  twins[b] - twins[a+1] (第25行),而不是 1098-素数个数 这题的 books[b] - books[a-1], 具体情况要具体思考,不能硬套公式。  a-2 与 a, a-1 与 a+1, 这些就算是孪生素数,但也不在 [ a , b] 这个区间范围内。是要排除掉的,所以要从 a 与 a + 2 算起。

AC代码:

#include <stdio.h>

const int MAXN = 5*1e6;
int k,a,b,cnt;
i
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值