LeetCode 204. Count Primes C++ 素数筛

Count the number of prime numbers less than a non-negative number, n.

Example:

Input: 10
Output: 4
Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.

trick:

我们判断100是否为素数时,在1处,没必要遍历i>10(即100的开方)以后的数。(这个自己想为什么)

注意到2处,素数必然是奇数,而遍历j的时候,奇数加奇数必然为偶数,而偶数必然不可能为素数。

为加快速度,我们可以2*该素数,见代码下面的说明。

 

int countPrimes(int n) {
	if (n < 3)
		return 0;
	bool res[n];
    memset(res, true, sizeof(res));
	int counts = 2;
	for (int i = 2; i * i < n; i++) { //1
		if (res[i]) {
            int step= (i > 2) ? (i << 1) : 2;
			for (int j = i * i; j < n; j += step) { //2
				if (res[j]) { //加个判断速度更快
					res[j] = false;
					counts++;
				}
			}
		}
	}
	return n - counts;
}
/*
例子n=100的遍历
其中,一个数字的行数代表step,即2,6,10,14为step,step下面将数组设置为false

2
4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 
52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98

6
9 15 21 27 33 39 45 51 57 63 69 75 81 87 93 99

10
25 35 45 55 65 75 85 95

14
49 63 77 91
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值