中国电子学会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; // 程序结束
}/*这个程序通过用户输入的不同字符来模拟目录树的操作,如创建新目录、返回上一级目录、列出当前目录的内容等。程序使用了一个字符串集合来存储目录结构,并使用递归函数来处理不同层级的目录操作。
*/
相关文章:
中国电子学会2020年06月真题C语言软件编程等级考试三级(含详细解析答案)
中国电子学会考评中心历届真题(含解析答案) C语言软件编程等级考试三级 2020年06月 编程题五道 总分:100分一、最接近的分数(20分) 分母不超过N且小于A/B的最大最简分数是多少? 时间限制: 1000ms 内存限制: 65536kb 输入…...

WPF的DataGrid自动生成中文列头
直接将一个对象集合绑定到DataGrid上面,设置自动生成列AutoGenerateColumns"True",DataGrid会自动根据对象类的属性生成对应的列 示例类对象: public class DataModel{public int Id { get; set; }public string Name { get; set;…...

CSS【详解】居中对齐 (水平居中 vs 垂直居中)
水平居中 内部块级元素的宽度要小于容器(父元素) 方案一:文本居中对齐(内联元素) 限制条件:仅用于内联元素 display:inline 和 display: inline-block; 给容器添加样式 text-align:center<!DOCTYPE html> <html lang&q…...

【排序算法】基数排序
一:基本概念 1.1 基数排序(桶排序)介绍 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是…...
解释存储过程和函数的区别,以及它们在MySQL中的用途。如何创建和使用存储过程和函数?
解释存储过程和函数的区别,以及它们在MySQL中的用途。 存储过程和函数在MySQL中的区别及用途 区别: 返回值: 函数:必须有一个返回值,这可以是一个标量值或一个表。如果没有明确的RETURN语句,函数将返回N…...
【GPU驱动开发】-GPU架构简介
前言 不必害怕未知,无需恐惧犯错,做一个Creator! GPU(Graphics Processing Unit,图形处理单元)是一种专门用于处理图形和并行计算的处理器。GPU系统架构通常包括硬件和软件层面的组件。 一、总体流程 应…...
m位数问题(c++题解)
题目描述 考官只给两个整数n和m(1 < n < 8,1< m <5),要求选手从1,2,…,n中取出m个数字,组成一个m位整数,统计所有的m位整数中一共有多少个素数。 如n3,m2时,符合条件的整数有&…...
洛谷P1331海战
题目背景 在峰会期间,武装部队得处于高度戒备。警察将监视每一条大街,军队将保卫建筑物,领空将布满了 F-2003 飞机。 此外,巡洋船只和舰队将被派去保护海岸线。不幸的是,因为种种原因,国防海军部仅有很少…...

如何利用Flutter来写后端 服务端应用
前言 Flutter是谷歌推出的一款跨平台开发框架,现在属于此领域star最多的框架,其被广泛应用于构建前台界面,但或许很少人知道,他也可以写后端应用。 本文主角 flutter非常著名的getx库推出的get server jonataslaw/get_server:…...
数据页和缓存页(BufferPool)
1. 数据页(dataPage) 什么是数据页? 数据页是 MySQL 存储引擎在磁盘和内存之间传输数据的基本单位,默认大小为16KB。 数据页的结构: 表头:储存与页相关的元信息,比如,页号&#…...
LibreOJ 136. 最小瓶颈路 题解 最小生成树 倍增
题目链接:LibreOJ 136. 最小瓶颈路 题目描述: 给定一张无向图,询问两个结点之间的最小瓶颈路。u和v两个结点之间最小瓶颈路指的是u和v的每条路径中经过的最大边权的最小值。 题解: 给出结论:无向图的最小瓶颈路与其最小…...

前端学习第三天-css基础
1. CSS简介 从HTML被发明开始,样式就以各种形式存在。不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制。最初的HTML只包含很少的显示属性。 随着HTML的成长,为了满足页面设计者的要求,HTML添加了很多显示功能。但是随着这些功能…...
各种使用chatgpt prompts技巧
1,利用chatgpt生成照片 1.1,从现在起, 当你想发送一张照片时,请使用 Markdown ,并且 不要有反斜线, 不要用代码块。使用 Unsplash API (https://source.unsplash.com/1280x720/? < PUT YOUR QUERY HERE >)。如果你明白了,请回复“明白” 1.2,开始提问生成指定场景照…...
基于单片机的企业指纹考勤系统设计
摘要: 考勤系统是企业人力资源管理的重要依据,传统的考勤系统不能保证准确性,也存在地域局限,不能满足一些跨区域集团公司的考勤要求。文章以单片机技术以及生物特征识别技术为基础,分析企业单片机智能化指纹考勤系统的设计思路,从硬件设备的选型和配置、软件系统的开发、…...
JUC(java.util.concuurrent)的常见类介绍
Java 并发包(java.util.concurrent,简称 JUC)提供了一系列的工具和框架,用于简化并发编程。以下是 JUC 包中常见类的介绍: Callable: Callable 接口是 Java 提供的一个带返回值的任务接口,类似于…...

【中科院计算所】WSDM 2024冠军方案:基于大模型进行多文档问答
作者:李一鸣 张兆 中科院计算所 会话式多文档问答旨在根据检索到的文档以及上下文对话来回答特定问题。 在本文中,我们介绍了 WSDM Cup 2024 中“对话式多文档 QA”挑战赛的获胜方法,该方法利用了大型语言模型 (LLM) 卓越的自然语言理解和生…...
Android提供了多种方式来打开特定文件夹中的视频
使用 MediaStore获取指定文件夹的视频,更优化方法: import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.net.Uri; import android.os.Build; import android.os.Environme…...

基于django的购物商城系统
摘要 本文介绍了基于Django框架开发的购物商城系统。随着电子商务的兴起,购物商城系统成为了许多企业和个人创业者的首选。Django作为一个高效、稳定且易于扩展的Python web框架,为开发者提供了便捷的开发环境和丰富的功能模块,使得开发购物商…...

Swagger3 使用详解
Swagger3 使用详解 一、简介1 引入依赖2 开启注解3 增加一个测试接口4 启动服务报错1.5 重新启动6 打开地址:http://localhost:8093/swagger-ui/index.html 二、Swagger的注解1.注解Api和ApiOperation2.注解ApiModel和ApiModelProperty3.注解ApiImplicitParams和Api…...

JVM 第二部分-2(堆,方法区)
4.堆 堆 一个Java程序(main方法)对应一个jvm实例,一个jvm实例只有一个堆空间堆是jvm启动的时候就被创建,大小也确定了。大小可以用参数设置。堆是jvm管理的一块最大的内存空间 核心区域,是垃圾回收的重点区域堆可以位…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...