判斷101-200之間有多少個素數,並輸出所有素數。

問題:判斷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);
	}
}
發佈了72 篇原創文章 · 獲贊 50 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章