[编程题]13、素数判定

目录

前言:

1、题目展示:

2、问题分析:

3、最终代码展示:


前言:

开新专栏了,讲解100道基础语法编程题

用c语言讲解

目的是复习c语言中的基础语法,为单片机中的c语言代码分析做铺垫

专栏链接:

c语言基础语法编程题_1zero10的博客-CSDN博客

1、题目展示:

 

2、问题分析:

首先是要介绍 一下常规的素数判定的函数

先展示代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

bool isprime(int x) {
        for (int i = 2;i * i <= x;++i) {
                if (x % i == 0) {
                        return false;
                }
        }
        return true;
}

int main() {
        

        return 0;
}

要使用bool函数,首先需要包含头文件<stdbool.h>

第5行到第12行为常规判断素数的函数

首先看 函数的基本定义规则

返回值类型:bool类型 要么是true要么是false

函数名:isprime prime:素数,质数

然后参数列表:整型的形参x

下面重点看函数体:

首先需要介绍一个概念

素数就是所有的因数就是1和它本身,无法拆成非1的数和另一个数的乘积的形式

假设一个数x,它有一个因子(因数)是i,那么另一个因子就是x/i

i和x/i之间必然存在一个大小关系,无论大小关系如何,两个数中,至少有一个数小于等于根号x

因此我们就可以理解for循环括号内的初始化语句,条件判断语句,条件控制语句了

初始化i=2 然后条件判断语句是i*i<=x,再看第7行x%i==0

含义就是,让x模上非1的数,如果等于0,也就是除得尽,那么就不是素数,输出false

循环直至i*i<=x,再循环就没有意义了,因为任意一个数的其中一个因数,必然小于等于其平方根

然后经过6、7、8、9行,无法整除任何一个非1的数,那么就是素数了

再for循环外围return true

下面我们正式来解决这道题

以下是完整代码,一起来分析

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

bool isprime(int x) {
        for (int i = 2;i * i <= x;++i) {
                if (x % i == 0) {
                        return false;//0
                }
        }
        return true;//1
}

int main() {
        int x, y;
        while (scanf("%d%d", &x, &y) == 2) {
                if (x == 0 && y == 0)break;
                bool flag = false;
                for (int j = x;j <= y;++j) {
                        int z = j * j + j + 41;
                        if (!isprime(z)) { //只有当z不是素数,才能进行if循环内的代码
                                flag = true;
                                break;
                        }
                }//break跳到了这里
                if (flag == false) {  //也就是flag没有因为上面的if语句改变,即经过整个for循环都没有发现非素数
                        printf("OK\n");
                }
                else {  //也就是flag==true时,也就是发现在[x,y]范围内有非素数时
                        printf("Sorry\n");
                }
        }

        return 0;
}

从14行main函数开始看

外面的while循环输入x,y老生常谈了

主要看while循环内的

17行,满足题目的要求,当x=0,y=0时,表示输入结束,该行不做处理。

18行,设置一个标记flag=false

19-25行,遍历x到y范围内的所有数,看看带入表达式n^2+n+41后是否为素数,如果存在非素数,那么22行flag的值置为true,并且跳出循环

26行,如果在19-25行没有发现非素数,也就是flag没有因为上面的if语句改变,即经过整个for循环都没有发现非素数,那么输出OK

29行,否则,也就是flag==true时,也就是发现在[x,y]范围内有非素数时,输出Sorry

3、最终代码展示:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

bool isprime(int x) {
        for (int i = 2;i * i <= x;++i) {
                if (x % i == 0) {
                        return false;//0
                }
        }
        return true;//1
}

int main() {
        int x, y;
        while (scanf("%d%d", &x, &y) == 2) {
                if (x == 0 && y == 0)break;
                bool flag = false;
                for (int j = x;j <= y;++j) {
                        int z = j * j + j + 41;
                        if (!isprime(z)) { //只有当z不是素数,才能进行if循环内的代码
                                flag = true;
                                break;
                        }
                }//break跳到了这里
                if (flag == false) {  //也就是flag没有因为上面的if语句改变,即经过整个for循环都没有发现非素数
                        printf("OK\n");
                }
                else {  //也就是flag==true时,也就是发现在[x,y]范围内有非素数时
                        printf("Sorry\n");
                }
        }

        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值