实现这个函数最优雅的方式是什么:
ArrayList generatePrimes(int n)
这个函数生成第一个 n
质数(编辑: 其中 n>1
) ,因此 generatePrimes(5)
将返回一个 ArrayList
和 {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;
}
我不太在意速度,尽管我不想让它显得效率低下。我不介意使用哪种方法(幼稚的、筛选的或者其他的) ,但是我确实希望它的工作原理相当简短明了。
编辑 : 感谢所有回应我的人,尽管很多人没有回答我的问题。重申一下,我需要一段干净漂亮的代码来生成素数列表。我已经知道了很多不同的方法,但是我倾向于编写不那么清晰的代码。在这方面,提出了一些不错的选择:
BigInteger
和 nextProbablePrime
,尽管我无法想象它会特别有效(dfa)编辑2 : 这里给出了 在 C # 中实现的几个方法,这里没有提到另一个方法。它们都能有效地找到第一个 N素数(我有一个 不错的方法,可以找到提供给筛子的极限)。