c語言求區間內素數個數_21天搞定考研機試(素數篩選)
阿新 • • 發佈:2021-01-24
技術標籤:c語言求區間內素數個數
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 素數