素数线性筛优化
大致思路: 初始时,令2是素数,假设2之后奇数全部数都是素数(偶数不考虑会快一点点),从3开始每当找到一个素数时,显然这个素数乘上另外一个数之后都是合数,把这些合数都筛掉,直到最后一个奇数超出范围,剩下的都是奇数都是素数。 注:以下代码只为得到n以内的素数,所以执行后标记数组中的标记是不完整的,如函数1和2中的isPrime[4]=1显然是错的,不过这对prime数组没有影响。如果想使标记数组完整,请自行修改。 前提: 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int MN=1e+8; 5 bool isPrime[MN];//isPrime[i]:i是否素数 6 int prime[MN/10];//prime[i]:第i个素数 1.普通筛法: 1 int makePrime1(int n)//求n以内的素数,返回得到的素数个数,下同 2 { 3 memset(isPrime,1,sizeof(isPrime)); 4 memset(prime,0,sizeof(prime)); 5 // 6 prime[1]=2; 7 int cnt=1; 8 for(long long i=3;i<=n;i+=2) 9 { 10 if(isPrime[i]) 11 { 12 prime[++cnt]=i;