1. 程式人生 > >java-1013 數素數 (20)

java-1013 數素數 (20)

1013 數素數 (20)(20 分)

令P~i~表示第i個素數。現任給兩個正整數M <= N <= 10^4^,請輸出P~M~到P~N~的所有素數。

輸入格式:

輸入在一行中給出M和N,其間以空格分隔。

輸出格式:

輸出從P~M~到P~N~的所有素數,每10個數字佔1行,其間以空格分隔,但行末不得有多餘空格。

輸入樣例:

5 27

輸出樣例:

11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103

需要注意的問題:第10000個質數非常有可能已經超過了int的界限,所以我們要使用long型別的變數來儲存質數

 

這回我覺得先上處理流程比較好:

public static void main() throws IOException {
        int[] range = getData();//獲取範圍
        long lastPrime = 1;
        int count = 0;
        for (int i = 1 ; i < range[0] ; i ++) {//從1開始到下界之前的一個質數
            lastPrime = getPrimeBase(lastPrime);
        }

        for (int i = range[0] ; i < range[1]; i ++) {//從下界開始到上界的前一個質數
            print((lastPrime = getPrimeBase(lastPrime)), (++count) % 10);
        }
        System.out.print(getPrimeBase(lastPrime));//輸出最後一個
    }

getData():用於獲取下界和上界

public static int[] getData() throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String[] targetString = bufferedReader.readLine().split(" +");
        int[] range = new int[2];
        range[0] = Integer.parseInt(targetString[0]);
        range[1] = Integer.parseInt(targetString[1]);
        return range;
    }

getPrimeBase(int):返回基於引數的下一個質數

public static long getPrimeBase(long i) {
        boolean flag;
        if (i == 1)//否則後面會直接跳轉到三
            return 2;
        i = i % 2 ==0 ? i + 1 : i + 2;//質數除了2,都是偶數
        for (long result = i; true ; result += 2) {//這裡+2是和之前一個道理
            flag = true;
            for (int judge = 2 ; judge * judge <= result ; judge ++) {
                if (result % judge == 0){
                    flag = false;
                    break;
                }
            }
            if (flag)
                return result;
        }
    }

print(int, int)按照相應的格式輸出

public static void print(long lastPrime, int count) {
        switch (count) {
            case 0:
                System.out.print(lastPrime);
                System.out.println();
                break;
                default:
                    System.out.print(lastPrime + " ");
                    break;
        }
    }