Re: [心得] 求質數的C++程式
看板C_and_CPP (C/C++)作者lc85301 (pomelocandy)時間1小時前 (2026/05/07 22:15)推噓0(0推 0噓 0→)留言0則, 0人參與討論串3/3 (看更多)
※ 引述《bl2086 (Bingo)》之銘言:
: prime.cpp
: https://mega.nz/file/61RhHAJQ#g5xbeuM5egw5R0whT9__sOZFbUrXG2slwyUI7j1fKRA
: 已更正,用的是愛氏篩法,用質數試除某數j,如果超過int_sqrt(j)都不整除的話就
: 確認j為質數
首先,你用了一個陣列來存已知的質數
注意你還是用 j, j+=2 的方式,然後把所有已知的質數拿出來測一次
還要用一個土砲的方式算平方根
那麼顯然你還沒讀懂 sieve of eratosthenes
要知道除法跟乘法的代價是不一樣的,算平方根也不是,你的土砲方法更不是
既然你都限制使用者只能輸入 65535 了,sieve of eratosthenes 有更好的實作
如果你真的對質數很有興趣,這裡有個不錯的專案你可以參考看看
https://github.com/kimwalisch/primesieve
----
挑戰是好事但請對自己有要求,不要侷限在什麼奇怪的 fchart
那是專有 tool 大家不會開,對表達你的想法沒有任何益處
你的程式我看過,至少有下列幾個可以改善
(包括但不限於,歡迎版友們在下方留言做 code review)
1. 為什麼要叫 l0, l1, l2?
label+goto 不是不能用(雖然我是不用派的),但要用得有意義
整份 code 只有 END 一個 label 是有意義的,其他全部都是雜訊
2. 為什麼只有 65536,要知道 65536 不過 16 bits
請問是什麼限制你不能允許到 32 bits, 64 bits ...
你是天底下最神通廣大的 C/C++ programmer
怎麼會被 65536 這麼迷你的數給擋住?
3. 請問 6542 是怎麼來的?為什麼會有這個 magic number
承上如果要讓使用者輸入很大的數,6542 不會超過嗎?
4. 請問 int_sqrt 的執行效率如何?有更快的實作嗎?
雖然做了 sieve of eratosthenes 不會用到 sqrt
但我建議你想想看你的實作有什麼問題
5. 為什麼你輸出的最後會有一個 ",",這顯然是程式員的疏失
----
綜上所述,挑戰失敗,原文砍除
另外宣告如下:
1. fchart 非本版事務,亦非公開格式/公開平台
未來文章不接受含 fchart 之內容,有則直接砍除+水桶
2. 已經是 2026 年了,基於版主私心在這裡重申,下一次發文
不準再出現 label 與 goto,請用其他的結構方式
若要使用 label+goto 請在文章中述明理由,以及其他結構為何不適用
同上,無法述明則直接砍除+水桶
2. 請續行挑戰 prime number,這年頭 AI 工具很多,C/C++ 也寫得行雲流水
試著和 AI 寫出的 code 相互比較,相信你可以學到很多
3. C/C++ 精通不容易,我鼓勵你挑戰但請對自己有要求
希望有一天你能寫出讓自己滿意,也能讓版友們滿意的程式碼
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.231.88.234 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1778163348.A.2B1.html
※ 編輯: lc85301 (36.231.88.234 臺灣), 05/07/2026 22:24:52
討論串 (同標題文章)
完整討論串 (本文為第 3 之 3 篇):
1
12
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章