leetcode:Count Primes

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

本题给定一个非负数n,让我们求小于n的质数的个数,解题方法就在第二个提示埃拉托斯特尼筛法Sieve of Eratosthenes中,这个算法的过程如下图所示,我们从2开始遍历到根号n,先找到第一个质数2,然后将其所有的倍数全部标记出来,然后到下一个质数3,标记其所有倍数,一次类推,直到根号n,此时数组中未被标记的数字就是质数。我们需要一个n-1长度的bool型数组来记录每个数字是否被标记,长度为n-1的原因是题目说是小于n的质数个数,并不包括n。 然后我们用两个for循环来实现埃拉托斯特尼筛法,难度并不是很大,代码如下所示:

class Solution {
public:
    int countPrimes(int n) {
        vector<bool> num(n - 1, true);
        num[0] = false;
        int res = 0, limit = sqrt(n);
        for (int i = 2; i <= limit; ++i) {
            if (num[i - 1]) {
                for (int j = i * i; j < n; j += i) {
                    num[j - 1] = false;
                }
            }
        }
        for (int j = 0; j < n - 1; ++j) {
            if (num[j]) ++res;
        }
        return res;
    }
};

其他解法:

1、(56ms)class Solution {
public:
    int countPrimes(int n) {
        if (n < 2)
        {
            return 0;
        }
        bool prime[n];
        memset(prime, true, n*sizeof(bool));  //memset:作用是在一段内存块中填充某个给定的值,第三个参数指定块的大小
        prime[0] = false;
        prime[1] = false;  

        int result = 0;
        int limit = sqrt(n);  

        for (int i = 2; i <= limit; i++)
        {
            if (prime[i])
            {
                for (int j = i*i; j < n; j += i)
                {
                    prime[j] = false;
                }
            }
        }  

        for (int i = 0; i < n; i++)
        {
            if (prime[i])
            {
                result++;
            }
        }  

        return result;
    }
};

  

2、(86ms)class Solution {
public:
    int countPrimes(int n) {
        if(n<3)
            return 0;
        int *flag=new int[n];
        fill(flag,flag+n,1);//fill()作用是设置指定范围【flag,flag+n)内的元素值为1
        int c=n-2,m=n/2;//1和n都不在,故为n-2
        for(int i=2;i<=m;i++)
        {
            if(flag[i])
            {
                for(int j=2;i*j<n;j++)
                {
                    if(flag[i*j])
                    {
                        flag[i*j]=0;
                        c--;
                    }
                }
            }
        }
        delete []flag;
        return c;
    }
};

  

时间: 2024-11-03 21:26:58

leetcode:Count Primes的相关文章

LeetCode:Count Primes - 统计质数数量

1.题目名称 Count Primes(统计质数数量) 2.题目地址 https://leetcode.com/problems/count-primes/ 3.题目内容 英文:Count the number of prime numbers less than a non-negative number, n. 中文:统计正整数n以内(不含n本身)质数的数量 4.一个TLE的方法 从1到n,考察每个数字是否为质数.这个方法由于花费时间较长,不能满足题目中对时间的要求. 一段实现此方法的Jav

Leetcode problem-204 Count Primes 题解

Leetcode problem-204 Count Primes Count the number of prime numbers less than a non-negative number, n. 题解:这道题如果对每个小于n的数都进行判断是否为素数并计数会超时,因此采用筛法来解这题.建一个数组,从2开始, 把其倍数小于N的都删掉. class Solution { public: int countPrimes(int n) { vector<int>arr(n,1); int s

LeetCode:Count and Say

1.题目名称 Count and Say(按照数字重复出现计数并生成字符串) 2.题目地址 https://leetcode.com/problems/count-and-say/ 3.题目内容 英文:The count-and-say sequence is the sequence of integers beginning as follows 中文:给出正整数n,返回"count-and-say"序列的第n项 说明: count-and-say序列形如:1, 11, 21, 1

leetcode笔记:Count Primes

一. 题目描述 Count the number of prime numbers less than a non-negative number, n. 二. 题目分析 题目有很多tips,大意是算出2 ~ n之间有多少个素数. 若使用暴力法只会是超时,而正确的思路来自著名的埃拉托斯特尼筛法.简单来说,要得到自然数n以内的全部素数,必须把不大于sqrt(n)的所有素数的倍数剔除,剩下的就是素数.更多关于埃拉托斯特尼筛法,参照: http://baike.baidu.com/link?url=A

LeetCode OJ:Count Primes(质数计数)

Count the number of prime numbers less than a non-negative number, n. 计算小于n的质数的个数,当然就要用到大名鼎鼎的筛法了,代码如下,写的有点乱不好意思. 1 class Solution { 2 public: 3 int countPrimes(int n) { 4 vector<int> vtor(n + 1, 0); 5 vector<int> ret; 6 for (int i = 0; i <=

LeetCode (36) Count Primes

题目描述 Count the number of prime numbers less than a non-negative number, n. 本题要求我们求出小于n的数中共有多少个质数.相信大部分同学在刚开始学习C语言的时候估计都写过判断一个数为质数的程序.一般的思路为: bool isPrime(int num) { int s = sqrt(num) + 1; for( int i = 3; i != s; ++i) { if (num mode i == 0) return fal

[LeetCode 204] Count Primes

题目链接:count-primes Description: Count the number of prime numbers less than a non-negative number, n public class Solution { public int countPrimes(int n) { if(n <= 2) return 0; List<Integer> primes = new ArrayList<Integer>(); primes.add(2);

Java [Leetcode 204]Count Primes

题目描述: Description: Count the number of prime numbers less than a non-negative number, n. 解题思路: Let's start with a isPrime function. To determine if a number is prime, we need to check if it is not divisible by any number less than n. The runtime comp

[LeetCode]54. Count Primes统计素数

Description: Count the number of prime numbers less than a non-negative number, n. Credits:Special thanks to @mithmatt for adding this problem and creating all test cases. 解法1:扫描一遍,依次判断每个数是否是素数,会超时Time Limit Exceeded class Solution { public: int coun