[LeetCode] 204.计数质数(Easy)C语言题解

题目

  • 统计所有小于非负整数 n 的质数的数量。

示例

①示例1
  • 输入: 10
  • 输出: 4
  • 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7。

说明

①相关话题
  • 哈希表
  • 数学
②相似题目
③题目地址

解题方法

①数学知识
  • 质数(prime number)又称素数。即在大于 1 的自然数中,除了 1 和它本身外不再有其他因数。
  • 埃拉托斯特尼筛法:简称埃氏筛或爱氏筛,是由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数 n 以内的全部素数,必须把不大于根号 n 的所有素数的倍数剔除,剩下的就是素数。
②暴力解法
  • 两层 for 循环暴力判断。
  • 时间复杂度:O(N^2)。
  • 空间复杂度:O(1)。
③哈希表 + 埃拉托斯特尼筛法
  • 埃拉托斯特尼筛法证明图
  • 根据其数据范围动态创建数组,然后用数组模拟的哈希表求解。
  • 将所有素数(不大于根号 n)的倍数剔除后,计数质数即可。
  • 时间复杂度:O(N)。
  • 空间复杂度:O(N)。

代码详解

  • 暴力解法
int countPrimes(int n) {
    int count = 0;
    
    if (n > 2)
        count++;
    if (n > 3)
        count++;
    
    // 先排除偶数。
    for (int i = 5; i < n; i += 2) {
        int s = sqrt(i);
        
        // 根据质数性质,只需要判断其是否可以整除2-sqrt(i),就可知其是否是质数。
        for (int j = 2; j <= s; j++) {
            if (i % j == 0)
                break;
            if (j == s)
                count++;
        }
    }
    
    return count;
}
  • 哈希表 + 埃拉托斯特尼筛法
int countPrimes(int n) {
    int count = 0, s = sqrt(n);
    int* arr = malloc(sizeof(int)*n);
    
    if (n > 2) {
        // 初始化哈希表。
        for (int i = 2; i < n; i++) 
            arr[i] = 1;
        for (int i = 2; i <= s; i++) {
            if (arr[i]) {
                // 注意:是剔除其倍数,而不是平方数。
                for (int j = i*2; j < n; j += i)
                    arr[j] = 0;
            }
        }
        // 计数质数(剔除了所有非质数)。
        for (int i = 2; i < n; i++) {
            if (arr[i])
                count++;
        }
    }
    
    return count;
}

附录

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值