如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
输入一个数N(N <= 10^6)
输出>=N的最小的质数中的质数。
20
31
用埃氏筛法筛选素数,如果是素数,num++,然后判断num如果是素数,就记录,按顺序记录,最后找第一个大于等于n的。
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define MAX 2000000 #define mod 1000000000 using namespace std; bool ispri[MAX]; int ans[MAX],num,c; int main() { int n; scanf("%d",&n); memset(ispri,true,sizeof(ispri)); ispri[0] = ispri[1] = false; for(int i = 2;i <= MAX;i ++) { if(ispri[i]) { num ++; if(ispri[num]) ans[c ++] = i; if(MAX / i >= i)//防止越界 for(int j = i * i;j <= MAX;j += i) { ispri[j] = false; } } } int l = 0,r = c - 1,mid; while(l < r) { mid = (l + r) / 2; if(ans[mid] >= n) r = mid; else l = mid + 1; } printf("%d",ans[l]); }