ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

100以内所有质数的输出

2019-09-29 13:00:59  阅读:378  来源: 互联网

标签:50000 输出 以内 质数 isFlag 循环 100 public


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:
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:

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

为什么要在内循环中将循环的次数修改为i的平方根?

解答:以97为例,当97去除以某个数的时候,那么结果很定也在2-97的这根坐标轴上,除以2的时候得到48.5,所以48之后的数就不用再去循环了,因为与48之后的数配对的都是大于1小于2的数;当除到这个数的平方根的时候,得到的结果也是这个数的平方根,当再往上除的时候,所得结果都是刚才已经配对过的数,即都是刚才的除数,所以循环只要到Math.sqrt(i)就行。

 

标签:50000,输出,以内,质数,isFlag,循环,100,public
来源: https://www.cnblogs.com/wsxdev/p/11606990.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有