求自然数的质数的解法和优化

一,质数的概念

  质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

二,思路

  ①需要让每个数与其前面的数(除了1和本身)进行取模比较,如果为0,则说明这个数不是质数

  ②声明一个标志flag,标志这个数是否是质数

三,代码

1,常规的让每个数据一个一个的和其前面的的数(除了1和本身)进行计算,这样时间复杂度O(n^2),耗时比较长,于是要看看能不能优化

public void primeNumTest2(){

    long start=System.currentTimeMillis();
    boolean flag=true;
    for(int i=2;i<=100;i++){
        for(int j=2;j<i;j++){
            if(i%j==0){
                flag=false;// 标志不是质数
            }
        }
        if(flag){
            System.out.println(i);
        }
        // 再次给flag 进行初始化
        flag=true;
    }
}

2,优化一:发现当两个数取模为零符合条件的时候,也就是已经确定该数字不是质数了,程序还会继续进行判断,这样增加了时间的复杂度,因此可以当发现某个数字不是质数的时候就可以终止当前循环.

public  void primeNumTest(){
        boolean flag=true;// 标志位
        // 因为除了1和本身 没有其他的因数 所以初始值从2开始 需要用到嵌套循环,外层控制每个数 内层控制每个因数
        for(int i=2;i<100;i++){
            for(int j=2;j<i;j++){
                if(i%j==0){
                    flag=false;
                    break;// 跳出当前循环
                }
            }
            if(flag){
                System.out.println(i);
            }

            flag=true;
        }
    }

3,优化二,通过数学思想发现,每个数与其前面的数(除了1和本身)进行运算的次数还可以进行优化.因为每个数都是由一个小的数字和一个较大的数字相乘而来,所以只要比较了小的数字,较大的数字就不用比

较了,因此比较每个数的前面这个数的平方根个数就可以了

public  void primeNumTest(){
        boolean flag=true;// 标志位
        // 因为除了1和本身 没有其他的因数 所以初始值从2开始 需要用到嵌套循环,外层控制每个数 内层控制每个因数
        for(int i=2;i<100;i++){
            for(int j=2;j<=Math.sqrt(i);j++){//取平方根
                if(i%j==0){
                    flag=false;
                    break;
                }
            }
            if(flag){
                System.out.println(i);
            }

            flag=true;
        }
    }

 

posted @ 2020-05-30 18:07  不吃布丁的鸿儒思密达  阅读(297)  评论(0)    收藏  举报