筛法求素数
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个终止筛除合数条件:正在判断的数有之前素数的因子,筛过了最大数或者说要求数,素数表越界
}
}
}