C语言练习百题之求100之内的素数

题目:求100之内的素数。

求解100以内的素数是一个常见的编程任务。素数是大于1且只能被1和自身整除的整数。我们将使用三种常见的方法来解决这个问题:穷举法、埃拉托斯特尼筛法和优化的埃拉托斯特尼筛法。

方法1: 穷举法

解题思路:
  • 从2开始遍历每个数,对每个数判断是否为素数,判断方法是看是否能被比它小的数整除。
  • 如果不能被任何比它小的数整除,则它是素数。
实现代码:
c 复制代码
#include <stdio.h>
#include <stdbool.h>

bool is_prime(int num) {
    if (num < 2)
        return false;

    for (int i = 2; i < num; i++) {
        if (num % i == 0)
            return false;
    }
    return true;
}

void print_primes(int limit) {
    for (int i = 2; i <= limit; i++) {
        if (is_prime(i))
            printf("%d ", i);
    }
}

int main() {
    int limit = 100;
    printf("Prime numbers up to %d:\n", limit);
    print_primes(limit);
    return 0;
}
优缺点:
  • 优点:
    • 算法简单,容易理解和实现。
  • 缺点:
    • 效率较低,时间复杂度为O(n^2)。

方法2: 埃拉托斯特尼筛法

解题思路:
  • 初始化一个布尔数组表示每个数是否为素数,初始所有数为素数。
  • 从2开始,将所有的倍数标记为非素数。
  • 最终剩下的未标记的数就是素数。
实现代码:
c 复制代码
#include <stdio.h>
#include <stdbool.h>

void sieve_of_eratosthenes(int limit) {
    bool is_prime[limit + 1];
    for (int i = 0; i <= limit; i++)
        is_prime[i] = true;

    for (int p = 2; p * p <= limit; p++) {
        if (is_prime[p]) {
            for (int i = p * p; i <= limit; i += p)
                is_prime[i] = false;
        }
    }

    printf("Prime numbers up to %d:\n", limit);
    for (int i = 2; i <= limit; i++) {
        if (is_prime[i])
            printf("%d ", i);
    }
}

int main() {
    int limit = 100;
    sieve_of_eratosthenes(limit);
    return 0;
}
优缺点:
  • 优点:
    • 算法效率较高,时间复杂度为O(n log log n)。
  • 缺点:
    • 占用较多内存,空间复杂度为O(n)。

方法3: 优化的埃拉托斯特尼筛法

解题思路:
  • 优化埃拉托斯特尼筛法,对每个素数的倍数进行标记时,从该素数的平方开始标记,而不是从素数的倍数开始。
实现代码:
c 复制代码
#include <stdio.h>
#include <stdbool.h>

void optimized_sieve_of_eratosthenes(int limit) {
    bool is_prime[limit + 1];
    for (int i = 0; i <= limit; i++)
        is_prime[i] = true;

    for (int p = 2; p * p <= limit; p++) {
        if (is_prime[p]) {
            for (int i = p * p; i <= limit; i += p)
                is_prime[i] = false;
        }
    }

    printf("Prime numbers up to %d:\n", limit);
    for (int i = 2; i <= limit; i++) {
        if (is_prime[i])
            printf("%d ", i);
    }
}

int main() {
    int limit = 100;
    optimized_sieve_of_eratosthenes(limit);
    return 0;
}
优缺点:
  • 优点:
    • 算法效率高,时间复杂度为O(n log log n)。
    • 占用较少内存,空间复杂度为O(n)。
  • 缺点:
    • 需要理解和实现的优化较多,相对于简单埃拉托斯特尼筛法更复杂。

总结和推荐

  • 推荐的方法: 优化的埃拉托斯特尼筛法
  • 优化的埃拉托斯特尼筛法综合了效率和空间复杂度的优点,是求解素数的较好选择。
  • 穷举法简单但效率低,不适用于大规模数据。
  • 埃拉托斯特尼筛法是常用且高效的方法,占用较多内存。
  • 优化的埃拉托斯特尼筛法在效率和内存占用上进行了平衡,是常用且推荐的方法。
相关推荐
学高数就犯困2 分钟前
性能优化:LRU缓存(清晰易懂带图解)
算法
CoovallyAIHub3 小时前
CVPR 2026 | MixerCSeg:仅2.05 GFLOPs刷新四大裂缝分割基准!解耦Mamba隐式注意力,CNN+Transformer+Mamba三
深度学习·算法·计算机视觉
CoovallyAIHub3 小时前
YOLO26-Pose 深度解读:端到端架构重新设计,姿态估计凭什么跨代领先?
深度学习·算法·计算机视觉
CoovallyAIHub3 小时前
化工厂气体泄漏怎么用AI检测?30张图3D重建气体泄漏场景——美国国家实验室NeRF新研究
深度学习·算法·计算机视觉
颜酱15 小时前
图的数据结构:从「多叉树」到存储与遍历
javascript·后端·算法
zone773920 小时前
006:RAG 入门-面试官问你,RAG 为什么要切块?
后端·算法·面试
CoovallyAIHub1 天前
OpenClaw 近 2000 个 Skills,为什么没有一个好用的视觉检测工具?
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
CVPR 2026 | 用一句话告诉 AI 分割什么——MedCLIPSeg 让医学图像分割不再需要海量标注
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
Claude Code 突然变成了 66 个专家?这个 5.8k Star 的开源项目,让我重新理解了什么叫"会用 AI"
深度学习·算法·计算机视觉
兆子龙1 天前
前端哨兵模式(Sentinel Pattern):优雅实现无限滚动加载
前端·javascript·算法