素数
一、定义 素数又称质数,是指一个大于 \(1\) 的正整数,如果除了 \(1\) 和它本身外,没有其他任何约数。偶素数只有一个为 \(2\) 。 对于正实数 \(x\) ,定义 \(\pi(x)\) 为不大于 \(x\) 的素数个数,那么 \(\pi(x)\approx\frac{x}{ln(x)}\) 二、素数的判定 对于单个数或数据范围比较小时,我们采用枚举法: bool is_prime(int x) { for(int i=2;i<=sqrt(x);i++) if(!(x%i))return 0; return 1; } 对于比较大的数据范围,并且要求出范围内的所有质数,我们卡可以采用筛选法 1、 \(Eratosthenes\) 筛选法 void get_prime(int N) { memset(v,0,sizeof(v)); for(int i=2;i<=N;i++) { if(v[i])continue ; prime[++cnt]=i; for(int j=i;j<=N/i;j++)v[i*j]=1; } } 不过我们发现这个筛法的效率并不高,因为它会重复筛选同一个质数。因此,就有了第二种筛法——快速线性筛法,它的复杂度几乎是线性的。 void get_prime(int N) { memset(v,0,sizeof(v)); for