輸出0到X之間全部質數

質數定義:能且僅能被1和它自己整除的整數,稱爲質數,最小的質數是2。java

思路:若是X在(2,X-1] 這個區間內沒有約數,則證實X是質數。優化

實現方法一:code

/**
 * @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 +"個質數!");
    }
}

實現方法二:class

是對方法一的優化,一旦判斷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 的判斷的範圍。im

說明:若是 C = A x A,則只須要肯定 C 在 ( 2 , A ] 的區間內沒有約數,就能夠證實 C 是質數。static

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 +"個質數!");
    }
}
相關文章
相關標籤/搜索