题目来源: Sgu
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
收藏
关注
如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。
Input示例
20
Output示例
31
写回忆下筛选素数的方法,思路:对于不超过n的每个非负整数p,删除2p,3p,4p...,处理完所有的数之后,剩下没被删除的数就是素数。
代码可以写成
private static void solve(int n) {
Arrays.fill(vis, 0); //初始化
for(int i=2;i<=n;i++) {
for(int j=2*i;j<=n;j+=i)
vis[j]=1; //vis[j]=1表示不是素数
}
}
还可以继续改进,p可以限定为素数,内层循环也不必从i*2开始,它已经在i=2时被筛掉了。
private static void solve2(int n) {
int m = (int) Math.sqrt(n + 0.5);
Arrays.fill(vis, 0);
for (int i = 2; i <= m; i++) {
if (vis[i] == 0) { //对于每个素数
for(int j=i*i;j<=n;j+=i) {
vis[j]=1;
}
}
}
}
在回到这题:先筛选1000000内的素数,在用一个数组记录每个素数的位置(是第多少个素数)
import java.util.Arrays;
import java.util.Scanner;
public class Main{
static int []vis = new int[1000005];
static int cnt=0;
static int []ans=new int[1000005]; //记录是第多少个素数
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
solve(1000000);
for(int i=2;i<=1000000;i++) {
if(vis[i]==0){
ans[i]=++cnt;
}
}
while (in.hasNext()) {
int n = in.nextInt();
for (int i = n; ; i++) {
if(vis[i]==0&&vis[ans[i]]==0){
System.out.println(i);
break;
}
}
}
}
//筛选素数
static void solve(int n) {
int m = (int) Math.sqrt(n + 0.5);
Arrays.fill(vis, 0);
for(int i=2;i<=m;i++)
if(vis[i]==0)
for(int j=i*i;j<=n;j+=i) {
vis[j]=1;
}
}
}