質數定義:能且僅能被1
和它本身整除的整數,稱爲質數,最小的質數是2。
思路:
如果X在(2,X-1]這個區間內沒有約數,則證明X是質數。
實現方法一:
/**
* @author 蝸牛君
* @create 2019-09-12 16:52
*/
/*輸出100000之內的質數
* 質數的定義:能且只被1和它本身整除的數稱爲質數
* */
public class primeNumberTest {
public static void main(String[] args) {
//定義一個變量記錄質數的個數
int primeNumberCount = 0;
//獲取當前時間
long start = System.currentTimeMillis();
//計算0到100000之間質數的個數
int num = 100000;
for (int i = 2; i <= num; i++) {
//定義一個bool型變量,用來判斷是不是質數
boolean isFlag = true;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
//如果在(2,i-1]這個區間內有約數,說明不是質數
isFlag = false;
}
}
if (isFlag == true) {
//System.out.println(i + "是質數");
primeNumberCount++;
}
}
long end = System.currentTimeMillis();
System.out.println("本次運算用時:" + (end - start ) + "毫秒");
System.out.println("0到"+ num + "之間共有"+ primeNumberCount +"個質數!");
}
}
實現方法二:
是對方法一的優化,一旦判斷X爲質數,就通過countinue來跳出本次循環,節省算力,縮減計算時間
注:對循環體添加標籤,可以方便break、continue直接跳轉到指定的循環體
public class primeNumberTest {
public static void main(String[] args) {
int primeNumberCount = 0;
//獲取當前時間
long start = System.currentTimeMillis();
int num = 100000;
lable:for ( int i = 2 ; i <= num ; i++ ){
int count = 0;
for (int j = 2; j < i;j ++){
if (i % j == 0) {
//當在這個區間有公約數時,可判斷不是質數,直接退出循環,不再進行後面的判斷,可縮減部分運算時間
continue lable ;
}
}
primeNumberCount++;
}
long end = System.currentTimeMillis();
System.out.println("本次運算用時:" + (end - start ) + "毫秒");
System.out.println("0到"+ num + "之間共有"+ primeNumberCount +"個質數!");
}
}
實現方法三:
再次優化,重點在二層循環時,減少了對 j 的判斷的範圍。
說明:如果 C = A x A,則只需要確定 C 在 ( 2 , A ] 的區間內沒有約數,就可以證明 C 是質數。
public class primeNumberTest {
public static void main(String[] args) {
//定義一個變量來統計共有多少個質數
int primeNumberCount = 0;
//System.currentTimeMillis()用於獲取當前時間
long start = System.currentTimeMillis();
//輸出0到100000之間的所有質數
int num = 100000;
//對外層for循環添加一個標籤,break或者continue可以根據標籤跳到指定循環體
lable:for ( int i = 2 ; i <= num ; i++ ){
//Math.sqrt(i)用來求i的平方,類型爲int
for (int j = 2; j <= Math.sqrt(i);j ++){
//如果i能被(2,Math.sqrt(i)]這個區間的數整除,說明不是質數,用continue直接 跳轉到外層循環
if (i % j == 0) {
continue lable;
}
}
//System.out.println(i + "是質數");
primeNumberCount++;
}
long end = System.currentTimeMillis();
System.out.println("本次運算用時:" + (end - start ) + "毫秒");
System.out.println("0到"+ num + "之間共有"+ primeNumberCount +"個質數!");
}
}