题目内容
求 [a,b]之间的合数个数。
注意,1 既不是质数,也不是合数。
输入格式
输入包含多组测试数据。每组数据占一行,包含两个整数 a,b。
输出格式
每组数据输出一行答案,表示合数的个数。
数据范围
1≤a≤b≤1e7,输入最多包含 10组数据。
输入样例:
1 10
1 100
输出样例:
5
74
题目分析
常规算法会超时,只能使用O(n)复杂度的算法。故选用质数筛算法加前缀和优化
代码模版
#include "bits/stdc++.h"
using namespace std;
const int maxn = 1e7;
int prime[maxn+5], s[maxn+5], cnt;
bool st[maxn+5];
void isPrime(int n) {
for(int i = 2; i <= n; i++) {
if(!st[i])
prime[++cnt] = i;
for(int j = 1; prime[j] * i <= n; j++) {
st[prime[j] * i] = true;
if(i % prime[j] == 0)
break;
}
}
for(int i = 2; i <= n; i++) {
s[i] = s[i-1];
if(st[i])
s[i]++;
}
}
int a,b;
int main() {
isPrime(maxn);
while (cin >> a >> b)
cout << s[b] - s[a-1] << endl;
return 0;
}