204 Count Primes

160 篇文章 0 订阅
39 篇文章 0 订阅

1 题目

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.

2 尝试解

2.1 分析

从2开始,每找到一个质数,就把所有由其构成的小于N的合数标记出来,比如N=10时,2为第一个质数,则4、6、8标记为合数,3为第二个质数,则6、9标记为合数,4为合数,跳过。

2.2 代码

class Solution {
public:
    int countPrimes(int n) {
        vector<int> primes(n,0);
        for(int i = 2; i < n; i++){
            //for each prime, calculate all possible multiple numbers less than n, and mark them as non-prime,
            if(primes[i] == 0){
                primes[i] = 1;
                int product = 2;
                while(product*i < n) {
                    primes[product*i] = -1;
                    product ++;
                }
            }
        }
        int result = 0;
        for(auto num:primes){
            if(num == 1) result++;
        }
        return result;
    }
};

3 标准解

int countPrimes(int n) {
    if (n<=2) return 0;
	vector<bool> passed(n, false);
	int sum = 1;
	int upper = sqrt(n);
	for (int i=3; i<n; i+=2) {
		if (!passed[i]) {
			sum++;
			//avoid overflow
			if (i>upper) continue;
			for (int j=i*i; j<n; j+=i) {
				passed[j] = true;
			}
		}
	}
	return sum;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值