Was ist der eleganteste Weg, um diese Funktion zu implementieren:
ArrayList generatePrimes(int n)
Diese Funktion generiert die ersten n
Primzahlen (edit: where n>1
) und gibt daher generatePrimes(5)
ein ArrayList
with zurück {2, 3, 5, 7, 11}
. (Ich mache das in C #, aber ich bin zufrieden mit einer Java-Implementierung - oder einer anderen ähnlichen Sprache (also nicht Haskell)).
Ich weiß, wie man diese Funktion schreibt, aber als ich sie letzte Nacht gemacht habe, war sie nicht so schön, wie ich es mir erhofft hatte. Folgendes habe ich mir ausgedacht:
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;
}
Ich mache mir keine allzu großen Sorgen um die Geschwindigkeit, obwohl ich nicht möchte, dass sie offensichtlich ineffizient ist. Es macht mir nichts aus, welche Methode verwendet wird (naiv oder Sieb oder irgendetwas anderes), aber ich möchte, dass es ziemlich kurz und offensichtlich ist, wie es funktioniert.
Edit : Danke an alle, die geantwortet haben, obwohl viele meine eigentliche Frage nicht beantwortet haben. Um es noch einmal zu wiederholen, ich wollte einen schönen, sauberen Code, der eine Liste von Primzahlen generiert. Ich weiß bereits, wie man es auf verschiedene Arten macht, aber ich neige dazu, Code zu schreiben, der nicht so klar ist, wie er sein könnte. In diesem Thread wurden einige gute Optionen vorgeschlagen:
- Eine schönere Version von dem, was ich ursprünglich hatte (Peter Smit, jmservera und Rekreativc)
- Eine sehr saubere Umsetzung des Siebsosthenes (Sternenblau)
- Verwenden Sie Java
BigInteger
undnextProbablePrime
für sehr einfachen Code, obwohl ich mir nicht vorstellen kann, dass er besonders effizient ist (dfa). - Verwenden Sie LINQ, um die Liste der Primzahlen (Maghis) träge zu erstellen.
- Fügen Sie viele Primzahlen in eine Textdatei ein und lesen Sie sie bei Bedarf ein.
Bearbeiten 2 : Ich habe in C # einige der hier angegebenen Methoden und eine andere hier nicht erwähnte Methode implementiert . Sie alle finden die ersten n Primzahlen effektiv (und ich habe eine anständige Methode , um die Grenze für die Siebe zu finden).