กลับไปยังโจทย์
ปานกลาง 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

ผลรวมของจำนวนเฉพาะที่น้อยกว่าขีดจำกัด

บวกจำนวนเฉพาะทั้งหมดที่น้อยกว่าขีดจำกัดแบบไม่รวมขีดจำกัด

สิ่งที่คุณจะได้เรียนรู้

  • หาจำนวนเฉพาะทั้งหมดที่ต่ำกว่าขีดจำกัดด้วยตะแกรง
  • ทำเครื่องหมายพหุคูณแทนการตรวจทีละตัว
  • รวมค่าอย่างมีประสิทธิภาพ

โจทย์

จำนวนเฉพาะ (prime) คือจำนวนเต็มที่มากกว่า 1 และหารลงตัวได้เฉพาะ 1 กับตัวมันเองเท่านั้น ให้บวกจำนวนเฉพาะทุกตัวที่น้อยกว่าขีดจำกัดแบบไม่รวมขีดจำกัด แม้ว่าขีดจำกัดจะเป็นจำนวนเฉพาะก็ไม่ให้นำมารวม

ให้เขียนฟังก์ชัน prime_sum(limit)

อินพุต

limit: ค่าบนสุดแบบไม่รวม (exclusive upper bound)

เอาต์พุต

ให้คืนผลรวมของจำนวนเฉพาะที่เข้าเงื่อนไข หรือคืน 0 หากไม่มีจำนวนเฉพาะใดเข้าเงื่อนไข

เงื่อนไข

0 ≤ limit ≤ 2,000,000. ให้คืนผลรวมโดยใช้จำนวนเต็ม signed 64-bit

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
limit = 12

ผลลัพธ์ที่คาดหวัง:
expected = 28
อินพุต:
long long limit = 12;

ผลลัพธ์ที่คาดหวัง:
long long expected = 28;
อินพุต:
long limit = 12;

ผลลัพธ์ที่คาดหวัง:
long expected = 28;

คำอธิบาย

จำนวนเฉพาะที่น้อยกว่า 12 ได้แก่ 2, 3, 5, 7 และ 11; ผลรวมคือ 28

ตัวอย่างที่ 2
อินพุต:
limit = 2

ผลลัพธ์ที่คาดหวัง:
expected = 0
อินพุต:
long long limit = 2;

ผลลัพธ์ที่คาดหวัง:
long long expected = 0;
อินพุต:
long limit = 2;

ผลลัพธ์ที่คาดหวัง:
long expected = 0;

คำอธิบาย

ไม่มีจำนวนเฉพาะใดที่น้อยกว่า 2

แนวทางการแก้

ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ

คำใบ้ 1

ต้นทุนหลักคือการหาจำนวนเฉพาะให้มีประสิทธิภาพ; การเช็กหารแบบง่ายกับทุกจำนวนจะช้าเกินไป

คำใบ้ 2

ใช้วิธีคล้าย sieve เพื่อทำเครื่องหมายจำนวนประกอบ แล้วบวกเฉพาะจำนวนที่ยังไม่ถูกทำเครื่องหมายและต่ำกว่าขีดจำกัด

คำใบ้ 3

จำไว้ว่าขีดจำกัดเองไม่นับรวม แม้จะเป็นจำนวนเฉพาะก็ตาม และค่าขีดจำกัดเล็กๆ อาจไม่มีอะไรให้บวก

ความซับซ้อนที่คาดหวัง

เวลา O(limit log log limit), หน่วยความจำเพิ่ม O(limit)

แหล่งอ้างอิง

โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก