统计素数个数

【题目描述】

询问[a,b]中素数的个数。

【输入描述】

输入两个整数a、b(a,b ≤ 5000000)。

【输出描述】

输出一个数,表示答案。

【样例输入】

3 5

【样例输出】

2

源代码:

#include<cstdio>
int Left,Right,Ans(0),Num(0),Prime[350000];
bool Flag[5000001]={0};
void Euler()
{
    for (int a=2;a<=Right;a++)
    {
        if (!Flag[a])
        {
            if (a>=Left)
              Ans++;
            Prime[++Num]=a;
        }
        for (int b=1;b<=Num&&a*Prime[b]<=Right;b++) //其实想想,此时Prime[b]必为a*Prime[b]的最小素因子。
        {
            Flag[a*Prime[b]]=true;
            if (!(a%Prime[b])) //关键语句,此时Prime[b]即为a的最小素因子,往后的运算就是冗余的了。
              break;
        }
    }
}
int main() //欧拉筛法。
{
    scanf("%d%d",&Left,&Right);
    Euler();
    printf("%d",Ans);
    return 0;
}

/*
    欧拉筛法线性时间求素数。
    可知,每个合数都可以表示为一系列素数的积。
    则每个合数必对应一个最小素因子。
    若能凭此筛去,则时间复杂度为O(n)。
*/
原文地址:https://www.cnblogs.com/Ackermann/p/5952818.html