zoukankan      html  css  js  c++  java
  • 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)就行。

  • 相关阅读:
    Day 09 文件处理
    Day 08 字符编码
    day 07 猜年龄
    Day 07 元组/字典/集合/python深浅拷贝
    Day 06 猜年龄/三级菜单
    并发编程-Atomic的compareAndSet
    并发编程-多线程共享变量不安全
    Spring boot Junit单元测试回滚
    Java 不区分大小写比较字符串
    IDEA 设置html 和js热发布
  • 原文地址:https://www.cnblogs.com/wsxdev/p/11606990.html
Copyright © 2011-2022 走看看