什么是实现此功能的最佳方法:
ArrayList generatePrimes(int n)
此函数生成第一个n
素数(edit: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(starblue)筛子的实现
- 使用Java
BigInteger
和nextProbablePrime
编写非常简单的代码,尽管我无法想象它特别有效(dfa) - 使用LINQ延迟生成素数列表(Maghis)
- 在文本文件中放入很多素数,并在必要时读入(普通话)
编辑2:我已经在C#中实现了此处给出的几种方法,以及此处未提及的另一种方法。他们都有效地找到了前n个素数(而且我有一种体面的方法来确定要提供给筛子的极限值)。