题目来源:
51Node ,题号 1181
如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。
Input示例
20
Output示例
31
java代码及注释如下:
package node51; import java.io.*; public class Node1181m { public static void markTable(int nmax,int[] prime,int[] mark){ int index = 0; //从2开始打表 for(int i=2;i<nmax;i++){ if(mark[i] == 0){ prime[index++] = i; //判断i是否小于等于根号nmax if(i<=(int)Math.sqrt(nmax)){ //注意,j=i*i for(int j=i*i;j<nmax;j+=i){ mark[j] = 1; } } } } } public static int getPrime(int n,int nmax,int[] prime,int[] mark){ int index = 0; //获取prime里面刚好大于或等于n的索引 while(prime[index]<n){ index++; } //index+1 即为第index+1个素数,从index+1开始往后找出素数中的素数。 for(int i=index+1;i<prime.length;i++){ if(mark[i]==0){ index = i-1; break; } } return prime[index]; } public static void main(String[] args) throws IOException { BufferedReader reader=new BufferedReader(new InputStreamReader(System.in)); BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(System.out)); int n = Integer.parseInt(reader.readLine()); //nmax = n+500,多开500,避免getPrime方法找到prime[] 数组中的索引后,数组里面却没有值。 int[] prime = new int[n+500]; int[] mark = new int[n+500]; markTable(n+500,prime,mark); writer.write(getPrime(n,n+500,prime,mark)+"\n"); reader.close(); writer.close(); } }