目录
前言:
开新专栏了,讲解100道基础语法编程题
用c语言讲解
目的是复习c语言中的基础语法,为单片机中的c语言代码分析做铺垫
专栏链接:
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;
}