java-1013 數素數 (20)
阿新 • • 發佈:2018-12-30
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;
}
}