筛法求素数

筛法求素数

a[]是筛表(0,1肯定不是素数,用地址表示素数值,用bool值表示是否为素数

prime[]素数表,cnt计数素数个数

原理:素数间乘积不是素数,且不重复

const int n = 10000;//n为最大数或者说要求数
bool a[n+1];
int prime[n/3+1],cnt = 0;
void oula_sieve()
{
    memset(a,true,sizeof(a));
	a[0] = a[1] = false;
	for (int i = 2; i <= n; i++)
    {
		if (a[i]) prime[++cnt] = i;//没有被更小的素数乘积覆盖的,无疑是素数,因此直接设为素数,判断是否为素数在上一轮做过了
		for (int j = 1; j <= cnt && i * prime[j] <= n; j++)
        {
				a[ i * prime[j] ] = false;//用素数相乘可以得到完全不重复的合数
				if (i % prime[j] == 0) break;//一共3个终止筛除合数条件:正在判断的数有之前素数的因子,筛过了最大数或者说要求数,素数表越界
        }
	}
}