[問題] 判斷質數的程式 覺得簡單但一直超時

看板C_and_CPP (C/C++)作者 (喵貓 loves fish)時間16年前 (2009/10/25 17:38), 編輯推噓3(3018)
留言21則, 5人參與, 最新討論串1/1
http://zerojudge.tw/ShowProblem?problemid=d447 題目 使用平台:dev c++ 就只是要判斷質數 只是我第一次送出TLE(超過一秒) 後來我建了一些表又用了6N+-1判斷法 還是TLE = = 請問還有哪些地方可以改進變得更快@@ #include<iostream> #include<cmath> using namespace std; int N,a,b,c;//c =counter int main() { while(cin>>N) { b=1; c=0; a=43; if(N%2==0&&N!=2) cout<<"no"<<endl; else if(N%3==0&&N!=3) cout<<"no"<<endl; else if(N%5==0&&N!=5) cout<<"no"<<endl; else if(N%7==0&&N!=7) cout<<"no"<<endl; else if(N%11==0&&N!=11) cout<<"no"<<endl; else if(N%13==0&&N!=13) cout<<"no"<<endl; else if(N%17==0&&N!=17) cout<<"no"<<endl; else if(N%19==0&&N!=19) cout<<"no"<<endl; else if(N%23==0&&N!=23) cout<<"no"<<endl; else if(N%29==0&&N!=29) cout<<"no"<<endl; else if(N%31==0&&N!=31) cout<<"no"<<endl; else if(N%37==0&&N!=37) cout<<"no"<<endl; else if(N%41==0&&N!=41) cout<<"no"<<endl; else if(N%43==0&&N!=43) cout<<"no"<<endl; else { while(a<=sqrt(N)) { if(N%a==0) { cout<<"no"<<endl; b=0; } a=a+(c%2)*2+2; c++; } if(b) cout<<"yes"<<endl; } } return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.228.103.110

10/25 17:52, , 1F
是在程式執行時建表 不是在code中輸入幾個case這樣吧
10/25 17:52, 1F

10/25 17:52, , 2F
而且你給的case也太少= =a
10/25 17:52, 2F

10/25 19:01, , 3F
N輸入後就不變, 所以你不需要每次迴圈都sqrt(N), 算過一
10/25 19:01, 3F

10/25 19:01, , 4F
次存下來就好, sqrt()的速度之慢應該不是/或%可以比的.
10/25 19:01, 4F

10/25 19:02, , 5F
最好也能分析輸入範圍, 決定是否連那一次sqrt都不要算,
10/25 19:02, 5F

10/25 19:03, , 6F
改用a*a來取代. 話說, 每個數都%那幾個數判斷在先真的會
10/25 19:03, 6F

10/25 19:03, , 7F
比較快嗎@_@"
10/25 19:03, 7F

10/25 19:18, , 8F
我剛初學沒多久 不知道怎樣比較有效率啊 哭哭><
10/25 19:18, 8F

10/25 19:27, , 9F
而且在上傳之前有辦法先在自己評台測出效率嗎@@
10/25 19:27, 9F

10/25 19:28, , 10F
我跑的時候打到很大的數字也都是馬上就輸出結果了不到
10/25 19:28, 10F

10/25 19:28, , 11F
一秒@@"
10/25 19:28, 11F

10/25 22:26, , 12F
顯然他的時間限制比你想像的嚴格。
10/25 22:26, 12F

10/25 22:26, , 13F
至少要幾十萬組大數字來測吧
10/25 22:26, 13F

10/25 22:28, , 14F
你可以試試從 2 測到 2147483647 的總計時間
10/25 22:28, 14F

10/25 23:44, , 15F
程式打多就會有感覺了0.0a
10/25 23:44, 15F

10/26 01:04, , 16F
哪位高手可以寫個不TLE的程式給小弟看QQ
10/26 01:04, 16F

10/26 01:05, , 17F
順便解釋一下為何效率比較好@@?
10/26 01:05, 17F

10/26 01:41, , 18F
他都叫你建表了 想想看怎麼建 0 - k 的表吧
10/26 01:41, 18F

10/26 01:41, , 19F
然後考慮 對 [ 0, 2147483647 ] 而言,k 要為多少
10/26 01:41, 19F

10/26 01:42, , 20F
幹嘛寫給你看,不是你自己寫出來的有什麼意思啊
10/26 01:42, 20F

10/26 01:59, , 21F
先在程式一開始把所有範圍內的質數抓出來 input就直接對
10/26 01:59, 21F
文章代碼(AID): #1Av1o0_c (C_and_CPP)
文章代碼(AID): #1Av1o0_c (C_and_CPP)