对于这种快要移溢出但是又没有溢出的数据范围,一律开long long,索引越界了,调试了一个小时。有一个测试点r=2147483647,加1就越界了,循环停不下来了
:(
难受
AC代码
#include<iostream>
#include<cmath>
using namespace std;
typedef long long LL;
const int N=1e6+10;
int l,r;
int a[N],prime[N],visit[N],cnt;
void Euler(){
for(int i=2;i<N;i++){
if(!visit[i])
prime[cnt++]=i;
for(int j=0;j<cnt;j++){
if(prime[j]*i>=N)
break;
visit[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
int work(){
int ans=0;
for(int i=0;i<cnt;i++){
LL pr=prime[i],sta=l;
if(pr>r)
break;
//注意起始点的位置
if(pr>=l){
for(LL j=pr*2;j<=r;j+=pr)
a[j-l]=1;
}
else{
if(l%pr!=0)
sta=l/pr*pr+pr;
for(LL j=sta;j<=r;j+=pr)
a[j-l]=1;
}
}
for(LL i=l;i<=r;i++)
if(a[i-l]==0 && i!=1) ans++;
return ans;
}
int main(){
cin>>l>>r;
Euler();
//a数组中0表示质数 1表示合数
cout<<work();
return 0;
}