使用C语言计算素数(质数)

        在C语言的学习中,尤其是C语言的初学者来说,求质数是非常常见的一种题目,也是入门必备代码。

        那么,什么是质数,质数是一个正自然数,只有两个正自然数除数,一和它本身。

        所以,我们要求一个数字是不是质数可以分为以下两步:

        1,质数是一个正自然数,又因为1只有自己一个除数,所以1 不是素数,所以第一步判断目标数字是不是一个大于1的正自然数。

        2,判断目标数字有几个正自然数除数,如果只有其本身和1即符合条件。

详细代码如下:

#include <stdio.h>
int main()
{
    int a;
    printf("请输入目标数字:");
    scanf("%d", &a);/*输入要判断的目标数字*/
    if (a>1)/*第一次判断*/
    {
        int judge = 0;/*用来记录目标数字是不是为素数,如过不是我们改变judge的值来判断输出*/
        /*如果满足正自然数的条件继续判断自然数是否符合*/
        for (int i = 2; i < a; i++)/*判断在2->a-1的范围内是否还有其他的除数*/
        {
            if (a % i == 0)/*如果存在即不符合条件*/
            {
                printf("该数字不是素数");
                judge = 1;/*改变judge*/
                break;
            }
        }
        if (judge==0)/*judge等于0代表在素数判断过程中未被改变*/
        {
            printf("%d是一个素数", a);
        }
    }
    else
        printf("该数字不是素数");

    return 0;
}

看运行结果:

        以上就是一个判断素数的简单代码,但是对素数的求解远不止如此,我继续往下看。

        在以上代码中,我们在第二步的判断中遍历了从2至目标数字-1的全部数字,虽然可以解决问题,但是明显会浪费打量的运行时间,因为相当大的后一部分的数字其实没有必要判。

        举个例子,假如我们现在要判断9是不是素数,我们需要判断2到8的6个数字,但是由素数的定义可知,他只有1和自身两个正自然数除数,所以我们可以对9开根号的到3,即如果在判断到3时还没有数字可以整除目标数字,那么通过简单的数学知识就可以想到以后剩余大数字也就不可在整除目标数字,而这样的改变使得在判断3时由原来的6次变为2次。

        所以我们将代码修改如下:

#include <stdio.h>
#include <math.h>
int main()
{
    int a;
    printf("请输入目标数字:");
    scanf("%d", &a);/*输入要判断的目标数字*/
    if (a>1)/*第一次判断*/
    {
        int judge = 0;/*用来记录目标数字是不是为素数,如过不是我们改变judge的值来判断输出*/
        /*如果满足正自然数的条件继续判断自然数是否符合*/
        for (int i = 2; i < sqrt(a); i++)/*判断在2->a-1的范围内是否还有其他的除数*/
        {
            if (a % i == 0)/*如果存在即不符合条件*/
            {
                printf("该数字不是素数");
                judge = 1;/*改变judge*/
                break;
            }
        }
        if (judge==0)/*judge等于0代表在素数判断过程中未被改变*/
        {
            printf("%d是一个素数", a);
        }
    }
    else
        printf("该数字不是素数");
    return 0;
}

        有了以上的代码我们还可以继续加强他的功能,比如输出一定范围内的所有素数,或者判断一定范围内的素数个数,本篇主要讲解素数的判断,这里就不在多说了,如有需要,可以私信我讨论。        

        关于素数的解法还有很多,这里只讲我最常用的两种,大家可以着重理解一下第二种,因为可以有效的提高代码的运行效率。

        代码如有不严谨只处欢迎大家批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值