如何用C语言求素数

一、素数的概念

素数是指在大于1的自然数中,除了1和它本身以外,不能被其他自然数整除的数。比如2、3、5、7等都是素数。

为了方便,我们用n代表待判断的数。判断n是否为素数,就是判断n能否被2到n-1之间的任何一个数整除,如果不能,那么n就是素数。

二、常见的求素数算法

1. 直接判断法

bool is_prime(int n){
    if(n <= 1){  //小于等于1的数不是素数
        return false;
    }
    for(int i=2; i<n; i++){
        if(n % i == 0){  //如果n能被i整除,那么n不是素数
            return false;
        }
    }
    return true;
}

直接判断法是一种比较简单的方法,但是对于大的素数来说,速度会比较慢。

2. 厄拉多塞筛法

厄拉多塞筛法的基本思想是从2开始,将每个素数的倍数都标记为合数,以达到筛选素数的目的。具体步骤如下:

(1)先将 2~n 中的所有整数写下来;

(2)先把 2 的倍数都打上标记,除了2;

(3)再把 3 的倍数都打上标记,除了3;

(4)接着找下一个素数 5,重复上述过程;

(5)一直重复下去,直到某个数的平方大于n为止。此时,还没有被标记的数就是素数。

void prime_sieve(int n, bool *is_prime){
    memset(is_prime, true, (n+1)*sizeof(bool));
    is_prime[0] = false;
    is_prime[1] = false;
    for(int i=2; i*i<=n; i++){
        if(is_prime[i]){
            for(int j=i*i; j<=n; j+=i){
                is_prime[j] = false;
            }
        }
    }
}

三、比较两种算法的效率

下面我们来比较一下这两种算法的效率。测试数据为n=1,000,000。

#include 
#include 
#define N 1000000

int main(){
    bool is_pri[N+1];
    clock_t start, end;
    double duration;

    start = clock();
    prime_sieve(N, is_pri);
    end = clock();
    duration = (double)(end - start) / CLOCKS_PER_SEC;
    printf("prime_sieve: %.5fs\n", duration);

    start = clock();
    for(int i=1; i<=N; i++){
        is_prime(i);
    }
    end = clock();
    duration = (double)(end - start) / CLOCKS_PER_SEC;
    printf("is_prime: %.5fs\n", duration);

    return 0;
}

测试结果如下所示:

prime_sieve: 0.00800s
is_prime:  11.91400s

可以看出,厄拉多塞筛法的效率远高于直接判断法。

四、总结

求素数是算法中比较基础的部分,在实际应用中也经常用到。本文介绍了两种常见的求素数算法,包括直接判断法和厄拉多塞筛法,并比较了它们的效率。用C语言实现求素数的过程也可以帮助读者更好地理解算法的实现过程。

原创文章,作者:JGYOA,如若转载,请注明出处:https://www.506064.com/n/372964.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JGYOAJGYOA
上一篇 2025-04-25 15:26
下一篇 2025-04-25 15:26

相关推荐

  • 如何用Python写爱心

    本文将会从多个方面阐述如何用Python语言来画一个美丽的爱心图案。 一、准备工作 在开始编写程序之前,需要先理解一些编程基础知识。首先是绘图库。Python有很多绘图库,常见的有…

    编程 2025-04-29
  • 用不同的方法求素数

    素数是指只能被1和自身整除的正整数,如2、3、5、7、11、13等。素数在密码学、计算机科学、数学、物理等领域都有着广泛的应用。本文将介绍几种常见的求素数的方法,包括暴力枚举法、埃…

    编程 2025-04-29
  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • 如何用Python统计列表中各数据的方差和标准差

    本文将从多个方面阐述如何使用Python统计列表中各数据的方差和标准差, 并给出详细的代码示例。 一、什么是方差和标准差 方差是衡量数据变异程度的统计指标,它是每个数据值和该数据值…

    编程 2025-04-29
  • 学习Python对学习C语言有帮助吗?

    Python和C语言是两种非常受欢迎的编程语言,在程序开发中都扮演着非常重要的角色。那么,学习Python对学习C语言有帮助吗?答案是肯定的。在本文中,我们将从多个角度探讨Pyth…

    编程 2025-04-29
  • Python被称为胶水语言

    Python作为一种跨平台的解释性高级语言,最大的特点是被称为”胶水语言”。 一、简单易学 Python的语法简单易学,更加人性化,这使得它成为了初学者的入…

    编程 2025-04-29
  • OpenJudge答案1.6的C语言实现

    本文将从多个方面详细阐述OpenJudge答案1.6在C语言中的实现方法,帮助初学者更好地学习和理解。 一、需求概述 OpenJudge答案1.6的要求是,输入两个整数a和b,输出…

    编程 2025-04-29
  • Python按位运算符和C语言

    本文将从多个方面详细阐述Python按位运算符和C语言的相关内容,并给出相应的代码示例。 一、概述 Python是一种动态的、面向对象的编程语言,其按位运算符是用于按位操作的运算符…

    编程 2025-04-29
  • 如何用Python对数据进行离散化操作

    数据离散化是指将连续的数据转化为离散的数据,一般是用于数据挖掘和数据分析中,可以帮助我们更好的理解数据,从而更好地进行决策和分析。Python作为一种高效的编程语言,在数据处理和分…

    编程 2025-04-29
  • 如何用Python打印温度转换速查表

    本文将从多个方面阐述如何用Python打印温度转换速查表,以便于快速进行温度转换计算。 一、Python打印温度转换速查表的基本知识 在计算机编程领域中,温度转换是一个重要的计算。…

    编程 2025-04-29

发表回复

登录后才能评论