[語法] 尋找2~1000的質數 的語法討論

看板C_and_CPP (C/C++)作者時間16年前 (2009/09/14 20:59), 編輯推噓0(006)
留言6則, 1人參與, 最新討論串1/6 (看更多)
我在寫這個程式時 嘗試使用兩層迴圈 搭配高一數學學到的質數判別定理 來寫 (寫出來的結果可參考下面) 雖然跑出來的還算順利 但總覺得code有點繞(不知道是因為我是新手 還不習慣 還是真的我寫的不好|||) 想請教板上的版友 不知是否可以討論指教 提供更好或更直觀的寫法呢 感謝 =============================================================================== //底下是我寫的程式碼 int x; int i; for(x=2,i=2;x<=1000;x=x+1) { for (i=2;i<=sqrt(x);i=i+1) //如果i比sqrt(x)大就跳出,或者如果x除 //以i為整除也跳出 { if ((i>sqrt(x))||(x%i==0)) break; } { if(i>sqrt(x)) //此時i比sqrt(x)大的都是質數,故印出 //這些屬於質數的x printf("%d\t",x); } }

09/14 21:09, , 1F
首先 可以把 sqrt 移到外面,避免每次迴圈就呼叫兩次 sqrt
09/14 21:09, 1F

09/14 21:09, , 2F
函式重算。再來 sqrt 的傳回值是 double 吧,那麼 i 也會
09/14 21:09, 2F

09/14 21:10, , 3F
轉換成 double 去跟它比較。小心浮點數誤差。最後你其實可
09/14 21:10, 3F

09/14 21:11, , 4F
以不用判斷 if (i>sqrt( (double) x) ) break; 如果你將
09/14 21:11, 4F

09/14 21:12, , 5F
sqrt 轉(四捨五入)成int的話,因為這樣它自然會在 i >
09/14 21:12, 5F

09/14 21:12, , 6F
sqrt(x) 時跳出迴圈,就不用 break 了。
09/14 21:12, 6F
阿 感謝 XD 我懂了 感謝 ※ 編輯: bookticket 來自: 140.119.143.103 (09/14 21:28)
文章代碼(AID): #1AhZuvs8 (C_and_CPP)
文章代碼(AID): #1AhZuvs8 (C_and_CPP)