วิธีใดที่สวยงามที่สุดในการใช้ฟังก์ชันนี้:
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;
}
ฉันไม่กังวลเกี่ยวกับความเร็วมากเกินไปแม้ว่าฉันไม่ต้องการให้มันไร้ประสิทธิภาพอย่างเห็นได้ชัด ฉันไม่สนใจว่าจะใช้วิธีไหน (ไร้เดียงสาหรือตะแกรงหรืออย่างอื่น) แต่ฉันต้องการให้มันค่อนข้างสั้นและชัดเจนว่ามันทำงานอย่างไร
แก้ไข : ขอบคุณทุกคนที่ตอบกลับแม้ว่าหลายคนจะไม่ตอบคำถามที่แท้จริงของฉัน เพื่อย้ำอีกครั้งว่าฉันต้องการโค้ดที่สะอาดและสร้างรายการจำนวนเฉพาะ ฉันรู้วิธีทำหลายวิธีแล้ว แต่ฉันมักจะเขียนโค้ดไม่ชัดเจนเท่าที่ควร ในหัวข้อนี้มีการเสนอตัวเลือกที่ดีบางประการ:
- รุ่นที่ดีกว่าเดิมของสิ่งที่ฉันมี (Peter Smit, jmservera และ Rekreativc)
- การใช้ตะแกรง Eratosthenes ที่สะอาดมาก (starblue)
- ใช้ Java ของ
BigInteger
s และnextProbablePrime
สำหรับโค้ดที่ง่ายมากแม้ว่าฉันจะนึกไม่ออกว่ามันจะมีประสิทธิภาพเป็นพิเศษ (dfa) - ใช้ LINQ เพื่อสร้างรายการราคา (Maghis) อย่างเกียจคร้าน
- ใส่ข้อความจำนวนมากในไฟล์ข้อความและอ่านเมื่อจำเป็น (ดาริน)
แก้ไข 2 : ฉันได้ใช้ C #สองวิธีที่ระบุไว้ที่นี่และอีกวิธีหนึ่งที่ไม่ได้กล่าวถึงที่นี่ พวกเขาทั้งหมดค้นหาn primes แรกได้อย่างมีประสิทธิภาพ (และฉันมีวิธีการที่ดีในการหาขีด จำกัด ที่จะให้กับ sieves)