问题描述
给定区间[L, R] , 请计算区间中素数的个数。
输入格式
两个数L和R。
输出格式
一行,区间中素数的个数。
样例输入
2 11
样例输出
5
数据规模和约定
2 <= L <= R <= 2147483647 R-L <= 1000000
思路:就是素数筛选,不过这道题由于数据的范围原因,要进行变型,先将们先筛出[1,r]区间内的素数。然后用这些素数筛去[l,r]的非素数,,,,骚操作很多
会超范围,所以用long long
#include<bits/stdc++.h>
using namespace std;
long long prime[2000000];
int flag1[2000000],flag2[2000000];
int main()
{
long long int l,r;
long long int n = 0;
cin >> l >> r;
for(long long int i = 2; i*i <= r; i++){
if (flag1[i] == 0){
prime[n++] = i;
for(long long int j = i*i; j*j <= r; j += i){
flag1[i] = 1;
}
}
}
for(long long int i = 0; i < n; i++){
long long int s = l/prime[i];
s = s*prime[i]+prime[i]; //大于l的能被筛去的最小数
if (s % prime[i] == 0) s -= prime[i]; //判断一下l本身能被筛去的情况
for(long long int j = s; j <= r; j += prime[i]){
flag2[j-l] = 1; //j-l是因为数组会炸掉,位移一下下标
}
}
long long int sum = 0;
for(long long int i = l; i <= r; i++)
if (flag2[i-l] == 0)
sum++;
cout << sum << endl;
return 0;
}