题目描述
给定一个区间 [a,b],请你求出该区间内有多少个素数。
输入描述
![](https://i-blog.csdnimg.cn/blog_migrate/c707c0796d8c27de5b204620570aba47.png)
输出描述
输出一个整数,表示答案。
输入输出样例
示例
输入
2 6
输出
3
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int v1[50000];
int v2[1000000];
int main()
{
ll a,b;
int num;
cin>>a>>b;
for(ll i=1;i<=sqrt(b);i++)
{
v1[i]=1;
}
for(ll i=0;i<=b-a;i++)
{
v2[i]=1;
}
for(ll i=2;i<=sqrt(b);i++)//由原来的<=b改成<=sqrt(b),因为最外层i只需访问到sqrt(b),至于a-b部分在d2中操作,sqrt(b)-a部分不管它不影响结果(假设sqrt(b)<a)
{
if(v1[i])
{
for(ll j=i*i;j<sqrt(b);j++)
{
v1[i]=0;
}
ll k;//k含义:使i*k大于等于a即达到a-b范围内的的最小倍数k值(1除外)
if (a % i == 0)
k = a / i;
else
k = (a + i) / i;
k = max(i, k);//和上述同理,同时避免了a==i时k=1,误将素数i(即a)对应位置置0的情况,如果a<i,则k=i
while(k*i<=b)
{
v2[k*i-a]=0;
k++;
}
}
}
num=0;
for(ll i=0;i<=b-a;i++)
{
if(v2[i])
num++;
}
cout<<num;
return 0;
}