题目:Prime
来源:哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛)
解题思路
在一个闭区间 [a, b] 内,有多少个质数?
筛法求素数:把从 1 开始的、某一范围内的正整数从小到大顺序排列,1 不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。
C++代码
#include<iostream> using namespace std; const int N = 1e7+1; int sum[N]; int visited[N]; void isPrime(){ sum[1] = 0; for(int i=2; i<N; ++i){ if(!visited[i]){ sum[i] = sum[i-1] + 1; for(int j=i+i; j<N; j+=i) visited[j] = 1; } else sum[i] = sum[i-1]; } } int main(){ isPrime(); int T; cin >> T; int a, b; for(int i=0; i<T; ++i){ cin >> a >> b; cout << sum[b] - sum[a-1] << endl; } }