看板 C_and_CPP 關於我們 聯絡資訊
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
carlcarl:是在程式執行時建表 不是在code中輸入幾個case這樣吧 10/25 17:52
carlcarl:而且你給的case也太少= =a 10/25 17:52
VictorTom:N輸入後就不變, 所以你不需要每次迴圈都sqrt(N), 算過一 10/25 19:01
VictorTom:次存下來就好, sqrt()的速度之慢應該不是/或%可以比的. 10/25 19:01
VictorTom:最好也能分析輸入範圍, 決定是否連那一次sqrt都不要算, 10/25 19:02
VictorTom:改用a*a來取代. 話說, 每個數都%那幾個數判斷在先真的會 10/25 19:03
VictorTom:比較快嗎@_@" 10/25 19:03
tw00088437:我剛初學沒多久 不知道怎樣比較有效率啊 哭哭>< 10/25 19:18
tw00088437:而且在上傳之前有辦法先在自己評台測出效率嗎@@ 10/25 19:27
tw00088437:我跑的時候打到很大的數字也都是馬上就輸出結果了不到 10/25 19:28
tw00088437:一秒@@" 10/25 19:28
MOONRAKER:顯然他的時間限制比你想像的嚴格。 10/25 22:26
ledia:至少要幾十萬組大數字來測吧 10/25 22:26
ledia:你可以試試從 2 測到 2147483647 的總計時間 10/25 22:28
carlcarl:程式打多就會有感覺了0.0a 10/25 23:44
tw00088437:哪位高手可以寫個不TLE的程式給小弟看QQ 10/26 01:04
tw00088437:順便解釋一下為何效率比較好@@? 10/26 01:05
MOONRAKER:他都叫你建表了 想想看怎麼建 0 - k 的表吧 10/26 01:41
MOONRAKER:然後考慮 對 [ 0, 2147483647 ] 而言,k 要為多少 10/26 01:41
MOONRAKER:幹嘛寫給你看,不是你自己寫出來的有什麼意思啊 10/26 01:42
carlcarl:先在程式一開始把所有範圍內的質數抓出來 input就直接對 10/26 01:59