java基礎算法----輸出0到X之間的質數

質數定義:能且僅能被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 +"個質數!");
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章