1. 程式人生 > >JAVA——求出指定範圍內所有的質數

JAVA——求出指定範圍內所有的質數

求出指定範圍內所有的質數


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.結果

編譯結果如下圖所示:
在這裡插入圖片描述
執行結果如下圖所示:
在這裡插入圖片描述