โจทย์
จำนวนเฉพาะ (prime) คือจำนวนเต็มที่มากกว่า 1 และหารลงตัวได้เฉพาะ 1 กับตัวมันเองเท่านั้น ให้บวกจำนวนเฉพาะทุกตัวที่น้อยกว่าขีดจำกัดแบบไม่รวมขีดจำกัด แม้ว่าขีดจำกัดจะเป็นจำนวนเฉพาะก็ไม่ให้นำมารวม
ให้เขียนฟังก์ชัน prime_sum(limit)
อินพุต
limit: ค่าบนสุดแบบไม่รวม (exclusive upper bound)
เอาต์พุต
ให้คืนผลรวมของจำนวนเฉพาะที่เข้าเงื่อนไข หรือคืน 0 หากไม่มีจำนวนเฉพาะใดเข้าเงื่อนไข
เงื่อนไข
0 ≤ limit ≤ 2,000,000. ให้คืนผลรวมโดยใช้จำนวนเต็ม signed 64-bit
ตัวอย่าง
อินพุต:
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
อินพุต:
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 กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน