คือว่าผมได้มายังงี้แล้ว แต่มันไม่ยอมขึ้น จำนวนตั้งแต่ 2,3,5,7อ่ะคับ
o = []
n= input("Number:")
for i in range (1,n) :
if i % 2 != 0 and i % 3 != 0 and i % 5 != 0 and i % 7 != 0 :
o.append(i)
print o
print len(o)
*****เอ่อคือว่าถ้าให้ใช้ raw_inputได้จาดีมาเลยคับ******
******ขอบคุณคับ*******
ง่ายสุดก็เช็คตั้งแต่ 2 จนถึง รากที่2ของจำนวนนั้น
ไม่ก็เซ็คตั้งแต่ 1 ถึงตัวมัน เองว่า มีตัวหารลงตัวแค่2 ตัว
หรือ ไม่ก็เช็คตั้งแค่ 2 ถึง ตัวมันเอง ว่าไม่มีอะไรหารลงตัว
แต่แนะนำวิธีของเอราโทสเทเนส กล่าวไว้ว่า เมื่อหักเอาจำนวนที่ไม่ใช่จำนวนเฉพาะซึ่งอยู่หลังจำนวน เฉพาะออกไป จำนวนที่อยู่ถัดไปจะเป็นจำนวนเฉพาะ ฮ่า วิธีนี้ประสิทธิภาพดี
เช่นๆ เราเก็บ 1-100 ไว้ในอาเรย์ ตัวจำนวนเฉพาะ ตัวแรกที่เราเจอคือ 2 เพราะฉะนั้นเก็บไว้ ต่อไป เราก็เอาตัวที่ เป็น 2n ออก (อาจจะทำให้อารเรย์ช่องนั้นเป็น 0) แล้วเลื่อนอาร์เรย์ไป จนว่าจะเจอตัวที่ไม่ใช่ 0 ซึ่งเราพบว่า 3 คือตัวถัดไป เอามาเก็บไว้ แล้วก็ให้เอาตัว ที่เป็น 3n ออก แล้วก็ เลื่อนไปอีก จะเจอ 5 เพราะ 4 โดนเอาออกไปตั้งแต่ 2n แล้ว พอเราเจอ 5 เราก็เอาตัวที่หาร 5 ลงตัวออกเหมือนเดิม แล้วก็เลื่อนไป ก็เจอ 7 เพราะ 6 โดนเอาออกไปแล้ว ทำอย่างนี้ เป็นจำนวน nlog n ครั้ง อารเรย์ทั้งอาเรย์ก็ มีแต่จำนวนเฉพาะ
ไปดูรูปที่นี่ http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
หมายเหตุ: 1 ไม่ใช่จำนวนเฉพาะนะครับ
หมายเหตุ 2: 2 mod 2 = 0 จึงไม่เข้าครับ เลย explicitly ใส่เข้าไปเลย
หมายเหตุ 3: http://www.daniweb.com/code/snippet305.html
ขอบคุณมากๆๆคับผม
จา ที่ว่าพูดถึง หมายถึง จา พนม หรือเปล่าครับ?
จา พนม เขียน Python (หมัดงู) ไปพลางตะโกนไปพลาง
เลขเฉพาะตรูอยู่ไหน
ถ้าเขียนให้ครอบคลุมกว่านี้ผมแนะนำให้วนหามอดดูโล (modulo) จากจำนวนเฉพาะที่หามาก่อนหน้าน่าจะดีกว่านะ
ถ้าอยากให้เร็วขึ้นอีกทำตามที่คุณ nant บอก คือหารถึงแค่รากที่สองของมัน
ส่วนวิธีซีฟของเอราทอสเทนีสนั้นเหมาะเวลาต้องการหาจำนวนเฉพาะที่ไม่ค่อยสูงมาก ข้อดีคือสามารถหาได้เร็วมาก ข้อเสียคือเปลืองหน่วยความจำ
ลองมาดูความเร็วของสามตัวอย่างนี้บนเครื่องผมดู (หาจำนวนเฉพาะที่มีค่าต่ำกว่าหนึ่งแสน)
poomk@gemini:/tmp$ time ./prime1.py >/dev/null
real 0m19.622s
user 0m19.581s
sys 0m0.020s
poomk@gemini:/tmp$ time ./prime2.py >/dev/null
real 0m0.675s
user 0m0.676s
sys 0m0.000s
poomk@gemini:/tmp$ time ./prime3.py >/dev/null
real 0m0.535s
user 0m0.504s
sys 0m0.030s
เห็นได้ว่ามีแนวโน้มที่ดีขึ้นเรื่อยๆ
เนื่องจากหน่วยความจำเรามีจำกัด ทำให้เราไม่สามารถใช้ซีฟหาจำนวนเฉพาะมากๆได้ เราสามารถเอาสองวิธีนี้มาเขียนรวมกันแบบลูกครึ่ง (hybrid) คือใช้ซีฟหาจำนวนเฉพาะขนาดต่ำๆก่อน (เช่นต่ำกว่าหนึ่งล้าน) แล้วนำจำนวนเฉพาะนั้นไปหาจำนวนเฉพาะที่สูงขึ้นไปโดยใช้วิธีเดิม
ลองเปรียบเทียบความเร็วระหว่างใช้ซีฟช่วยกับการไม่ใช้ซีฟ ในการหาจำนวนเ)พาะที่ต่ำกว่าสองล้าน
poomk@gemini:/tmp$ time ./prime2.py >/dev/null
real 0m27.190s
user 0m27.090s
sys 0m0.096s
poomk@gemini:/tmp$ time ./prime4.py >/dev/null
real 0m20.422s
user 0m20.369s
sys 0m0.040s
อย่างไรก็ตามผมว่าไม่ควรเชื่อกับตัวเลขความเร็วมากนักเพราะนี่เป็นตัวอย่างแบบลวกๆ อยากให้มองที่แนวคิดมากกว่า
เขียนซะยาวเลย เผื่อมีคนอื่นเข้ามาดูแล้วอาจเป้นประโยชน์ (แบบว่าหลงมาเจอ)
LongSpine.com
ขอบคุณมากๆเลยครับสำหรับความช่วยเหลือ
ขอบคุณสำหรับทุกๆความช่วยเหลือครับ
ขอบคุณมากๆ
อันนี้เลยครับ สุดยอด (ผมก็กำลังทำการบ้านเรื่องนี้เหมือนกัน)
http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes