質數又來了
這次是給你兩個數字
算出介在這兩者間的質數有幾個
其實差不多,直接看下去吧
- #include <iostream>
- #include <vector>
- using namespace std;
- const int MAX = 46341;
- void creat(bool* prime);
- void filter(bool*, int);
- int main()
- {
- bool prime[MAX + 1] = {}; //加{}確保每個元素都指向0
- creat(prime);
- vector<int> prim;
- for (int i=0 ;i<MAX; i++)
- {
- if(prime[i])
- {
- prim.push_back(i);
- }
- int a, b;
- while (cin >> a >> b){
- int count = 0;
- if (b <= MAX)
- {
- for (int i=a; i<=b; i++)
- {
- if(prime[i])
- {
- count++;
- }
- }
- }
- else
- {
- vector<int>::iterator p;
- for (int i=a; i<=b; i++)
- {
- int notprime = 0;
- for (p = prim.begin(); p != prim.end(); p++)
- {
- if (i % (*p) == 0)
- {
- notprime = 1;
- break;
- }
- }
- if (notprime == 0)
- count++;
- }
- }
- cout << count << endl;
- }
- }
- //創造質數表
- void creat(bool* prime)
- {
- prime[2] = prime[3] = prime[5] = 1;
- //把6n+1、6n+5全設為質數
- int i;
- for (i=1; 6*i+5 <= MAX; i++)
- {
- prime[6*i+5] = prime[6*i+1] = 1;
- }
- if (prime[6*i+1] <= MAX)
- {
- prime[6*i+1] = 1;
- }
- //然後過濾掉6n+1、6n+5的倍數皆不為質數
- int j;
- for (j=0; (6*j+5)*(6*j+5) <= MAX; j++)
- {
- filter(prime, 6*j+5);
- filter(prime, 6*j+1);
- }
- if (prime[6*j+1] <= MAX)
- {
- filter(prime, 6*j+1);
- }
- }
- //過濾掉質數的倍數
- void filter(bool* prime, int i)
- {
- if (prime[i])
- {
- for (int j=2; i*j <= MAX; j++)
- prime[i*j] = 0;
- }
- }
沒有留言:
張貼留言