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)就行。

posted @ 2019-09-29 12:55  NewBBBB  阅读(1657)  评论(0编辑  收藏  举报