Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 407|回复: 0

[算法学习]看看别人是怎样求质数的!

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-1 00:00:24 | 显示全部楼层 |阅读模式
    一、利用BitSet(筛法)
    1. import java.util.*;
    2. public class BitSetTest{
    3.    public static void main(String[] args){
    4.       BitSet sieve=new BitSet(1024);
    5.       int size=sieve.size();
    6.       for(int i=2;i< size;i++)
    7.            sieve.set(i);
    8.       int finalBit=(int)Math.sqrt(sieve.size());
    9.       
    10.       for(int i=2;i< finalBit;i++)
    11.          if(sieve.get(i))
    12.            for(int j=2*i;j< size;j+=i)
    13.                sieve.clear(j);
    14.       
    15.       int counter=0;
    16.       for(int i=1;i< size;i++){
    17.           if(sieve.get(i)){
    18.              System.out.printf("%5d",i);
    19.              if(++counter%15==0)
    20.                 System.out.println();
    21.           }
    22.        }
    23.     }
    24. }
    复制代码

      
       
       
       

       
      

      C:java>java BitSetTest
    2   3   5   7   11  13  17  19  23  29  31  37  41  43  47
    53  59  61  67  71  73  79  83  89  97  101 103 107 109 113
    127 131 137 139 149 151 157 163 167 173 179 181 191 193 197
    199 211 223 227 229 233 239 241 251 257 263 269 271 277 281
    283 293 307 311 313 317 331 337 347 349 353 359 367 373 379
    383 389 397 401 409 419 421 431 433 439 443 449 457 461 463
    467 479 487 491 499 503 509 521 523 541 547 557 563 569 571
    577 587 593 599 601 607 613 617 619 631 641 643 647 653 659
    661 673 677 683 691 701 709 719 727 733 739 743 751 757 761
    769 773 787 797 809 811 821 823 827 829 839 853 857 859 863
    877 881 883 887 907 911 919 929 937 941 947 953 967 971 977
    983 991 997 1009 1013 1019 1021
    C:java>
      二、  一个计算质数的Java程序 (作者:cindyruiwei)
          这个Java程序用来计算质数,基本原理就是判断整除,用一个ArrayList记录已知的质数,一开始放入3,5,7,11,13,17,19,23,29,然后从31开始对奇数进行for(int n=31; ;n+=2)循环,对每个待判断的n,用已知的质数依次判断是否能整除,如果得到一个新的质数,就把它放到ArrayList中。       特殊之处在于,我把它实现了序列化,每次启动时可以恢复到上次的状态,还可以把所有质数导出到文件,每4byte是一个质数,从小到大排列。我用这个程序计算了100,000个质数,算到的最大的质数是1299709,下面是源代码: import java.io.*;
    import java.util.*;
    public class PrimeNumber implements Serializable
    {
        private ArrayList list;
        private int nStart;
       public PrimeNumber()
        {
            list=new ArrayList(9);
            list.add(new Integer(3));
            list.add(new Integer(5));
            list.add(new Integer(7));
            list.add(new Integer(11));
            list.add(new Integer(13));
            list.add(new Integer(17));
            list.add(new Integer(19));
            list.add(new Integer(23));
            list.add(new Integer(29));
            nStart=31;
        }
        public void calculate(int number)
        {
            System.out.print("Start calculating prime numbers... ");
            if (number<=0)
                return;
            list.ensureCapacity(number);
            int nGot=0;
            boolean bPrime;
            int n;
            for(int nTest=nStart; ; nTest+=2)
            {
                bPrime=true;
                for(int i=0; i< list.size(); i++)
                {
                    n=((Integer)(list.get(i))).intValue();
                    if (nTest % n == 0)
                    // not a prime number:
                    {
                        bPrime=false;
                        break;
                    }
                }
                if (bPrime) // found a prime number
                {
                    list.add(new Integer(nTest));
                    nGot++;
                    System.out.print("
    Found "+nTest+", "+(number-nGot)+" left.");
                    if (nGot==number) // ok, finish calculation.
                    {
                        nStart=nTest+2;
                        System.out.println("
    done.
    ");
                        return;
                    }
                }
            }
        }
        public static boolean store(PrimeNumber obj)
        {
            ObjectOutputStream objOut = null;
            try
            {
                objOut=new ObjectOutputStream(new FileOutputStream("prime.obj"));
                objOut.writeObject(obj);
                return true;
            }
            catch(Exception e) {}
            finally {
                if(objOut!=null) {
                    try { objOut.close(); } catch(Exception e) {}
                }
            }
            return false;
        }
        public static PrimeNumber load()
        {
            try
            {
                ObjectInput objIn=new ObjectInputStream(new FileInputStream("prime.obj"));
                PrimeNumber pn=(PrimeNumber)objIn.readObject();
                objIn.close();
                return pn;
            }
            catch(Exception e)
            {
            }
            return null;
        }
        public void display()
        {
            System.out.print("
    There are " + (list.size()+1) + " prime numbers.
    2        ");
            for(int i=0; i< list.size(); i++)
            {
                System.out.print(list.get(i).toString());
                System.out.print("        ");
            }
            System.out.println("
    ");
        }
        public void displayLast()
        {
            int nStart=list.size()-20;
            System.out.println("
    The last 20 prime numbers:");
            if(nStart<0)
                System.out.print("2        ");
            for(int i=nStart; i< list.size(); i++)
            {
                if (i>=0)
                    System.out.print(list.get(i).toString()+"        ");
            }
            System.out.println("
    ");
        }
       public void storeAsFile()
        {
            DataOutputStream dos = null;
            try {
                dos = new DataOutputStream(new BufferedOutputStream(
                      new FileOutputStream("prime.data")));
                dos.writeInt(2);
                for(int i=0; i< list.size(); i++) {
                    dos.writeInt(((Integer)list.get(i)).intValue());
                }
                System.out.println("Prime numbers has been saved.
    ");
            }
            catch(Exception e) {
                System.out.println("There is an error occured. Saving failed.
    ");
            }
            finally {
                if(dos!=null) {
                    try { dos.close(); } catch(Exception e) {}
                }
            }
        }
        public static void main(String[] args)
        {
            // first try to read from disk:
            System.out.print("Reading from file... ");
            PrimeNumber pn=PrimeNumber.load();
            if (pn==null)
            {
                System.out.println("failed.
    Create a new calculator... done.");
                pn=new PrimeNumber();
            }
            else
                System.out.println("done.");
            int sel;
            do
            {
                System.out.println("==============================================================");
                sel=pn.getCommand();
                switch(sel)
                {
                    case 1:
                        pn.calculate(10);
                        break;
                    case 2:
                        pn.calculate(100);
                        break;
                    case 3:
                        pn.calculate(1000);
                        break;
                    case 4:
                        pn.calculate(10000);
                        break;
                    case 5:
                        pn.display();
                        break;
                    case 6:
                        pn.displayLast();
                        break;
                    case 7:
                        pn.storeAsFile();
                        break;
                    case 8:
                        break;
                    default:
                        System.out.println("Invalid command.");
                }
            }while(sel!=8);
            System.out.print("
    Writing to file... ");
            System.out.println(PrimeNumber.store(pn)==true?"done.":"failed.");
        }
        public int getCommand()
        {
            System.out.println("  Total "+(list.size()+1)+" prime numbers calculated. Select:");
            System.out.println("    1. Calculate next 10 prime numbers.");
            System.out.println("    2. Calculate next 100 prime numbers.");
            System.out.println("    3. Calculate next 1000 prime numbers.");
            System.out.println("    4. Calculate next 10000 prime numbers.");
            System.out.println("    5. Display all prime numbers.");
            System.out.println("    6. Display the last 20 numbers.");
            System.out.println("    7. Save all prime numbers as a file.");
            System.out.println("    8. Save all prime numbers and quit.");
            System.out.print  ("  Your selection: ");
            int sel=0;
            try
            {
                InputStreamReader isr=new InputStreamReader(System.in);
                sel=isr.read()-48;
            }
            catch(IOException e){}
            return sel;
        }
    }
    [/code] 下面是一次运行的部分结果:
    ==============================================================
    Total 110 prime numbers calculated. Select:
    1. Calculate next 10 prime numbers.
    2. Calculate next 100 prime numbers.
    3. Calculate next 1000 prime numbers.
    4. Calculate next 10000 prime numbers.
    5. Display all prime numbers.
    6. Display the last 20 numbers.
    7. Save all prime numbers as a file.
    8. Save all prime numbers and quit.
    Your selection: 5 There are 110 prime numbers.
    2     3     5     7    11   13   17   19   23  29
    31   37   41   43   47   53   59   61   67  71
    73   79   83   89   97  101 103 107 109 113
    127 131 137 139 149 151 157 163 167 173
    179 181 191 193 197 199 211 223 227 229
    233 239 241 251 257 263 269 271 277 281
    283 293 307 311 313 317 331 337 347 349
    353 359 367 373 379 383 389 397 401 409
    419 421 431 433 439 443 449 457 461 463
    467 479 487 491 499 503 509 521 523 541
    547 557 563 569 571 577 587 593 599 601
      ==============================================================
    Total 110 prime numbers calculated. Select:
    1. Calculate next 10 prime numbers.
    2. Calculate next 100 prime numbers.
    3. Calculate next 1000 prime numbers.
    4. Calculate next 10000 prime numbers.
    5. Display all prime numbers.
    6. Display the last 20 numbers.
    7. Save all prime numbers as a file.
    8. Save all prime numbers and quit.
    Your selection:
      三、第三个程序 作者:wolfigo

    /*个人认为比较经典的一段求任意范围质数的小程序*/
    /*布尔数组isPrime[],其中的元素为true时,表示为质数*/
    /*
        Demo Test Data: 打印1-10之间的数是否是质数
               测试结果:  false, true, true, false, true, false, true, false, false, false
                        (  1      2      3     4      5     6     7     8      9       10  )
        其它范围的测试结果以此类推。
    */
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    public class Sieve
    {
        private static boolean[] sieve(int range)
        {
            boolean[] isPrime = new boolean[range + 1];
            for (int i = 1; i < isPrime.length; i++)
            {
                isPrime = true;
            }
            isPrime[1] = false;
            int n = (int) Math.ceil(Math.sqrt(range));
            for (int j = 1; j <= n; j++)
            {
                if (isPrime[j])
                {
                    for (int k = 2 * j; k <= range; k += j)
                    {
                        isPrime[k] = false;
                    }
                }
            }
            return isPrime;
        }
        private static int findLargest(boolean[] isPrime)
        {
            int largest = isPrime.length - 1;
            for (; !isPrime[largest]; largest--);
            
            return largest;
        }
        public static void main(String[] args)
        {
            BufferedReader input = new BufferedReader(new InputStreamReader(
                    System.in));
            int param = 0;
            try
            {
                param = Integer.parseInt(input.readLine());
            }
            catch (NumberFormatException e)
            {
                System.out.println("Invalid Argument.");
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            boolean[] isPrime = sieve(param);
            for (int i = 1; i < isPrime.length; i++)
            {
                System.out.print(isPrime + ", ");
            }
            
            System.out.println();
            System.out.println(findLargest(isPrime));
        }
    }

    [/code]

      
      
       
       

         
       

         
       
      
       

      



                            function TempSave(ElementID)
                            {
                                    CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value);
                                    CommentsPersistDiv.save("CommentXMLStore");
                            }
                            function Restore(ElementID)
                            {
                                    CommentsPersistDiv.load("CommentXMLStore");
                                    document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent");
                            }
                   
                      











    源码下载:http://file.javaxxz.com/2014/11/1/000023937.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 17:03 , Processed in 0.364326 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表