問題:判斷101-200之間有多少個素數,並輸出所有素數。
程序分析:
素數:如果一個數只能被1和自己整除,那麼這個數就是素數
判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數,反之是素數。
上面有這麼一句話:用一個數分別去除2到sqrt(這個數) 爲什麼除到這個數的開平方就好了呢?假如我判斷16是不是素數(16的平方根是4),步驟是這樣的:
用16去除2 能整除
用16去除3 不能整除
用16去除4 能整除
(已經除到4啦)
爲啥可以不用繼續了呢?
你用16去除以8 結果是2 而一開始你已經用16除了2 相當於做了重複的操作 以我的理解 除到平方根的位置 就相當於找到了一個對稱位置 超過這個位置的操作就是重複的
程序設計:
這個題中,用雙層循環,外循環表示101到200之間的每一個數, 在外層循環設置一個變量用來計數,一個變量用來標記是否是素數,內循環表示2到這個數的開平方數;首先在內存循環中判斷當前這個數能否被2到sqrt(這個數)整除,只有能滿足一個
就將標記變爲true 並且跳出當前這個循環;然後在外層循環中檢查flag的變化 如果flag是false,就表示這個數是素數 就需要將計數器加上一,並且每次在外層循環都需要將flag重置爲false(如果不重置的話,假如某一次flag變爲了true 之後就一直爲true了 就意味着之後每一個數都不是素數了....所以就需要重置)
代碼:
import org.junit.Test;
public class IsPrime {
/**
* 統計某個區間素數的方法
* @param number1(數字1)
* @param number2(數字2)
* @return int 素數的個數
*/
public static void isPrime(int number1 , int number2) {
//用來計數的變量
int total = 0;
//用來判斷是否是素數的標記
boolean flag = false;
//外層循環表示遍歷兩個數之間的所有數
for(int i = number1 ; i <= number2 ; i++) {
//內層循環表示遍歷從2到這個數的開平方數
for(int j = 2 ; j <= Math.sqrt(i) ; j++) {
//如果能整除 就將標記設置爲true 並且跳出本次循環
if(i % j == 0) {
flag = true;
break;
}
}
//當標記還是沒變化(仍然是false)時 就代表這個數是素數
if(!flag) {
total ++;
System.out.println(i+"是素數");
}
//每次計算完一個數都將標記重置爲false
flag = false;
}
System.out.println(number1+"和"+number2+"之間的素數個數是"+total);
}
/**
* 測試
*/
@Test
public void test() {
isPrime(101 , 200);
}
}