方法一:直接判斷,思想簡單,實現比較簡單,但是複雜度過高
bool isprime
(int a)
return true;
}
方法二:素數篩選法(eratosthenes 篩法)
只有素數才能當篩子
篩掉對應的倍數,不超過要求的範圍即可
遍歷一遍**
void
getprime
(int n)}}
}//從i*i開始計算 j+=i;
void
getprime2
(int n)
}}
方法三:素數篩選法高階判斷
上述篩法能夠滿足大部分的題目要求,足夠使用,但是如果要更加進準,需要進行優化
如:12 根據方法二功能所述,通過2的倍數篩選過一次,通過3的倍數也篩過一次,其中是有重複的部分,所以可以優化。
數字只用最小的質數進行篩選 ,比如數字12,只有2篩,不採用3,因為2的倍數是6 , 3的倍數是4,,
這樣的方式應該如下,根據倍數進行排除,如果當前元素的倍數是之前的質數的整數倍,那麼後面的就不用判斷。
如:4 是2的倍數, 那麼的後面的質數的4倍一定是可以通過2進行排除的,因為 4 * k == 2 * ( 2 *k),所以排除第乙個元素後,後面不判斷, 直接跳過。
int
getprime
(int n)
} cout <<
"prime"
<< endl;
for(
int i =
0;i <= n;i++)if
(is_prime[i]
) cout << i << endl;
return k;
}
篩選法判斷素數
常規的判斷1 n以內的素數的時間複雜度為o n sqrt n 在n很大的時候時間很長,所以需要別的方法來判斷素數。這裡介紹篩選法。1 申請乙個陣列bool prime n 1 初始化所有的奇數下標為true,偶數下標為false 2例外 2 for int i 3 i sqrt n i 2 3 最後...
素數篩選法
篩選素數法 搞acm的都知道,素數是數論中必不可少的知識,也是必須要掌握的,關於素數的篩選有好幾種方法,下面一一道來,寫的不好還請提出。第一種是最常規的做法 int main if j sqrt i cout 這種方法肯定是比第一種快的,至於快多少大家可以比較一下,注意到裡面的for迴圈是到sqrt...
素數篩選法
素數篩選法差不多是打標,用前面確定的質數篩選掉後面的合數,然後遍歷下來所有的合數都被篩選掉了,剩下的都是素數。int vis maxn for int i 2 i n i for int j i 2 j n j i vis j 1 這是沒有優化的素數篩選法,也已經很快了,時間複雜度是n log n。...