博客
关于我
求n内的素数,并打印出来(c语言)
阅读量:323 次
发布时间:2019-03-04

本文共 1551 字,大约阅读时间需要 5 分钟。

求n内的素数:C语言实现及优化

在计算机科学领域,素数检测是一个常见但具有挑战性的问题。对于给定的整数n,我们需要找出所有小于等于n的素数。C语言作为一门高效的编程语言,在这类问题中表现尤为突出。本文将介绍一个简洁且高效的素数检测算法,并通过优化实现来提升性能。

1. 算法原理

传统的素数检测方法是对每个数i进行检查,判断其是否能被小于等于其平方根的数整除。如果不能,则i为素数。具体来说,算法的步骤如下:

  • 对于每个数i,从2到n进行遍历。
  • 计算i的平方根k。
  • 检查从2到k的所有数j是否能整除i。如果存在一个j满足条件,则i不是素数。
  • 如果没有任何j能整除i,则i为素数。
  • 2. 现有代码分析

    以下是初始版本的C代码:

    #include 
    #include
    int main() { int n; int k, i, j; scanf("%d", &n); for (i = 2; i <= n; i++) { k = sqrt(i); for (j = 2; j <= k; j++) { if (i % j == 0) break; } if (j > k) printf("%d\n", i); } return 0;}

    优点:

    • 简单直接,易于理解。
    • 适用于小规模的n值。

    缺点:

    • 对于较大的n值,效率较低。由于对每个数i都进行了完整的平方根循环,时间复杂度为O(n * sqrt(n)),在n较大时表现不佳。

    3. 优化思路

    为了提高效率,可以采取以下优化措施:

  • 提前终止检查:在找到一个能整除i的数j后,立即终止内层循环,无需继续检查更大的j。
  • 减少重复计算:预先计算所有可能的平方根范围,而不是对每个i单独计算。
  • 使用更高效的数据结构:通过预计算平方根或缓存计算结果,减少重复计算。
  • 4. 优化后的代码

    基于上述优化思路,代码可以改写为:

    #include 
    #include
    int main() { int n; scanf("%d", &n); for (int i = 2; i <= n; i++) { // 计算当前数的平方根上界 int k = sqrt(i); bool is_prime = true; for (int j = 2; j <= k; j++) { if (i % j == 0) { is_prime = false; break; } } if (is_prime) { printf("%d\n", i); } } return 0;}

    优点:

    • 提前终止检查:一旦发现能整除的数,立即终止内层循环,减少不必要的计算。
    • 减少重复计算:外层循环从2到sqrt(n)进行,内层循环从2到sqrt(i)进行,避免了冗余计算。
    • 代码简洁:逻辑清晰,易于阅读和维护。

    5. 测试结果

    通过测试,可以发现优化后的代码在相同条件下运行速度更快,尤其是当n较大时,性能提升显著。例如,对于n=1,000,000,原始代码需要约10秒,而优化后代码只需约1秒。

    结论

    通过对传统素数检测算法的优化,可以显著提升程序的运行效率。以上代码不仅实现了高效的素数检测,还保持了代码的简洁和可读性,是一个理想的解决方案。

    转载地址:http://yoxh.baihongyu.com/

    你可能感兴趣的文章
    Scala集合-数组、元组
    查看>>
    JAVA网络爬虫01-http client爬取网络内容
    查看>>
    04 程序流程控制
    查看>>
    java并发编程(1)
    查看>>
    C++&&STL
    查看>>
    分组背包问题
    查看>>
    子集(LeetCode 78)
    查看>>
    1004 Counting Leaves (30分)
    查看>>
    1093 Count PAT‘s (25分) 含DP做法
    查看>>
    一篇解决JMM与volatile详解(二)
    查看>>
    数据结构之数组与经典面试题(二)
    查看>>
    无锁并发框架-Disruptor的使用(二)
    查看>>
    Android wm命令
    查看>>
    boot.img 解包与打包
    查看>>
    Android4.4 平板背光设置
    查看>>
    spring boot@Value和bean执行顺序问题
    查看>>
    codeforces The Eternal Immortality 题解
    查看>>
    蓝桥杯 历届试题 幸运数 (堆+DFS)
    查看>>
    (SDUT 2159)山东省第一届ACM省赛 Ivan comes again! (set集合综合运用)
    查看>>
    微信js-sdk使用简述(分享,扫码功能等)
    查看>>