//埃拉托尼斯筛(筛选出不超过n的素数)
void sieve(int n, bool a[]) {//寻找不超过n的所有质数,数组a用来存放结果,用a[i]==0表示a为合数 memset(a, 0, sizeof(bool) * (n + 1));//清零 a[0] = a[1] = 1;//0与1要特殊标记 for (int i = 2; i * i <= n; i++) if (a[i] == 0)//如果i未被之前的数筛去说明i为质数 for (int j = i << 1; j <= n; j += i) a[j] = 1; }
用埃拉托尼斯筛统计某一间断的素数个数
#define maxn 1000010 bool a[maxn]; int pri[100001]; int sieve(int n, int pri[]) { for (int i = 2; i * i <= n; i++) if (a[i] == 0) for (int j = i << 1; j <= n; j += i) a[j] = i; int cnt = 0; for (int i = 2; i <= n; i++) { if (!a[i]) pri[cnt++] = i; } return cnt; }