最优雅的方式来生成素数
实现此功能的最佳方式是什么:
ArrayList generatePrimes(int n)
此函数生成第一个n
素数(编辑:where n>1
),因此generatePrimes(5)
将返回ArrayList
with {2, 3, 5, 7, 11}
。(我在C#中这样做,但我很高兴Java实现 - 或任何其他类似的语言(所以不是Haskell))。
我知道怎么写这个函数,但是当我昨晚做的时候它并没有像我希望的那样结束。这是我想出的:
ArrayList generatePrimes(int toGenerate){ ArrayList primes = new ArrayList(); primes.Add(2); primes.Add(3); while (primes.Count < toGenerate) { int nextPrime = (int)(primes[primes.Count - 1]) + 2; while (true) { bool isPrime = true; foreach (int n in primes) { if (nextPrime % n == 0) { isPrime = false; break; } } if (isPrime) { break; } else { nextPrime += 2; } } primes.Add(nextPrime); } return primes;}
我并不太关心速度,虽然我不希望它显然效率低下。我不介意使用哪种方法(天真或筛子或其他任何方法),但我确实希望它相当简短明显,它是如何工作的。
编辑:感谢所有回复的人,尽管许多人没有回答我的实际问题。重申一下,我想要一个非常干净的代码片段来生成素数列表。我已经知道如何以不同的方式做到这一点,但我很容易编写尽可能不清晰的代码。在这个主题中,提出了一些很好的选择:
我最初拥有的更好的版本(Peter Smit,jmservera和Rekreativc)
Eratosthenes(星蓝)筛的非常干净的实施
使用Java BigInteger
和nextProbablePrime
非常简单的代码,虽然我无法想象它特别有效(dfa)
使用LINQ懒惰地生成素数列表(Maghis)
将大量素数放入文本文件中并在必要时读取(darin)
繁花不似锦
慕容3067478
鸿蒙传说
相关分类