给定一个[left,right]的范围,计算这个区间内的质数的个数
思路:定义一个isPrime数组,其长度为right+1,数组的元素为bool型,true代表该位置索引的数字是质数。首先数组初始化为全部true,然后从2开始遍历到sqrt(right),对于当前遍历到的数字,将其所有倍数的位置设为false,例如,遍历到3的时候,将6,9,12...设为false,因为这些数字都是3的倍数,一定不是质数。当遍历到某个数,只需要判断这个数是不是true,就知道这个数是不是质数,因为如果是true说明这个数前面所有数的倍数都不会等于当前这个数。
#include<bits/stdc++.h>using namespace std;int countPrimes(int left, int right) {if (right < 2) return 0;vector<bool> isPrime(right + 1, true);for (int i = 2; i <= sqrt(right); ++i) {if (isPrime[i]) {for (int j = 2; i * j <=right; ++j) {isPrime[i * j] = false;}}}int cnt = 0;for (int i = left; i <= right; ++i) {if (isPrime[i]) ++cnt;}if(left==1)--cnt;return cnt;
}int main() {int L, R;cin >> L >> R;cout << countPrimes(L, R) << endl;return 0;
}