51nod_1181 质数中的质数(质数筛法)

1181 质数中的质数(质数筛法)
题目来源: Sgu
基准时间限制:1 秒 空间限制:131072 KB

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

思路:筛法把10^6内的素数筛出来,然后再直接枚举把质数中的质数找出来,最后二分查找>=n的答案

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
char ss[1000005];
char inss[1000005];
void sf(){
    memset(ss,'1',sizeof(ss));
    ss[0]='0';
    ss[1]='0';
    for(int i=2;i<1000005;i++){
        if(ss[i]=='1'){
            for(int j=i+i;j<1000005;j+=i)
        {
                ss[j]='0';

                }
        }
    }
//  for(int i=0;i<1000005;i++){
//      if(ss[i]=='1')
//      cout<<i<<endl;
//  }
}
int main(){
    sf();
//  for(int i=2;i<=1000005;i++)
//  if(ss[i]=='1')
//  cout<<i<<endl;
    vector<int>v,v1;
    for(int i=2;i<=1000000;i++){
        if(ss[i]=='1')
    v.push_back(i);

    }
    for(int i=0;i<v.size();i++){//prime in prime 
        if(ss[i+1]=='1')
        v1.push_back(v[i]);
    }
//  for(int i=0;i<v1.size();i++){
//      cout<<v1[i]<<endl;
//  }

    int n;
    scanf("%d",&n);
    if(n==2||n==3)
    {
        cout<<"3"<<endl;
        return 0;
    }
    //er fen 
    int r=v1.size()-1;

//  for(int i=0;i<v1.size()-1;i++){
//      if(v1[i+1]>=n&&n>v1[i]){
//          cout<<v1[i+1]<<endl;
//          break;
//      }
//
//  }
int l=0;

int mid;
while(l<=r)
{
    mid=(l+r)/2;
    if(v1[mid]>=n&&v1[mid-1]<n&&(mid-1)>=0)
    {
        cout<<v1[mid]<<endl;
        break;
    }
    if(v1[mid]>n&&v1[mid-1]>n&&(mid-1)>=0){
        r=mid;
        continue; 
    }
    if(v1[mid]<n)
    {
        l=mid;
        continue;
    }
}





    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值