ความท้าทาย
ใช้ตะแกรง Sundaramn
สำหรับการหาตัวเลขที่สำคัญดังต่อไปนี้ ใช้เป็นจำนวนเต็มการป้อนข้อมูลและการส่งออกตัวเลขที่สำคัญดังต่อไปนี้n
n
คุณสามารถสันนิษฐานได้ว่าn
จะน้อยกว่าหรือเท่ากับหนึ่งล้านเสมอ
กระชอน
เริ่มต้นด้วยรายการของจำนวนเต็มจากไป
1
n
ลบตัวเลขทั้งหมดที่อยู่ในรูปแบบ
i + j + 2ij
ที่:i
และน้อยกว่าj
อยู่เสมอมากกว่าหรือเท่ากับซึ่งเป็นมากกว่าหรือเท่ากับn
j
i
1
i + j + 2ij
น้อยกว่าหรือเท่ากับn
คูณจำนวนที่เหลือและเพิ่ม
2
1
นี้จะให้ผลผลิตทั้งหมดตัวเลขที่สำคัญ (ยกเว้น2
ซึ่งควรจะรวมอยู่ในการส่งออกของคุณ) 2n + 2
น้อยกว่า
202
นี่เป็นภาพเคลื่อนไหวของตะแกรงที่ถูกใช้ในการหาช่วงเวลาดังต่อไปนี้
เอาท์พุต
ผลลัพธ์ของคุณควรเป็นจำนวนเต็มทุกตัว≤ n
(ตามลำดับจากน้อยไปหามาก) ตามด้วยบรรทัดใหม่:
2
3
5
ที่ไหนเป็นn
5
ตัวอย่าง
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
>
ปัจจัยการผลิตจะแสดงด้วย
(i,j)
ด้วยi<=j
แต่ผลลัพธ์จะไม่เปลี่ยนแปลงหากเราเพิกเฉยต่อข้อกำหนดนี้ เราสามารถทำได้เพื่อบันทึกไบต์?
i <= j
ฉันไม่เคยบอกว่าคุณจะต้องตรวจสอบว่า มันเป็นเพียงส่วนหนึ่งของการทำงานของตะแกรง ใช่คุณสามารถละไว้i <= j
ในรหัสของคุณ @xnor
2n+1
) ซึ่งไม่ใช่แบบฟอร์ม2(i + j + 2ij)+1
- เราสามารถทดสอบคุณสมบัตินี้โดยตรงกับช่วงเวลาที่เป็นไปได้หรือรหัสของเราต้องทำคูณ 2 บวก 1 ในบางจุด ?
n
กับสิ่งที่เกิดขึ้น 2 * n + 2
ในรายละเอียดของวิธีการที่มันบอกว่ามันจะสร้างจำนวนเฉพาะทั้งหมดขึ้นอยู่กับ แต่ในรายละเอียดของอินพุต / เอาต์พุตก็บอกว่าใส่เป็นและการส่งออกจำนวนเฉพาะทั้งหมดขึ้นอยู่กับn
n
ดังนั้นเราควรจะใช้วิธีการในการสร้างช่วงเวลาทั้งหมด2 * n + 2
แล้วปล่อยสิ่งที่มีขนาดใหญ่กว่าn
เอาท์พุท? หรือเราควรคำนวณn
ในคำอธิบายวิธีการจากอินพุตn
?
n=30
หายไป 29 ในผลลัพธ์