首页 > 编程语言 >一文解决如何使用 C 语言判断质数(素数)[ 附解析与源码 ]

一文解决如何使用 C 语言判断质数(素数)[ 附解析与源码 ]

时间:2023-01-21 21:22:35浏览次数:55  
标签:判断 函数 int 质数 number 素数 源码 平方根

前言

质数历来都是数学界的宠儿,是数学里神秘的谜团。

质数又和 C 语言有着不解之缘,本篇文章将讲解如何用 C 语言判断质数。

为了方便大家在读完此文章后使用文中程序,我会将判断质数的程序封装成函数,此函数的功能是:判断形参 _number 是否是质数,若 _number 是质数,则返回 1;若不是质数,则返回 0

何为质数

质数又称素数。一个大于 1 的自然数,除了 1 和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定 1 既不是质数也不是合数)。

C 语言判断质数

在了解了质数的定义后,现在我们便可以着手编写程序啦。

现在给定一个正整数 number,要求我们判断此数是否为质数。针对这一要求本篇采用两种判断方法,分别是:暴力求解 与 巧用平方根。

暴力求解

通过质数的定义可以得到如何判断一个数是否为质数, 我们可以通过遍历从 2number - 1 这个区间中的所有数,如果都不能被 number 整除,则 number 是质数,否则 number 不是质数。

具体代码如下:

/****************************************************************************
* 函数名:  Judge_PrimeNumber
* 功能描述:判断一个数是否为质数
* 输入参数:
*			_number:需要判断的数
* 返回值:
*			1:是质数
*			0:不是质数
* 外部参数:无
* 注意事项:无
*
* 作者:	梁国庆
* 日期:	2021-12-11
* 修改记录:
****************************************************************************/
int Judge_PrimeNumber(int _number)
{
    int i = 0;

    if (_number < 2)
    {
        return 0;   /* 需要判断的数小于 2,则不是质数,返回 0 */
    }

    for (i = 2; i < _number; i++)   /* 遍历从 2 到 _number - 1 区间中的所有数 */
    {
        if (_number % i == 0)
        {
            return 0;               /* 若可以被整除,则不是质数,返回 0 */
        }
    }

    return 1;       /* 若执行完以上程序均未返回,则是指数,返回 1 */
}

巧用平方根

使用暴力求解固然可以求出一个数是否为质数,但运算次数是最多的,运行速度也是最慢的,我们还可以将程序进行优化,提升程序运行时的效率。

在一般领域,对正整数 number,如果用 2 到 $\sqrt{number}$ 之间的所有整数去除,均无法整除,则 number 为质数。那么就可以利用这一方法,巧用平方根判断一个数是否为质数。

在 C 语言中求平方根可以使用 C 标准库,<math.h> 头文件中定义了各种数学函数,sqrt() 函数是平方根函数,功能是计算一个非负实数的平方根,调用时程序要包含 <math.h> 头文件。

具体代码如下:

/****************************************************************************
* 函数名:  Judge_PrimeNumber
* 功能描述:判断一个数是否为质数
* 输入参数:
*			_number:需要判断的数
* 返回值:
*			1:是质数
*			0:不是质数
* 外部参数:无
* 注意事项:无
*
* 作者:	梁国庆
* 日期:	2021-12-11
* 修改记录:
****************************************************************************/
int Judge_PrimeNumber(int _number)
{
    int i = 0;

    if (_number < 2)
    {
        return 0;   /* 需要判断的数小于 2,则不是质数,返回 0 */
    }

    for (i = 2; i <= sqrt(_number); i++)    /* 遍历从 2 到 √_number 区间中的所有数 */
    {
        if (_number % i == 0)
        {
            return 0;                       /* 若可以被整除,则不是质数,返回 0 */
        }
    }

    return 1;       /* 若执行完以上程序均未返回,则是指数,返回 1 */
}

如何调用函数

对于如何使用 C 语言判断质数,共讲解了两种方法并分别将编写的程序封装成为函数,现在我们来讲解一下如何在实际应用中调用它们。

在这里,我以巧用平方根为例进行讲解(暴力求解的调用方法与之相同),也特别推荐大家在以后的使用中优先选择巧用平方根这种方法,因为通过平方根进行判断是运算次数最少的,可以极大的提高我们程序的效率。

样例代码中,我们输入一个整数,然后调用判断质数的函数,若输入的数是质数则输出 Yes,否则输出 No

具体代码如下:

#include <stdio.h>
#include <math.h>   /* 包含 <math.h> */

/****************************************************************************
* 函数名:  Judge_PrimeNumber
* 功能描述:判断一个数是否为质数
* 输入参数:
*			_number:需要判断的数
* 返回值:
*			1:是质数
*			0:不是质数
* 外部参数:无
* 注意事项:无
*
* 作者:	梁国庆
* 日期:	2021-12-11
* 修改记录:
****************************************************************************/
int Judge_PrimeNumber(int _number)
{
    int i = 0;

    if (_number < 2)
    {
        return 0;   /* 需要判断的数小于 2,则不是质数,返回 0 */
    }

    for (i = 2; i <= sqrt(_number); i++)    /* 遍历从 2 到 √_number 区间中的所有数 */
    {
        if (_number % i == 0)
        {
            return 0;                       /* 若可以被整除,则不是质数,返回 0 */
        }
    }

    return 1;       /* 若执行完以上程序均未返回,则是指数,返回 1 */
}

int main()
{
    int N = 0;

    scanf("%d", &N);

    if (Judge_PrimeNumber(N) == 1)  /* 调用判断质数的函数,判断输入的整数 N */
    {
        printf("Yes\n");            /* 是质数,则输出 Yes */
    }
    else
    {
        printf("No\n");             /* 否则输出 No */
    }

    return 0;
}

后记

至此,我们讲解了关于质数的定义,带领大家编写了 C 语言判断质数的程序代码,并将所写代码封装成为函数,同时为大家演示了如何调用函数来判断质数。
相信看完本篇文章的你,以后再遇到 C 语言判断质数的问题,可以解决的游刃有余。

标签:判断,函数,int,质数,number,素数,源码,平方根
From: https://www.cnblogs.com/main-studio/p/17064035.html

相关文章

  • go RWMutex源码分析
    适用场景并发场景下读多写少。字段含义RWMutex基于Mutex,写优先,Lock函数(反转readerCount)会阻止新的reader获取锁。typeRWMutexstruct{  wMutex  // writer......
  • go sync.Once源码分析
    适用场景服务启动时读取全局配置。单个函数流程里面只调用一次。源码双重检查done值是0后,加锁执行指定函数并把done值改成1。typeOncestruct{ doneuint32 mM......
  • 程序:运用函数找出100至200的素数,并数出个数
    #include<stdio.h>intif_a_is_prime(intd){intc=2;for(c=2;c<d;c++){if(d%c==0){return0;}}return1;}intmain(){inta=......
  • 质数距离
    质数距离给定两个整数$L$和$U$,你需要在闭区间$[L,U]$内找到距离最接近的两个相邻质数$C_1$和$C_2$(即$C_2−C_1$是最小的),如果存在相同距离的其他相邻质数对,则输......
  • Java/JS/Python/Go语言设计模式大全【精品源码】
    DesignPattern23种经典设计模式源码详解经典设计模式源码详解,用不同语言来实现,包括Java/JS/Python/TypeScript/Go等。结合实际场景,充分注释说明,每一行代码都经过检验,确......
  • DBNet源码详解
    参考项目:https://github.com/WenmuZhou/DBNet.pytorch标签制作制作thresholdmap标签make_border_map.py程序入口if__name__=='__main__'if__name__=='__main......
  • 质数
    定义质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定0,1既不是质数也不是合数)。互质是公约数只有1的两个整数,叫做互质......
  • 【Django drf】 序列化类常用字段类和字段参数 定制序列化字段的两种方式 关系表外键
    目录序列化类常用字段类和字段参数常用字段类常用字段参数选项参数通用参数序列化类高级用法之sourcesource填写类中字段source填写模型类中方法source支持跨表查询定制序......
  • ecs-lite 源码简单分析
    初学typescript,分析的不到位欢迎指正。 ecs-lite基于ts实现的纯ecs库,可用于学习交流及H5游戏开发!https://gitee.com/aodazhang/ecs-lite?_from=gitee_search文......
  • DBNet源码详解
    参考项目:https://github.com/WenmuZhou/DBNet.pytorch标签制作制作thresholdmap标签make_border_map.py程序入口if__name__=='__main__'if__name__=='__main......