Count Primes

问题描述:


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.

简述:

给一个非负整数n,计算小于n的质数个数。

 

解题思路:


质数了解一下:除了1和它自身这两个因数外就再也没有别的因数的数(1不是质数)。

思路1:简单粗暴法,疯狂遍历判断就是了。效率极低,只要提交,必然Time Limit Exceeded。也可能有简单修改,比如将内层循环遍历范围缩小到 \frac{i}{2} 或 \sqrt{i} ,但依旧改变不了它慢的本质。

    int countPrimes(int n) {
        if(n<=2) return 0;
        
        int num = 1;
        for(int i=3; i<n; ++i) {
            int j;
            for(j=2; j<i; ++j) {
                if(i%j == 0)
                    break;
            }
            
            if(j==i) 
                ++num;
        }
        
        return num;
    }

 

思路2:广搜。两个因子(>=2)的乘积必然不是质数。利用这一点,通过广搜,可以排除小于n的所有不是质数的数,剩余的即是质数。

    int countPrimes(int n) {
        if(n<=2) return 0;
        
        bool f[n] = {0};
        int num = 0;
        f[0] = f[1] = 1;  
        
        for(long i=2; i<n; ++i) {
            if(!f[i]) ++num;
            for(long j=i; j<n; ++j) {
                if(i*j < n) {
                    f[i*j] = 1;
                } else {
                    break;
                }         
            }
        }
        
        return num;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值