中国电子学会2020年06月真题C语言软件编程等级考试三级(含详细解析答案)

中国电子学会考评中心历届真题(含解析答案)

C语言软件编程等级考试三级 2020年06月

编程题五道							总分:100分

一、最接近的分数(20分)
分母不超过N且小于A/B的最大最简分数是多少?
时间限制: 1000ms
内存限制: 65536kb
输入
三个正整数N,A,B,相邻两个数之间用单个空格隔开。1<=A<B<N <= 1000。
输出
两个正整数,分别是所求分数的分子和分母,中间用单个空格隔开。
样例输入

100 7 13

样例输出

50 93
#include <stdio.h>	// 引入C标准输入输出库,用于scanf和printf函数// 定义common函数,用于计算两个浮点数的最大公约数
double common(double x, double y) {double m = x, n = y, r;// 使用do-while循环计算最大公约数do {r = (int)m % (int)n; // 求m除以n的余数m = n; // 更新m为nn = r; // 更新n为余数r} while (r != 0); // 当余数为0时,循环结束,n中存放的就是最大公约数return m; // 返回最大公约数
}int main() {double sum, a, b, n, i, A, B, max = 0, p, q;// 从标准输入读取n, a, b三个值scanf("%lf %lf %lf", &n, &a, &b);// 外层循环,B从n递减到1for (B = n; B >= 1; B--) {// 内层循环,A从1开始递增for (A = 1; ; A++) {// 如果A/B大于a/b,则跳出内层循环if (A / B > a / b)break;// 如果A/B在max和a/b之间,则更新max,并计算p和qif (A / B > max && A / B < a / b) {max = A / B;p = A / common(A, B); // 计算A与B的最大公约数,并求A除以最大公约数的结果q = B / common(A, B); // 计算A与B的最大公约数,并求B除以最大公约数的结果}}}// 输出p和q的值printf("%g %g", p, q);return 0;
}/*代码的功能是寻找一对分数(A/B)和(p/q),其中A和B是整数,且满足以下条件:1. <= B <= n,其中n是用户输入的一个整数。2. A/B在0和a/b之间,其中a和b也是用户输入的两个整数,且b不为0。3. A/B尽可能地接近a/b,但不能超过它。4. p和q分别是A和B除以它们的最大公约数(GCD)的结果。common函数使用辗转相除法(欧几里得算法)来计算两个浮点数的最大公约数。main函数读取用户输入的n, a, b,然后通过两个嵌套的for循环来找到满足条件的A和B。内层循环从A=1开始递增,并检查A/B是否满足条件。如果满足,则更新max、p和q的值。当A/B超过a/b时,内层循环结束。外层循环负责递减B的值,直到B=1。最后,程序输出找到的p和q的值。注意:代码中的sum和i变量未被使用,可以删除。由于使用了double类型来表示分数,可能会引入精度问题。在实际应用中,可能需要使用其他方法来精确表示分数。common函数中的类型转换(int)m和(int)n可能会导致精度损失。在C语言中,double转int会进行向下取整。如果m和n非常大或非常小,这可能会导致问题。但在本例中,由于m和n都是整数或整数的倒数,所以这种转换应该是安全的。
*/

二、和数(20分)
给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。比如,对于数列1234,这个问题的答案就是2,因为3 =2 +1,4 = 1 +3。
时间限制: 1000ms
内存限制: 65536kb
输入
共两行,第一行是数列中数的个数n ( 1 <= n <= 100),第二行是由n个不大于10000的正整数组成的数列,相邻两个整数之间用单个空格隔开。
输出
一个整数,即数列中等于其他两个数之和的数的个数。
样例输入

4
1 2 3 4

样例输出

2
#include <stdio.h>  // 引入标准输入输出库,用于scanf和printf函数int main() {  // 主函数入口int n;  // 定义一个整数n,用于存储数组的长度int a[100],count=0;  // 定义一个最大长度为100的整数数组a和一个计数器count,并初始化count为0// 输入数据scanf("%d",&n);  // 从标准输入读取一个整数,并存储到n中for(int i=0; i<n; i++){  // 遍历数组a,用于输入n个整数scanf("%d",&a[i]);  // 从标准输入读取一个整数,并存储到数组a的第i个位置}// 枚举所有数for(int i=0; i<n; i++){  // 遍历数组aint f=0;  // 定义一个标志变量f,用于表示当前数是否可以表示为其他两数之和,初始化为0(表示不可以)for(int c=0; c<n; c++){  // 遍历数组a,用于寻找可能的加数cif(c==i)  // 如果c和i相等(即不和自己判断)continue;  // 则跳过当前循环,继续下一次循环for(int d=0; d<n; d++){  // 遍历数组a,用于寻找可能的加数dif(d==i || d==c)  // 如果d和i或d和c相等continue;  // 则跳过当前循环,继续下一次循环if(a[i]==a[c]+a[d])  // 如果a[i]等于a[c]和a[d]的和f=1;  // 则将标志变量f设置为1(表示可以表示为其他两数之和)}}// 统计个数if(f)  // 如果f为1count++;  // 则计数器count加1}printf("%d",count);  // 输出计数器count的值,即可以表示为其他两数之和的数的个数return 0;  // 主函数返回0,表示程序正常结束
}/*需要注意的是,这段代码的时间复杂度是O(n^3),在n较大时可能会非常慢。此外,由于它使用了三重循环,对于每个数都检查了其他所有数对,因此效率不高。在实际应用中,可能需要考虑更高效的算法来解决这个问题。
*/

三、吃糖果(20分)
名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有N块巧克力,20>N>0)。妈妈告诉名名每天可以吃一块或者两块巧克力。假设名名每天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案。
例如:如果N=1,则名名第1天就吃掉它,共有1种方案;
如果N=2,则名名可以第1天吃1块,第2天吃1块,也可以第1天吃2块,共有2种方案;
如果N=3,则名名第1天可以吃1块,剩2块,也可以第1天吃2块剩1块,所以名名共有2+1=3种方案;
如果N=4,则名名可以第1天吃1块,剩3块,也可以第1天吃2块,剩2块,共有3+2=5种方案。
现在给定N,请你写程序求出名名吃巧克力的方案数目。
时间限制: 1000ms
内存限制: 65536kB
输入
输入只有1行,即整数N。
输出
输出只有1行,即名名吃巧克力的方案数。
样例输入

4

样例输出

5
#include <stdio.h>  // 引入C标准输入输出库,用于scanf和printf函数int main() {  // 主函数入口int n;  // 定义一个整数变量n,用于存储用户要查询的斐波那契数列的项数int a[20];  // 定义一个整数数组a,大小为20,用于存储斐波那契数列的前20项// 输入数据scanf("%d",&n);  // 从标准输入读取一个整数,并存储在变量n中// 初始化斐波那契数列的前两项a[0]=1;  // 斐波那契数列的第0项是1a[1]=2;  // 斐波那契数列的第1项是2// 计算斐波那契数列的剩余项for(int i=2; i<n; i++){  // 从第2项开始,计算到第n-1项a[i]=a[i-1]+a[i-2];  // 每一项都是前两项的和}// 输出斐波那契数列的第n项printf("%d",a[n-1]);  // 注意,数组是从0开始索引的,所以第n项实际上是a[n-1]return 0;  // 主函数返回0,表示程序正常结束
}
/*注意:虽然代码逻辑是正确的,但是有一个小问题。如果用户输入的n大于20,那么代码将会访问数组a的越界索引,这会导致未定义的行为。在实际应用中,应该添加对n的合法性检查,或者动态分配数组的大小以适应更大的n值。
*/

四、汉诺塔问题(20分)
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。
要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
如何移?最少要移动多少次?
时间限制: 1000ms
内存限制: 65536kb
输入
输入为一个整数后面跟三个单字符字符串。
整数为盘子的数目,后三个字符表示三个杆子的编号。
输出
输出每一步移动盘子的记录。一次移动一行。
每次移动的记录为例如3:a->b的形式,即把编号为3的盘子从a杆移至b杆。
我们约定圆盘从小到大编号为1,2,…n。即最上面那个最小的圆盘编号为1,最下面最大的圆盘编号为n。
样例输入

3 a b c

样例输出

1:a->c
2:a->b
1:c->b
3:a->c
1:b->a
2:b->c
1:a->c
#include <stdio.h>	// 引入C标准输入输出库,用于scanf和printf函数// 定义find函数,用于将n个盘子从a柱移动到c柱,以b柱作为辅助
void find(int n, char a, char b, char c) {if(n == 1) { // 如果只有一个盘子printf("%d:%c->%c\n", n, a, c); // 直接从a柱移动到c柱return; // 返回}find(n - 1, a, c, b); // 先将n-1个盘子从a柱移动到b柱,以c柱作为辅助printf("%d:%c->%c\n", n, a, c); // 然后将最后一个盘子从a柱移动到c柱find(n - 1, b, a, c); // 最后将n-1个盘子从b柱移动到c柱,以a柱作为辅助
}int main() {int n; // 定义盘子数量char a, b, c; // 定义三个柱子的名称scanf("%d %c %c %c", &n, &a, &b, &c); // 从用户处获取输入:盘子数量和三个柱子的名称find(n, a, b, c); // 调用find函数开始汉诺塔问题的求解return 0; // 程序结束
}/*这段代码使用了递归的方式来解决汉诺塔问题。对于n个盘子,它首先将n-1个盘子从起始柱子移动到过渡柱子,然后将最大的盘子从起始柱子移动到目标柱子,最后再将n-1个盘子从过渡柱子移动到目标柱子。这个过程重复进行,直到所有的盘子都被移动到目标柱子。
*/

五、文件结构“图“(20分)
在计算机上看到文件系统的结构通常很有用。Microsoft Windows上面的"explorer"程序就是这样的一个例子。但是在有图形界面之前,没有图形化的表示方法的,那时候最好的方式是把目录和文件的结构显示成一个"图"的样子,而且使用缩排的形式来表示目录的结构。比如:

ROOT
| dir1
| file1
| file2
| file3
| dir2
| dir3
| file1
file1
file2

这个图说明:ROOT目录包括三个子目录和两个文件。第一个子目录包含3个文件,第二个子目录是空的,第三个子目录包含一个文件。
时间限制: 1000ms
内存限制: 65536kb
输入
你的任务是写一个程序读取一些测试数据。每组测试数据表示一个计算机的文件结构。每组测试数据以’*‘结尾,而所有合理的输入数据以’#‘结尾。一组测试数据包括一些文件和目录的名字(虽然在输入中我们没有给出,但是我们总假设ROOT目录是最外层的目录)。在输入中,以’]‘表示一个目录的内容的结束。目录名字的第一个字母是’d’,文件名字的第一个字母是’f’。文件名可能有扩展名也可能没有(比如fmyfile.dat和fmyfile)。文件和目录的名字中都不包括空格,长度都不超过30。一个目录下的子目录个数和文件个数之和不超过30。
输出
在显示一个目录中内容的时候,先显示其中的子目录(如果有的话),然后再显示文件(如果有的话)。文件要求按照名字的字母表的顺序显示(目录不用按照名字的字母表顺序显示,只需要按照目录出现的先后显示)。对每一组测试数据,我们要先输出"DATA SET x:" ,这里x是测试数据的编号((从1开始)。在两组测试数据之间要输出一个空行来隔开。
你需要注意的是,我们使用一个’|'和5个空格来表示出缩排的层次。

样例输入

file1
file2
dir3
dir2
file1
file2
]
]
file4
dir1
]
file3
*
file2
file1
*
#

样例输出

DATA SET 1:
ROOT
| dir3
|| dir2
|| file1
|| file2
| dir1
file1
file2
file3
file4DATA SET 2:
ROOT
file1
file2

提示
一个目录和它的子目录处于不同的层次
一个目录和它的里面的文件处于同一层次

#include<iostream>  // 引入输入输出流库
#include<set>       // 引入集合库
#include<string>    // 引入字符串库using namespace std;  // 使用标准命名空间int flag;  // 定义一个全局变量flag,用于标记是否已经打印了ROOT// 定义一个函数printkg,用于打印指定长度的竖线和空格
void printkg(int l){for(int i = 0; i < l; ++i)printf("| ");
}// 定义一个函数pf,用于处理用户的输入
void pf(int l){string str;  // 定义一个字符串变量str,用于存储用户的输入set<string> dir;  // 定义一个字符串集合dir,用于存储目录结构if(!flag){  // 如果flag为0(即未打印ROOT)printf("ROOT\n");  // 打印ROOTflag = 1;  // 将flag设置为1,表示已经打印了ROOT}while(cin >> str){  // 循环读取用户的输入switch(str[0]){  // 根据输入的第一个字符进行不同的操作case 'f':  // 如果输入的第一个字符是'f'dir.insert(str);  // 将整个输入字符串添加到目录集合中break;  // 结束switch语句case 'd':  // 如果输入的第一个字符是'd'printkg(l);  // 打印指定长度的竖线和空格cout << str << endl;  // 打印输入的字符串(表示一个新的目录)pf(l + 1);  // 递归调用pf函数,增加层级break;  // 结束switch语句case ']':  // 如果输入的第一个字符是']'for(set<string>::iterator i = dir.begin(); i != dir.end(); ++i){  // 遍历目录集合printkg(l - 1);  // 打印指定长度的竖线和空格(比当前层级少一级)cout << *i << endl;  // 打印目录集合中的每个字符串(表示返回上一级目录)}return;  // 结束函数case '*':  // 如果输入的第一个字符是'*'for(set<string>::iterator i = dir.begin(); i != dir.end(); ++i)cout << *i << endl;  // 打印目录集合中的所有字符串(表示列出当前目录的所有文件和子目录)cin.get();  // 读取一个字符(可能是为了消耗输入流中的换行符或其他字符)return;  // 结束函数}}
}int main(){int n = 1;  // 定义一个变量n,用于表示数据集的编号while(cin.peek() != '#'){  // 循环读取输入,直到遇到'#'字符为止printf("DATA SET %d:\n", n);  // 打印数据集的编号flag = 0;  // 将flag重置为0,表示未打印ROOTpf(1);  // 从第一层级开始处理用户的输入++n;  // 增加数据集的编号printf("\n");  // 打印一个空行,用于分隔不同的数据集}return 0;  // 程序结束
}/*这个程序通过用户输入的不同字符来模拟目录树的操作,如创建新目录、返回上一级目录、列出当前目录的内容等。程序使用了一个字符串集合来存储目录结构,并使用递归函数来处理不同层级的目录操作。
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据之光:探索数据库技术的演进之路

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

喜讯!持安科技CEO何艺获评安全419《2023年度十大优秀创业者》

近日&#xff0c;由网络安全产业资讯媒体安全419主办的《年度策划》2023年度十大优秀创业者正式出炉&#xff0c;零信任办公安全技术创新企业持安科技创始人兼CEO何艺&#xff0c;获评十大优秀创业者。 这是安全419第二届推出该项目的评选活动&#xff0c;安全419编辑老师在多年…

抽象类、模板方法模式

抽象类概述 在Java中abstract是抽象的意思&#xff0c;如果一个类中的某个方法的具体实现不能确定&#xff0c;就可以申明成abstract修饰的抽象方法&#xff08;不能写方法体了&#xff09;&#xff0c;这个类必须用abstract修饰&#xff0c;被称为抽象类。 抽象方法定义&…

【解决】修改 UI界面渲染层级 的常见误区

开发平台&#xff1a;Unity 2021版本   问题描述 Unity 中管理 UI 上显示元素的前后层级关系大致为以下两种方式&#xff1a; 方式一&#xff1a;修改UI元素队列顺序与层级方式二&#xff1a;使用 Canvas 组件中的 Override Sort 属性配置 方式二 对应复杂的 UI 层级关系将常…

这些单片机汇编语言的错误,你还在犯错吗?

在单片机开发中&#xff0c;很多工程师会选择汇编语言来作为底层编程&#xff0c;来直接控制硬件和高校执行命令&#xff0c;然而因为汇编语言是直接与硬件交互&#xff0c;所以很容易出现错误&#xff0c;本文将基于Keil C51汇编器的环境总结单片机汇编语言常见的错误&#xf…

人工智能_大模型010_Centos7.9中CPU安装ChatGLM3-6B大模型_安装使用_010---人工智能工作笔记0145

从一个空的虚拟机开始安装: https://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/files 可以看到这里有很多的数据文件,那么这里 这里点击模型文件就可以下载,这个就是chatglm3-6B的文件,需要点击每个文件,然后点击右边的下载,把文件都下载下来 右侧有下载按钮.点击下载可…

使用Fabric创建的canvas画布背景图片,自适应画布宽高

之前的文章写过vue2使用fabric实现简单画图demo&#xff0c;完成批阅功能&#xff1b;但是功能不完善&#xff0c;对于很大的图片就只能显示一部分出来&#xff0c;不符合我们的需求。这就需要改进&#xff0c;对我们设置的背景图进行自适应。 有问题的canvas画布背景 修改后的…

Unity2023.1.19_ECS

Unity2023.1.19_ECS 在学习的路上一往无前的遇到了好东西&#xff0c;官方的EntityComponnentSystemSamples的Repository&#xff0c;这是一个包含实体&#xff0c;图形&#xff0c;网络&#xff0c;物理案例的全方位案例教程。 又找见接下来要干的事情了&#xff01;学习永无…

【rust】11、所有权

文章目录 一、背景二、Stack 和 Heap2.1 Stack2.2 Heap2.3 性能区别2.4 所有权和堆栈 三、所有权原则3.1 变量作用域3.2 String 类型示例 四、变量绑定背后的数据交互4.1 所有权转移4.1.1 基本类型: 拷贝, 不转移所有权4.1.2 分配在 Heap 的类型: 转移所有权 4.2 Clone(深拷贝)…

Quartz 任务调度框架源码阅读解析

概念: quartz 是一个基于JAVA的定时任务调度框架 案例: <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.0</version></dependency>JobDetail job JobBuilder.newJob(Sc…

每日一练 | 华为认证真题练习Day191

1、在没有启用BGP路径负载分担的情况下&#xff0c;哪种BGP路由会发送BGP邻居? A. 从所有邻居学到的所有BGP路由。 B. 只有从IBGP学到的路由。 C. 只有从EBGP学到的路由。 D. 只有被BGP优选的最佳路由。 2、第三类LSA的LINK ID是 A. 生成这条LSA的路由器的ROUTER ID B. …

LeetCode 刷题 [C++] 第236题.二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

大数据分析案例-基于SVM支持向量机算法构建手机价格分类预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

矩阵爆破逆向之条件断点的妙用

不知道你是否使用过IDA的条件断点呢&#xff1f;在IDA进阶使用中&#xff0c;它的很多功能都有大作用&#xff0c;比如&#xff1a;ida-trace来跟踪调用流程。同时IDA的断点功能也十分强大&#xff0c;配合IDA-python的输出语句能够大杀特杀&#xff01; 那么本文就介绍一下这…

【JAVA】JDK内置工具之appletviewer

下载java 下载java的时候会先下载Java jdk&#xff0c;Java Development Kit Java开发工具包。 然后会下载jre&#xff0c;也就是Java Runtime Environment Java运行环境。什么是JDK、JRE&#xff1f;_java中的jdk,jre代表什么-CSDN博客 下载之后先找到java下的bin文件&#x…

yolov9 tensorRT 的 C++ 部署

yolov9 tensorRT C 部署 本示例中&#xff0c;包含完整的代码、模型、测试图片、测试结果。 完整的代码、模型、测试图片、测试结果【github参考链接】 TensorRT版本&#xff1a;TensorRT-7.1.3.4 导出onnx模型 导出适配本实例的onnx模型参考【yolov9 瑞芯微芯片rknn部署、地平…

网络爬虫的危害,如何有效的防止非法利用

近年来&#xff0c;不法分子利用“爬虫”软件收集公民隐私数据案件屡见不鲜。2023年8月23日&#xff0c;北京市高级人民法院召开北京法院侵犯公民个人信息犯罪案件审判情况新闻通报会&#xff0c;通报侵犯公民个人隐私信息案件审判情况&#xff0c;并发布典型案例。在这些典型案…

获取PDF中的布局信息——如何获取段落

PDF解析是极其复杂的问题。不可能靠一个工具解决全部问题&#xff0c;尤其是五花八门&#xff0c;格式不统一的PDF文件。除非有钞能力。如果没有那就看看可以分为哪些问题。 提取文本内容&#xff0c;提取表格内容&#xff0c;提取图片。我认为这些应该是分开做的事情。python有…

百度百科数据爬取 python 词条数据获取

最近需要补充一些电力名词的解释&#xff0c;尤其是文字相关内容。百度百科上的词条质量有差异&#xff0c;因此我们需要先手工选择一些高质量词条。 假设我们选择了互感器页面中的仪用变压器词条&#xff0c;首先&#xff1a; import requests from bs4 import BeautifulS…

DataSpell 2023:专注于数据,加速您的数据科学之旅 mac/win版

JetBrains DataSpell 2023是一款专为数据科学家和数据分析师设计的集成开发环境&#xff08;IDE&#xff09;。这款IDE提供了强大的数据分析和可视化工具&#xff0c;旨在帮助用户更快速、更高效地进行数据科学工作。 DataSpell 2023软件获取 DataSpell 2023在保持其一贯的数…