Bu işlevi uygulamanın en şık yolu nedir:
ArrayList generatePrimes(int n)
Bu işlev ilk n
asal sayıları üretir (düzenleme: nerede n>1
), bu nedenlegeneratePrimes(5)
bir ArrayList
with döndürür {2, 3, 5, 7, 11}
. (Bunu C # ile yapıyorum, ancak bir Java uygulamasından - veya bu konuda benzer başka bir dilden (yani Haskell değil) memnunum).
Bu işlevi nasıl yazacağımı biliyorum ama dün gece yaptığımda umduğum kadar güzel olmadı. İşte bulduğum şey:
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;
}
Açıkça verimsiz olmasını istemesem de hız konusunda çok endişelenmiyorum. Hangi yöntemin kullanıldığına aldırmıyorum (naif veya elek veya başka herhangi bir şey), ancak oldukça kısa olmasını ve nasıl çalıştığını açık olmasını istiyorum.
Düzenle : Yanıtlayan herkese teşekkürler, ancak çoğu asıl sorumu yanıtlamadı. Tekrarlamak gerekirse, asal sayıların bir listesini oluşturan güzel ve temiz bir kod parçası istedim. Bunu birçok farklı şekilde nasıl yapacağımı zaten biliyorum, ancak olabileceği kadar net olmayan bir kod yazma eğilimindeyim. Bu ileti dizisinde birkaç iyi seçenek önerilmiştir:
- Başlangıçta sahip olduğumun daha güzel bir versiyonu (Peter Smit, jmservera ve Rekreativc)
- Eratosthenes (starblue) eleğinin çok temiz bir uygulaması
- Java'nın
BigInteger
venextProbablePrime
çok basit bir kod için , ancak özellikle verimli olduğunu hayal edemiyorum (dfa) - Asalların listesini (Maghis) tembel olarak oluşturmak için LINQ kullanın
- Bir metin dosyasına çok sayıda asal koyun ve gerektiğinde bunları okuyun (darin)
Düzenleme 2 : C # ' da burada verilen yöntemlerden birkaçını ve burada bahsedilmeyen başka bir yöntemi uyguladım . Hepsi ilk n primeri etkili bir şekilde bulur (ve eleklere sağlamak için sınırı bulmak için iyi bir yöntemim var ).