http://blog.csdn.net/stack_queue/article/details/53560887
筛法的思想是去除要求范围内所有的合数,剩下的就是素数了,而任何合数都可以表示为素数的乘积,因此如果已知一个数为素数,则它的倍数都为合数。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define MAX 100000 4 long long su[MAX], cnt; 5 bool isprime[MAX]; 6 7 void prime() 8 { 9 cnt = 1; 10 memset(isprime, 1, sizeof(isprime)); 11 isprime[0] = isprime[1] = 0; 12 for(long long i = 2; i <= MAX; i++) 13 { 14 if(isprime[i]) 15 { 16 su[cnt++] = i; 17 } 18 for(long long j = i * 2; j <= MAX; j += i) 19 { 20 isprime[j] = 0; 21 } 22 } 23 } 24 25 26 int main() 27 { 28 prime(); 29 for(long long i = 1; i < cnt; i++) 30 cout << su[i] << " "; 31 return 0; 32 }
如果只筛选小于等于素数i的素数与i的乘积,既不会造成重复筛选,又不会遗漏。时间复杂度几乎是线性的。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define MAX 100000 4 bool isprime[MAX]; 5 long long su[MAX], cnt; 6 7 void prime() 8 { 9 cnt = 1; 10 memset(isprime, 1, sizeof(isprime));//初始化认为所有数均为素数 11 isprime[0] = isprime[1] = 0; 12 for(long long i = 2; i <= MAX; i++) 13 { 14 if(isprime[i]) 15 su[cnt++] = i; 16 for(long long j = 1; j < cnt && su[j] * i < MAX; j++) 17 { 18 isprime[su[j] * i] = 0;//筛掉小于等于i的素数和i的积构成的合数 19 } 20 } 21 } 22 23 int main() 24 { 25 prime(); 26 for(long long i = 1; i < cnt; i++) 27 cout << su[i] << " "; 28 return 0; 29 }