素数筛选在很多题目上都会出现,这里对一些方法做一些总结
第一种
教科书里面的方法,对于数字n枚举小于等于 s q r t ( n ) sqrt(n) sqrt(n)的所有数字,如果n能够整除其中一个,就能判断n不是素数,时间复杂度大致是( n ∗ l o g n n*logn n∗logn)
当然由于偶数中只有2是素数,所以在筛选时可以从3开始,写循环时递增2,进一步节省时间
bool isprime(int n)
{
int t;
for(t=2;t<=sqrt(n);t++){
if(!n%t){
return false;
}
}
return true;
}
下面证明一下为什么到 s q r t ( n ) sqrt(n) sqrt(n)就能判断是n是否是素数 :
假设 n = s q r t ( n ) ∗ s q r t ( n ) = n 1 ∗ n 2 n = sqrt(n) * sqrt(n) = n1 * n2 n=sqrt(n)∗sqrt(n)=n1∗n2 ,且