中間有一步是i==j+1
是什么意思?
uj5u.com熱心網友回復:
就是j回圈到了最后一次的時候,就會到達i==j+1,能走到這里,說明i就是質數了,否則中途就break了其實沒必要放在j回圈里判斷,放在j回圈后,的i回圈里就好了
即
for (i=1; i<=lim; i++) {
for (j=2; j<i; j++) {
if (i%j ==0) break;
}
if (i==j) a[MAX++] = i; //判斷放到外面來
}
uj5u.com熱心網友回復:
第二個for回圈如果順利運行的話,只有從2到i-1,“i%j==0”都不成立時,“i=j+1”才會成立,也就是說此時,i是一個素數,因此回傳的MAX值是小于等于lim的值里素數的個數減一,因為2也是素數,但是代碼里的for回圈會把2排除uj5u.com熱心網友回復:
就是過了i=j+1的時候就不需要判斷了,是不是質數就確定了。不過我覺得判斷到i的算術平方根向上取整就夠了吧。uj5u.com熱心網友回復:
什么時候 i==j+1 成立呢?只有當 j為i-1的時候,這個等式才成立
前面雖然有i%j != 0, 但是這個 i==j-1 并不成立
所以, 只有當j =i-1, 也就是for (j) 這個回圈運行到最后一次, 并且 i%j == 0 不成立的時候, 才能讓 i==j-1 成立
這樣說明, 從2到i-1任何一個都不是i的因子, 所以, i必然是素數了
這個代碼效率非常的低, 有很多的地方可以優化
但是,最重要到一個問題, 這個演算法把2也是素數這個情況給漏了
計算得到的aa陣列里面,沒有包含2這個素數, 2是最小的素數
這個函式是計算小于等于lim的所有素數,并放到aa陣列里面,然后回傳素數的個數
因為缺少素數2, 這個函式是錯的
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/111565.html
標籤:新手樂園
下一篇:c#與c++問題的請教
