zoukankan      html  css  js  c++  java
  • 寻找素数

    题干

    找到n以内的所有素数

    方法一:穷举法

    找10000以内的素数

    package Important;
    
    public class primeSieve {
    
        public static void printNum(int[] num,int count){
            int length=num.length;
            for(int i=0;i<count;i++){
                System.out.println(num[i]);
            }
        }
    
        public static void primeSelect(int num){
            int[] res=new int[num+1];
            int count=0;
            res[0]=2;
            count++;
            for(int i=3;i<=num;i++){
                int flag=0;
                for(int j=2;j<i;j++){
                    if(i%j==0){
                        flag=1;
                    }
                }
                if(flag==0){
                    res[count++]=i;
                }
            }
            printNum(res,count);
        }
    
        public static void main(String[] args){
            primeSelect(10000);
        }
    }

    我们给这个函数加上时间监控

    public static void primeSelect1(int num){
            Long startTime = System.currentTimeMillis();
            int[] res=new int[num+1];
            int count=0;
            res[0]=2;
            count++;
            for(int i=3;i<=num;i++){
                int flag=0;
                for(int j=2;j<i;j++){
                    if(i%j==0){
                        flag=1;
                    }
                }
                if(flag==0){
                    res[count++]=i;
                }
            }
            printNum(res,count);
            Long endTime = System.currentTimeMillis();
            Long tempTime = (endTime - startTime);
            System.out.println("共找到"+count+"个"+"花费时间:"+
                    (((tempTime/86400000)>0)?((tempTime/86400000)+"d"):"")+
                    ((((tempTime/86400000)>0)||((tempTime%86400000/3600000)>0))?((tempTime%86400000/3600000)+"h"):(""))+
                    ((((tempTime/3600000)>0)||((tempTime%3600000/60000)>0))?((tempTime%3600000/60000)+"m"):(""))+
                    ((((tempTime/60000)>0)||((tempTime%60000/1000)>0))?((tempTime%60000/1000)+"s"):(""))+
                    ((tempTime%1000)+"ms"));
        }

     

    方法二:改进的穷举法

    将除数的最大值调为被除数的值的一半。当n的范围比较大的时候就可以明显发现时间节约了,我们现在来输出每个函数处理的时间

    n=10000时

    public static void primeSelect2(int num){
            Long startTime = System.currentTimeMillis();
            int[] res=new int[num+1];
            int count=0;
            res[0]=2;
            res[1]=3;
            res[2]=5;
            count=3;
            for(int i=7;i<=num;i++){
                int flag=0;
                for(int j=2;j<i/2;j++){
                    if(i%j==0){
                        flag=1;
                    }
                }
                if(flag==0){
                    res[count++]=i;
                }
            }
            printNum(res,count);
            Long endTime = System.currentTimeMillis();
            Long tempTime = (endTime - startTime);
            System.out.println("花费时间:"+
                    (((tempTime/86400000)>0)?((tempTime/86400000)+"d"):"")+
                    ((((tempTime/86400000)>0)||((tempTime%86400000/3600000)>0))?((tempTime%86400000/3600000)+"h"):(""))+
                    ((((tempTime/3600000)>0)||((tempTime%3600000/60000)>0))?((tempTime%3600000/60000)+"m"):(""))+
                    ((((tempTime/60000)>0)||((tempTime%60000/1000)>0))?((tempTime%60000/1000)+"s"):(""))+
                    ((tempTime%1000)+"ms"));
        }

    方法三:线性素数筛

    tmp遍历从2到n之间的所有非0数,以tmp为基点,到n之间的tmp的倍数全部置为0,剩下的筛选出来非0的就是素数

    public static void primeSelect3(int n){
            Long startTime = System.currentTimeMillis();
            int count=0;
            int[] num=new int[n+1];
            for(int i=2;i<=n;i++){
                num[i]=i;
            }
            for(int i=2;i<n/2;i++){
                int tmp=num[i];
                if(tmp!=0){
                    for(int j=2*tmp;j<=n;j+=tmp){
                        num[j]=0;
                    }
                }
            }
            for(int i=0;i<n+1;i++){
                if(num[i]!=0){
                    count++;
                    System.out.println(num[i]);
                }
            }
            Long endTime = System.currentTimeMillis();
            Long tempTime = (endTime - startTime);
            System.out.println("共找到"+count+"个"+"花费时间:"+
                    (((tempTime/86400000)>0)?((tempTime/86400000)+"d"):"")+
                    ((((tempTime/86400000)>0)||((tempTime%86400000/3600000)>0))?((tempTime%86400000/3600000)+"h"):(""))+
                    ((((tempTime/3600000)>0)||((tempTime%3600000/60000)>0))?((tempTime%3600000/60000)+"m"):(""))+
                    ((((tempTime/60000)>0)||((tempTime%60000/1000)>0))?((tempTime%60000/1000)+"s"):(""))+
                    ((tempTime%1000)+"ms"));
        }

  • 相关阅读:
    placeholder这个属性 input
    使用jqprint插件实现打印页面内容
    HTML用JS导出Excel的五种方法
    项目兼容ie8技术要点
    JS设置cookie、读取cookie、删除cookie
    实战WCF中net.tcp和net.msmq绑定协议
    KO工作原理及带来的好处
    jQuery验证控件jquery.validate.js使用说明+中文API(转)
    将datatable导出为excel的三种方式(转)
    javascript面试题(一)(转载)
  • 原文地址:https://www.cnblogs.com/ak918xp/p/14342635.html
Copyright © 2011-2022 走看看