改进筛法- 质数中的质数(质数筛法)

1181 质数中的质数(质数筛法)

题目来源: Sgu

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

 

如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
 

Input

输入一个数N(N <= 10^6)

Output

输出>=N的最小的质数中的质数。

Input示例

20

Output示例

31

  最常见的筛法是筛去素数的倍数,但很显然这样会大量重复筛去相同的元素(虽然比筛去整数的倍数好)。而由合数的定义可以看出,合数必然有复数个数的素因子,我们只需要在第一个素因子处判断即可,否则会重复。

  而这道题需要在筛法的基础上加一次判断。

  【思路来自http://blog.csdn.net/morewindows/article/details/7347459】

//代码如下

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
bool su[100000000];
int shu[2000500],shusu[2000500];
int shai(int a){
int i=2,j,k=1,l=1;
while(shusu[l-1]<a){
if(!su[k-1]&&shusu[l-1]!=shu[k-1])
shusu[l++]=shu[k-1];
if(!su[i]) shu[k++]=i;
for(j=1;j<=k&&i*shu[j]<=a*10;j++)
{
su[i*shu[j]]=true;
if(i%shu[j]==0) break;
}
i++;
}
l--;
return l;

}
int main()
{
int n;
cin>>n;
// for(int i=1;i<=shai(n);i++) cout<<shusu[i]<<" ";
cout<<shusu[shai(n)]<<endl;
return 0;
}

转载于:https://www.cnblogs.com/wengsy150943/p/5767499.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值