100以內所有質數的輸出


1.什么是質數?

又稱素數,只能被1和它本身整除的自然數,即除了1和它本身作為約數,沒有別的約數了。

--->從2開始到這個數-1都不能被這個數本身整除。

2.方式一:

package cn.tust.cycle;

/*
 * 輸出50000以內的質數
 * 
 * */
public class PrimeNumber {

    public static void main(String[] args) {
        
        boolean isFlag = true ;
        
        long starttime = System.currentTimeMillis();
        
        //遍歷這50000個數
        for(int i = 2;i<=50000;i++) {
            
            //質數就是只能被1和它本身整除的自然數
            for(int j=2;j<i;j++) {
                if(i%j == 0) {
                    isFlag = false;
                }
            }
            
            if(isFlag ==true) {
                System.out.println(i);
            }
        
            isFlag = true;
        }
        
        long endtime = System.currentTimeMillis();
        System.out.println("所花費的時間是:"+(endtime-starttime));

    }

}
輸出結果:所花費的時間是:5637ms

方式一中當i能夠整除某一個j時,即當isFlag第一次被賦值false的時候,就不要再進行j的循環了,可以直接進行下一次的i的循環。

2.1 優化1:
package cn.tust.cycle;

/*
 * 輸出50000以內的質數
 * 
 * */
public class PrimeNumber {

    public static void main(String[] args) {
        
        boolean isFlag = true ;
        
        long starttime = System.currentTimeMillis();
        
        //遍歷這50000個數
        for(int i = 2;i<=50000;i++) {
            
            //質數就是只能被1和它本身整除的自然數
            for(int j=2;j<i;j++) {
                if(i%j == 0) {
                    isFlag = false;
                    break; //優化1:只對非質數的自然數是有效的
                }
            }
            
            if(isFlag ==true) {
                System.out.println(i);
            }
        
            isFlag = true;
        }
        
        long endtime = System.currentTimeMillis();
        System.out.println("所花費的時間是:"+(endtime-starttime));

    }

}
輸出結果:所花費的時間是:544ms

2.2優化2:

package cn.tust.cycle;

/*
 * 輸出50000以內的質數
 * 
 * */
public class PrimeNumber {

    public static void main(String[] args) {
        
        boolean isFlag = true ;
        
        long starttime = System.currentTimeMillis();
        
        //遍歷這50000個數
        for(int i = 2;i<=50000;i++) {
            
            //質數就是只能被1和它本身整除的自然數
            for(int j=2;j<Math.sqrt(i);j++) { //優化2:對本身就是質數和不是質數的自然數都有效
                if(i%j == 0) {
                    isFlag = false;
                    break; //優化1:只對非質數的自然數是有效的
                }
            }
            
            if(isFlag ==true) {
                System.out.println(i);
            }
        
            isFlag = true;
        }
        
        long endtime = System.currentTimeMillis();
        System.out.println("所花費的時間是:"+(endtime-starttime));

    }

}
輸出結果:所花費的時間是:69ms

3.方式二:

 

public class PrimeNumberTest2 {

    public static void main(String[] args) {
        
        long startTime = System.currentTimeMillis();
        
        label:for(int i=2;i<50000;i++) {
            
            for(int j=2;j<Math.sqrt(i);i++) {
                
                if(i%j == 0) {
                    continue label;
                }
                
                System.out.println(i);
            }
        }

        long endTime = System.currentTimeMillis();
        System.out.println("所花費的時間是:"+(endTime-startTime));
    }

}

 

 

 

為什么要在內循環中將循環的次數修改為i的平方根?

解答:以97為例,當97去除以某個數的時候,那么結果很定也在2-97的這根坐標軸上,除以2的時候得到48.5,所以48之后的數就不用再去循環了,因為與48之后的數配對的都是大於1小於2的數;當除到這個數的平方根的時候,得到的結果也是這個數的平方根,當再往上除的時候,所得結果都是剛才已經配對過的數,即都是剛才的除數,所以循環只要到Math.sqrt(i)就行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM