A pretty straight forward task, calculate the number of primes between 2 integers.
Given 2 integers A \leq B < 5*10^6A≤B<5∗106 what's the number of primes in range from A to B inclusive.
Note: A prime number is a positive integer greater than 1 and is divisible by 1 and itself only. For N to be prime it is enough to test the divisibility of numbers less than or equal to square root of N.
Input
As many as 1000 lines, each line contains 2 integers A and B separated by a space. Input is terminated when A = B = -1 (Do not process this line).
Output
For every line in input – except for the last line where A = B = -1 - print the number of prime numbers between A and B inclusive.
Example
Input
0 9999 1 5 -1 -1
Output
1229 3
计算素数个数 位集 打表
#include <bits/stdc++.h>
using namespace std;
bitset<10000000> p;
int q[5000010];
void sieve()
{
p.set(); // 全部设置为1
for(int i = 4;i < 1e7; i += 2)
p.reset(i); // 2的倍数为置为零
for(int i = 3;i < 10000; i += 2)
if(p.test(i)) //清除素数的倍数
for(int j = i*i; j < p.size(); j += i*2)
p.reset(j);
p[0] = p[1] = 0;
int cnt = 0;
for(int i = 2;i < 5000010; i++){
if(p.test(i)) q[i] = ++cnt;
else q[i] = cnt;
}
}
int main()
{
int a,b;
sieve();
while(cin >> a >> b && a >= 0 && b >= 0){
if(a == 0) a = 1;
cout << q[b]-q[a-1] << "\n";
}
return 0;
}