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

题目来源:  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();
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值