1. 程式人生 > >Java實現100000以內的質數的輸出的優化過程

Java實現100000以內的質數的輸出的優化過程

我們知道計算機去執行演算法是需要時間的,小數以內的時間我們可能不會覺得慢,但是在大繁瑣的程式中還是會覺得很慢的;

下面我們看一下輸出100000以內的質數如何實現優化的一個過程:

首先我們看一個可以實現輸出質數的程式:

public static void main(String[] args) {
        boolean flag=false;
        long start=System.currentTimeMillis();//系統輸出的一個時間毫秒為單位
        for(int i=2;i<=100000;i++){
            for(int j=2;j<i;j++){
                if(i%j==0){
                    flag=true;
                }
            }
            if(flag==false){
                System.out.println(i);
            }
            flag=false;
        }
        long end=System.currentTimeMillis();//系統輸出的一個時間毫秒為單位
        System.out.println(end-start);//14391這是輸出的時間
    }

這個程式輸出時間為14391毫秒,那麼可以感覺出這個不算快,我們還有更好的辦法嗎?

上面可以看出第二個迴圈在i%j的時間就算能夠知道不是質數的情況 下還在繼續和其他數作取模;比如6取模2不是質數,但是6還會去取模3,4,5;所以程式執行了一些不必要的東西;

下面看一下優化後的程式

public static void main(String[] args) {
        boolean flag=false;
        long start=System.currentTimeMillis();
        for(int i=2;i<=100000;i++){
            for(int j=2;j<i;j++){
                if(i%j==0){
                    flag=true;
                    break;
                }
            }
            if(flag==false){
                System.out.println(i);
            }
            flag=false;
        }
        long end=System.currentTimeMillis();
        System.out.println(end-start);//1281
    }

看一下這個變動並不大,但是起到的作用非常大,加了break;如果不是質數就跳出此迴圈了;還是可以節省很多時間的;那麼有沒有更快的呢?

    public static void main(String[] args) {
        boolean flag=false;
        long start=System.currentTimeMillis();
        for(int i=2;i<=100000;i++){
            for(int j=2;j<Math.sqrt(i);j++){
                if(i%j==0){
                    flag=true;
                    break;
                }
            }
            if(flag==false){
                System.out.println(i);
            }
            flag=false;
        }
        long end=System.currentTimeMillis();
        System.out.println(end-start);//76
    }

看一下這個又節省了將近一半的時間,所以還是很不錯的,這裡是在迴圈中加了方法Math.qrat(i)代表根號的意思,這樣程式又會節省很多不必要的運算;

還有一種方法:

public static void main(String[] args) {
        long start=System.currentTimeMillis();
        lable:for(int i=2;i<=100000;i++){
            for(int j=2;j<Math.sqrt(i);j++){
                if(i%j==0){
                    continue lable;
                }
            }
                System.out.println(i);
        }
        long end=System.currentTimeMillis();
        System.out.println(end-start);//63
    }