Cách thanh lịch nhất để triển khai chức năng này là gì:
ArrayList generatePrimes(int n)
Hàm này tạo ra các n
số nguyên tố đầu tiên (sửa: where n>1
), vì vậy generatePrimes(5)
sẽ trả về một ArrayList
với {2, 3, 5, 7, 11}
. (Tôi đang làm điều này bằng C #, nhưng tôi hài lòng với việc triển khai Java - hoặc bất kỳ ngôn ngữ tương tự nào khác cho vấn đề đó (không phải Haskell)).
Tôi biết cách viết hàm này, nhưng khi tôi làm nó vào đêm qua, nó không tốt đẹp như tôi hy vọng. Đây là những gì tôi nghĩ ra:
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;
}
Tôi không quá quan tâm đến tốc độ, mặc dù tôi không muốn nó rõ ràng là không hiệu quả. Tôi không bận tâm về phương pháp nào được sử dụng (ngây thơ hoặc sàng lọc hoặc bất cứ điều gì khác), nhưng tôi muốn nó khá ngắn gọn và rõ ràng về cách thức hoạt động.
Chỉnh sửa : Cảm ơn tất cả những người đã trả lời, mặc dù nhiều người đã không trả lời câu hỏi thực sự của tôi. Để nhắc lại, tôi muốn một đoạn mã sạch đẹp tạo ra một danh sách các số nguyên tố. Tôi đã biết cách thực hiện nhiều cách khác nhau, nhưng tôi thường viết mã không rõ ràng như nó có thể. Trong chủ đề này, một số phương án tốt đã được đề xuất:
- Một phiên bản đẹp hơn của những gì tôi có ban đầu (Peter Smit, jmservera và Rekreativc)
- Cách thực hiện rất sạch sẽ của sàng Eratosthenes (màu xanh sao)
- Sử dụng Java
BigInteger
vànextProbablePrime
cho mã rất đơn giản, mặc dù tôi không thể tưởng tượng nó đặc biệt hiệu quả (dfa) - Sử dụng LINQ để tạo danh sách các số nguyên tố (Maghis) một cách lười biếng
- Đặt nhiều số nguyên tố trong một tệp văn bản và đọc chúng khi cần thiết (darin)
Chỉnh sửa 2 : Tôi đã triển khai trong C # một vài phương thức được đưa ra ở đây và một phương pháp khác không được đề cập ở đây. Tất cả họ đều tìm thấy n số nguyên tố đầu tiên một cách hiệu quả (và tôi có một phương pháp tốt để tìm giới hạn cung cấp cho các sàng).