1. 程式人生 > 其它 >c語言求區間內素數個數_21天搞定考研機試(素數篩選)

c語言求區間內素數個數_21天搞定考研機試(素數篩選)

技術標籤:c語言求區間內素數個數

73f55c3a5a50fbe1fa42cb4e701c755f.png

3.6 素數篩選

有的時候,題目要求我們篩選出一段區間內的素數,我們就需要掌握一種素數篩選的方法。

如果用上一節素數判定的方法去判定每一個數是不是素數的話。

複雜度是O(n*sqrt(n)),大概能處理到10000以內的數。

如果題目要求的範圍更大,那麼我們就需要一種更為高效的篩選法。

掌握下面這一種線性複雜度的篩選方法就足夠我們應對任何情況。

1. // 線性素數篩選  prime[0]存的是素數的個數 
2. const int maxn = 1000000 + 5;  
3. int prime[maxn];  
4. void getPrime() {  
5.     memset(prime, 0, sizeof(prime));  
6.  for (int  i = 2; i <= maxn; i++) {  
7.  if (!prime[i]) prime[++prime[0]] = i;  
8.  for (int j = 1; j <= prime[0] && prime[j] * i <= maxn; j++) {  
9.             prime[prime[j] * i] = 1;  
10.  if (i % prime[j] == 0) break;  
11.         }  
12.     }  
13. }  

素數判定

題目描述:

給你兩個數a、b,現在的問題是要判斷這兩個陣列成的區間內共有多少個素數

輸入描述:

多組測試資料。 每個測試資料輸入兩個數a、b。(2<=a,b<=1000)

輸出描述:

輸出該區間內素數的個數。

輸入樣例#:

2 4

4 6

輸出樣例#:

2

1

題目來源:

DreamJudge 1102

題目解析:這道題的資料範圍不大,我們可以用挨個暴力判斷的方法來解決。我們假設這道題的資料範圍很大,使用素數篩選的方法來解決這個問題。

參考程式碼

1. #include <bits/stdc++.h> 
2. using namespace std;  
3.  
4. // 線性素數篩選  prime[0]存的是素數的個數 
5. const int maxn = 1000000 + 5;  
6. int prime[maxn];  
7. void getPrime() {  
8.     memset(prime, 0, sizeof(prime));  
9.  for (int  i = 2; i <= maxn; i++) {  
10.  if (!prime[i]) prime[++prime[0]] = i;  
11.  for (int j = 1; j <= prime[0] && prime[j] * i <= maxn; j++) {  
12.             prime[prime[j] * i] = 1;  
13.  if (i % prime[j] == 0) break;  
14.         }  
15.     }  
16. }  
17. int main() {  
18.     getPrime();//先進行素數篩選預處理 
19.  int a, b;  
20.  while (scanf("%d%d", &a, &b) != EOF) {  
21.  if (a > b) swap(a, b);//a有可能比b大 
22.  int ans = 0;  
23.  for (int i = 1; i <= prime[0]; i++) {  
24.  if (prime[i] >= a) ans++;//素數大於a答案加一 
25.  if (prime[i] > b) {  
26.                 ans--;//大於b要減回來 
27.  break;  
28.             }  
29.         }  
30.         printf("%dn", ans);  
31.     }  
32.  return 0;  
33. }  

練習題目

DreamJudge 1375 素數