在Java中实现质数查找算法的最佳方法是什么?我们如何制作库类并在Java中使用它们?

在Java中实现质数查找算法的最佳方法是什么?我们如何制作库类并在Java中使用它们?,java,algorithm,streaming,biginteger,class-library,Java,Algorithm,Streaming,Biginteger,Class Library,我想用Java制作库类,并在未来的程序中使用它们。我想让这些库类找到某个数甚至下一个素数的素数,或者你可以说解决大多数与素数相关的基本问题 我从未创建过Java库类。我的目标是学会这样做。请帮我指出一个教程或什么。我熟悉netbeans IDE 我发现了一些算法,比如和。如果你能指出一些更有效的算法,那就太好了。我不希望他们是最好的,但至少足够好。我的目标是通过实现它们来学习一些东西。因为我几乎没有实际的编码经验,所以我想通过它来提高我的技能 我的朋友建议我使用流类,他正在讨论如何通过将一个文件

我想用Java制作库类,并在未来的程序中使用它们。我想让这些库类找到某个数甚至下一个素数的素数,或者你可以说解决大多数与素数相关的基本问题

  • 我从未创建过Java库类。我的目标是学会这样做。请帮我指出一个教程或什么。我熟悉netbeans IDE
  • 我发现了一些算法,比如和。如果你能指出一些更有效的算法,那就太好了。我不希望他们是最好的,但至少足够好。我的目标是通过实现它们来学习一些东西。因为我几乎没有实际的编码经验,所以我想通过它来提高我的技能
  • 我的朋友建议我使用流类,他正在讨论如何通过将一个文件的输出作为另一个文件的输入来实现流类,从而使我的代码更干净。我不太了解他。如果我说错了什么,请原谅。在这一点上,我想问的是,这是一种高效且面向对象的方式来做我想做的事情。如果是,请告诉我怎么做,如果不是,请指出其他方法
  • 我有Java语言的基本知识。我想通过这次冒险获得的是编码经验,因为这里的每个人都建议我“接受像这样的小事情,自己学习”

    提前感谢大家

    问候

    沙恩沙

    编辑:
    在Eratosthenes和其他人的筛选中,我们需要在数据结构中存储从2到n的数字。我应该把它存放在哪里?我知道我可以使用动态集合,但这只是一个小问题……如果我想找到数十亿甚至更多的素数(我无疑会使用大整数),但所有这些都会存储在堆中,对吗?是否担心溢出?即使没有,这是否是一个良好的做法?或者将数字或列表(我们将根据使用的算法对其执行操作)存储在一个文件中并在那里访问会更好吗?对不起,如果我的问题太离谱了…

    “埃拉托斯提尼筛”是一个很好的算法来寻找素数。如果你使用谷歌,你可以找到。

    但是当你比较时,阿特金的筛子比埃拉托斯坦的筛子快:

    另请参阅此链接,其中清楚说明了不同的功能:)

    祝你好运

  • 没有“图书馆类”这样的东西。我想您的意思是以一种可重用的方式创建一个类。实现这一点的方法是拥有一个干净的接口——与其他库或执行环境(主类等)的绑定最少(如果有的话)

  • 你提到的两个“足够好”。为了你的目的,你不需要再看下去了

  • 只需从System.in读取并写入System.out即可。不过,就你而言,没有什么可读的


  • 为了实现我认为是您的目标,您需要编写一个包含执行环境的主类-main函数,初始化算法,迭代查找下一个素数,并将其写入System.out。当然,您需要另一个类来实现该算法。它应该包含内部状态,并提供一种查找下一个素数的方法。

    `IMO,不要认为您正在创建一个库(.jar文件,根据我对这个问题的解释)

    首先关注创建一个简单的Java类,如下所示:

    //SieveOfEratosthenes.java
      public class PrimeSieve{
        public static void main(String args[])
        {
        int N = Integer.parseInt(args[0]);
                 // initially assume all integers are prime
        boolean[] isPrime = new boolean[N + 1];
        for (int i = 2; i <= N; i++) {
            isPrime[i] = true;
        }
    
        // mark non-primes <= N using Sieve of Eratosthenes
        for (int i = 2; i*i <= N; i++) {
    
            // if i is prime, then mark multiples of i as nonprime
            // suffices to consider mutiples i, i+1, ..., N/i
            if (isPrime[i]) {
                for (int j = i; i*j <= N; j++) {
                    isPrime[i*j] = false;
                }
            }
        }
    
        // count primes
        int primes = 0;
        for (int i = 2; i <= N; i++) {
            if (isPrime[i]) primes++;
        }
        System.out.println("The number of primes <= " + N + " is " + primes);
    }
    }
    
    //sieveoferatostenes.java
    公共类素数筛{
    公共静态void main(字符串参数[])
    {
    int N=Integer.parseInt(args[0]);
    //最初假设所有整数都是素数
    布尔值[]isPrime=新布尔值[N+1];
    
    对于(int i=2;i我将对此添加一些想法:

  • 库类在技术上没有什么不同,只是如何使用它。在我看来,最重要的是你要认真考虑你的公共API。让它对你的潜在调用方有用,让它足够小,让你可以自由地改变你认为合适的内部实现,并确保你不能很好地理解你的库做什么和不做什么。不要尝试做每件事,只要做好一件事。(API通常也扩展到文档,确保你写得像样。)
  • 如果你的API设计得很好,你可以随时更改它,推出使用不同算法的1.1版(甚至使用JNI调用本机C库),您的调用者可以直接进入新的JAR并使用您的代码,而无需重新编译。不要忘记,过早的优化是万恶之源;不要太担心使您的第一个版本快速,但要专注于使其正确和干净
  • 我不知道你的朋友为什么建议使用流。流是一种处理原始字节输入和输出的方法,在读取文件或网络连接时很有用,但通常不是调用另一个Java方法的好方法。你的库不应该担心输入和输出,它只需要提供一些数值计算方法因此,您应该实现接受整数(或任何合适的)并返回整数的方法
  • 例如,您可以实现:

    /**
     * Calculates the next prime number after a given point.
     *
     * Implementation detail: callers may assume that prime numbers are
     * calculated deterministically, such that the efficiency of calling
     * this method with a large parameter is not dramatically worse than
     * calling it with a small parameter.
     *
     * @param x The lower bound (exclusive) of the prime number to return.
     * Must be strictly positive.
     * @return Colloquially, the "next" prime number after the given parameter.
     * More formally, this number will be prime and there are no prime numbers
     * less than this value and greater than <code>x</code> that are also
     * prime.
     * @throws IllegalArgumentException if <code>x</code> is not strictly
     * positive.
     */
    public long smallestPrimeGreaterThan(long x);
    
    /**
     * Returns all prime numbers within a given range, in order.
     *
     * @param lowerBound The lower bound (exclusive) of the range.
     * @param upperBound The upper bound (exclusive) of the range.
     * @return A List of the prime numbers that are strictly between the
     * given parameters.  This list is in ascending order.  The returned
     * value is never null; if no prime numbers exist within the given
     * range, then an empty list is returned.
     */
    public List<Long> primeNumbersBetween(long lowerBound, long upperBound);
    
    看不到流!流的使用,例如输出到控制台,应该由使用库的应用程序来处理,而不是库本身。这就是我在第一点中关于清楚库做什么和不做什么的意思。你只需要生成素数;然后由调用方来做一些事情l与他们一起。

    与“基本知识”