当前位置: 首页 > news >正文

C语言--求n以内的素数(质数)

求n以内的素数,可以用试除法或者埃拉托斯特尼筛法(埃氏筛法)

文章目录

  • 试除法
  • 埃拉托斯特尼筛法(埃氏筛法)
  • 两种方法测试
    • 运行效率

输入:数字n
输出:n以内所有的素数

不管是哪个方法,都有一个数学结论可以减少循环次数:

如果有一个数不是质数,那么它至少有一个因子小于等于他的平方根。所以说n有因数的话,一定有一个小于根号n,因此只需要看遍历到根号n即可。
反过来说,如果根号n内没有某个数的因数,那么整个2,n-1都没有这个数的因数。

试除法

使用i*i而不是sqrt(n)是为了避免对浮点数进行处理。

/**
*  试除法
*  0、1 都不是质数
*  如果有一个数不是质数,那么它至少有一个因子小于等于他的平方根
*  算法效率从n变为根号n
*/
int isPrime(int n){
  if(n<2) {
    return 0;
  }
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            return 0;
        }
    }
    return 1;
}
void findPrimesByTrialDivision(int n){
    for (int i = 2; i <= n; i++) {
        if (isPrime(i)) {
            printf("%d\t", i);
        }
    }
    printf("\n");
}

埃拉托斯特尼筛法(埃氏筛法)

质数的倍数一定是非质数。从而逐步将非质数排除。
由于:如果有一个数不是质数,那么它至少有一个因子小于等于他的平方根。
所以:外层循环从2-根号n,内层循环从i*i开始。

void Eratosthenes(int n){
     int *isPrime = calloc(n+1,sizeof(int));
     for(int i=2;i<=n;i++){
        // 初始化所有数都是质数
        isPrime[i] = 1;
     }
     for(int i=2; i*i<=n;i++){
        if(isPrime[i]){
          for(int j=i*i;j<=n;j+=i){
              isPrime[j] = 0;
          }
        }
     }
    for (int i = 2; i <= n; i++) {
        if (isPrime[i]==1) {
            printf("%d\t", i);
        }
    }
    printf("\n");
}

两种方法测试

int main(){
  int n=20;
  Eratosthenes(n);
  findPrimesByTrialDivision(n);
  return 0;
}

在这里插入图片描述

运行效率

我们把打印质数的代码删掉,打印下运行时间

int main() {
    int n = 6000000;
    start = clock();
    Eratosthenes(n);
    finish = clock();
    time1 = (double) (finish - start) / CLOCKS_PER_SEC;
    printf("埃氏筛法所用时间: %f\n", time1);

    start = clock();
    findPrimesByTrialDivision(n);
    finish = clock();
    time2= (double) (finish - start) / CLOCKS_PER_SEC;
    printf("试除法所用时间: %f\n", time2);
    return 0;
}

可以看到埃氏筛法确实在数据量大的的时候效率更高。
在这里插入图片描述

相关文章:

  • 蓝桥杯真题-危险系数DF
  • L2-051 满树的遍历
  • Java的基本语法(1)
  • 彻底改变我 React 开发方式的组件模式
  • 三格电子上新款——欧姆龙 CJ/CP系列 PLC 串口转网口
  • for循环的优化方式、循环的种类、使用及平替方案。
  • LEARNING DYNAMICS OF LLM FINETUNING【论文阅读笔记】
  • 如何深入理解protobuf
  • 小型实验室数控机床-迷你型数控加工中心|CNC数控车床
  • 软考 中级软件设计师 考点知识点笔记总结 day11 文件管理 设备管理
  • 51电子表
  • AI 之 LLM(大语言模型)是如何生成文本的!
  • 力扣经典算法篇-11-除自身以外数组的乘积(总乘积求除法,左右乘积法)
  • 探索 C++ 中的 const 关键字
  • 美食推荐小程序
  • OpenFeign 的实现原理详解
  • 探索在视频深度伪造中的细微的表情变化或对特定面部特征的小改动检测方法
  • 使用numpy构建逻辑回归模型及训练流程
  • 关于哈希冲突的讨论
  • TDOA定位算法核心优势解析(2025年更新)
  • 知名做网站的公司/郑州百度网站快速优化
  • 天津建设局网站首页/免费云服务器
  • 做期货关注网站/湖北seo整站优化
  • 太原网站优化方案/自动点击器安卓
  • 德兴网站建设公司/网络推广方法怎么做
  • 有没有便宜的网站制作/无锡网站建设