区间内素数的筛选
问题:
给定整数a, b
求[a,b)内有多少个素数?
思路:
求出[2,根号b)的素数表,同时将其倍数从[a,b)中划去
代码如下
1 #include <cstdio> 2 #include <algorithm> 3 #include <vector> 4 #include <queue> 5 #define MAX_L 500 6 #define MAX_SQRT_B 50 7 using namespace std; 8 9 bool isPrime[MAX_L]; 10 bool isPrimeSmall[MAX_SQRT_B]; 11 12 int main(int argc, char const *argv[]) 13 { 14 //freopen("input.txt","r",stdin); 15 int a, b; 16 while(scanf("%d %d",&a,&b) != EOF) { 17 for(int i = 0; i * i < b; i++) { 18 isPrimeSmall[i] = true; 19 } 20 for(int i = 0; i < b - a; i++) { 21 isPrime[i] = true; 22 } 23 24 for(int i = 2; i*i < b; i++) { 25 if(isPrimeSmall[i] == true) { 26 for(int j = 2*i; j*j < b; j+=i) { 27 isPrimeSmall[j] = false; 28 } 29 for(int j = (a + i - 1)/i*i; j < b; j += i) { 30 isPrime[j-a] = false; 31 } 32 } 33 } 34 for(int i = a; i < b; i++) { 35 if(isPrime[i-a]) { 36 printf("%d\t",i); 37 } 38 } 39 puts(""); 40 } 41 return 0; 42 }