统计素数个数
【题目描述】
询问[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)。 */