记个小笔记,具体思想可以参考其他大神
线性求法:
const int N=50;
int prime[N];
int a[N];
int check[N];
int tot=0;
void solve(){
memset(check, 0, sizeof(check));
for(int i=2;i<N;++i){
if(!check[i]){
prime[tot++]=i;//这里需要增加另外一个数组来存储素数,否则有错
}
for(int j=0;j<tot&&i*prime[j]<=N;++j){
check[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
还有一种是判断从2到根号n,从3开始奇数去除合数,但不是线性。
判断素数:
int isPrime(int n)
{
int m=sqrt(n);
if(n==2||n==3)
return 1;
if(n%6!=1&&n%6!=5)
return 0;
for(int i=5;i<m;i+=6){
if(n%i==0||n%(i+2)==0)
return 0;
}
return 1;
}