JAVA——求出指定範圍內所有的質數
阿新 • • 發佈:2018-11-10
求出指定範圍內所有的質數
1.要求
在視窗輸出指定範圍內所有的質數,並對所有輸出的質數個數進行計數。
2.質數
在所有比1大的整數中,除了1和它本身以外,不再有別的因數,這種整數叫做質數或素數。還可以說成質數只有1和它本身兩個約數。
3.原理
具體做法是:先把N個自然數按次序排序起來。1不是質數,也不是合數,要劃去。第二個數是質數留下來,而把2後面的所有能被2整除的數都劃去。2後面第一個沒劃去的數是3,把3留下,再把3後面所有能被3整除的數都劃去。3後面第一個沒劃去的數是5,把5留下,再把5後面所有能被5整除的數都劃去。這樣一直做下去,就會把不超過N的全部合數都刪掉,留下的就是不超過N的全部質數。
4.語法
- filterNumber()方法使用篩選法求傳入引數值範圍內的所有的質數。宣告一個布林型別的陣列,陣列元素的值為true時,表示該元素的下標為質數。如果number是一個質數,那麼number的位數都不是質數,利用Array.fill()方法初始化布林型別陣列,然後利用迴圈將陣列下標為number的倍數元素值設定為false。這樣就能判斷哪部分元素是質數了。
- ShowAppointArea()方法呼叫FilterNumber()方法,得到布林型別陣列,將值為true的元素的下標在控制檯輸出。
5.程式碼
import java.util.Arrays;
public class rw31 {
public static void main(String[] args) {
//JAVA主程式入口
// TODO Auto-generated method stub
int number=300; //對範圍進行設定
System.out.println("範圍在"+number+"內的質數有:");
showAppointArea(number); //呼叫方法顯示質數
}
public static void showAppointArea(int number) {
//顯示指定範圍內的質數
// TODO Auto-generated method stub
boolean[]primes=FilterNumber(number);//呼叫方法賦值給布林型別的陣列
int num=0;
if(primes!=null){
for(int i=1;i<primes.length;i++){ //迴圈陣列運算元組的元素
if(primes[i]){
//如果陣列元素值為true,則下標值為質數
System.out.print(i+" ");//輸出質數
if(++num%10==0)//每輸出十個質數後進行換行
System.out.println();
}
}
System.out.println("\n(一共有"+num+"個)");
}
}
private static boolean[] FilterNumber(int num) {
//篩選法求質數
// TODO Auto-generated method stub
if(num<=0){ //判斷指定的範圍
System.out.println("範圍必須大於0");
return null;
}
boolean[]isPrime=new boolean[num+1];
//申明布林型別陣列,長度為範圍+1
//陣列標註是否為質數,下標值為質數,那麼對應陣列元素值為true
//例如2是質數,isPrime[2]=true
isPrime[1]=false;//1不是質數
Arrays.fill(isPrime, 2,num+1,true);//將布林陣列元素的值都賦為true
int n=(int)Math.sqrt(num); //Math.sqrt方法用於求開方
for(int i=1;i<n;i++){
if(isPrime[i]){ //如果是質數,那麼i的倍數不是質數
for(int j=2*i;j<=num;j+=i){
isPrime[j]=false;
}
}
}
return isPrime;
}
}
6.結果
編譯結果如下圖所示:
執行結果如下圖所示: