在Java中实现质数查找算法的最佳方法是什么?我们如何制作库类并在Java中使用它们?
我想用Java制作库类,并在未来的程序中使用它们。我想让这些库类找到某个数甚至下一个素数的素数,或者你可以说解决大多数与素数相关的基本问题在Java中实现质数查找算法的最佳方法是什么?我们如何制作库类并在Java中使用它们?,java,algorithm,streaming,biginteger,class-library,Java,Algorithm,Streaming,Biginteger,Class Library,我想用Java制作库类,并在未来的程序中使用它们。我想让这些库类找到某个数甚至下一个素数的素数,或者你可以说解决大多数与素数相关的基本问题 我从未创建过Java库类。我的目标是学会这样做。请帮我指出一个教程或什么。我熟悉netbeans IDE 我发现了一些算法,比如和。如果你能指出一些更有效的算法,那就太好了。我不希望他们是最好的,但至少足够好。我的目标是通过实现它们来学习一些东西。因为我几乎没有实际的编码经验,所以我想通过它来提高我的技能 我的朋友建议我使用流类,他正在讨论如何通过将一个文件
在Eratosthenes和其他人的筛选中,我们需要在数据结构中存储从2到n的数字。我应该把它存放在哪里?我知道我可以使用动态集合,但这只是一个小问题……如果我想找到数十亿甚至更多的素数(我无疑会使用大整数),但所有这些都会存储在堆中,对吗?是否担心溢出?即使没有,这是否是一个良好的做法?或者将数字或列表(我们将根据使用的算法对其执行操作)存储在一个文件中并在那里访问会更好吗?对不起,如果我的问题太离谱了…“埃拉托斯提尼筛”是一个很好的算法来寻找素数。如果你使用谷歌,你可以找到。但是当你比较时,阿特金的筛子比埃拉托斯坦的筛子快: 另请参阅此链接,其中清楚说明了不同的功能:) 祝你好运
为了实现我认为是您的目标,您需要编写一个包含执行环境的主类-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与他们一起。与“基本知识”