2021年06月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

在这里插入图片描述

第1题:数对

给定2到15个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一个数的两倍。 比如给定1 4 3 2 9 7 18 22,得到的答案是3,因为2是1的两倍,4是2个两倍,18是9的两倍。
时间限制:1000
内存限制:65536
输入
一行,给出2到15个两两不同且小于100的正整数。最后用0表示输入结束。
输出
一个整数,即有多少个数对满足其中一个数是另一个数的两倍。
样例输入
1 4 3 2 9 7 18 22 0
样例输出
3

以下是使用C语言编写的解决方案:

#include <stdio.h>#define MAX_N 15int main() {int numbers[MAX_N];int n = 0;// 读取输入数据while (1) {scanf("%d", &numbers[n]);if (numbers[n] == 0) {break;}n++;}int count = 0;// 遍历每对数对for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (numbers[i] == numbers[j] * 2) {count++;}}}printf("%d\n", count);return 0;
}

这段代码首先创建一个整数数组numbers来存储输入的正整数。然后,使用一个循环逐个读取输入的正整数,直到遇到输入的结束标志0。同时,通过变量n记录输入的正整数的个数。

接下来,我们使用两个嵌套的循环来遍历每对数对。对于每一对数对 (i, j),我们检查是否满足 numbers[i] == numbers[j] * 2 的条件,如果满足,则将计数器 count 增加1。

最后,输出计数器 count 的值,即满足条件的数对的个数。

第2题:井和绳子

有A, B, C, D, E五家人共用一口井,已知井深不超过k米。A, B, C, D, E的绳长各不相同,而且厘米表示的绳长一定是整数。
从井口放下绳索正好达到水面时:
(a)需要A家的绳n1条接上B家的绳1条
(b)需要B家的绳n2条接上C家的绳1条
©需要C家的绳n3条接上D家的绳1条
(d)需要D家的绳n4条接上E家的绳1条
(e)需要E家的绳n5条接上A家的绳1条
问井深和各家绳长。
时间限制:1000
内存限制:65536
输入
输入只有1行。包括空格分开的6个整数。 第一个整数k(1 <= k <= 20),代表井的最大深度(单位:米)。 接下来是5个正整数n1, n2, n3, n4, n5。这五个整数的含义见上面的题目描述。
输出
输出只有1行。 如果找到了可行解,就输出6个整数,用空格分开,分别代表井的深度和A, B, C, D, E的绳长(单位都是厘米)。 如果有多组可行解,输出井的深度最小的那组解。 如果不存在可行解,就输出一行: not found
样例输入
10 2 3 4 5 6
样例输出
721 265 191 148 129 76

这个问题可以使用暴力穷举的方法来解决。由于井深不超过k米,并且绳长以厘米为单位,我们可以通过遍历所有可能的井深和绳长的组合来找到满足条件的解。

以下是使用C语言编写的解决方案:

#include <stdio.h>int main() {int k, n1, n2, n3, n4, n5;scanf("%d %d %d %d %d %d", &k, &n1, &n2, &n3, &n4, &n5);int found = 0;int minDepth = 1000000; // 初始化最小深度为一个大的数值int bestDepth, bestA, bestB, bestC, bestD, bestE;// 遍历井深for (int depth = 1; depth <= k; depth++) {// 遍历A的绳长for (int a = depth * n2 * n3 * n4 * n5 + 1; a <= depth * n1; a++) {// 遍历B的绳长for (int b = a * n3 * n4 * n5 + 1; b <= a * n2; b++) {// 遍历C的绳长for (int c = b * n4 * n5 + 1; c <= b * n3; c++) {// 遍历D的绳长for (int d = c * n5 + 1; d <= c * n4; d++) {// 遍历E的绳长for (int e = d + 1; e <= d * n5; e++) {// 检查是否满足条件if (e * n1 == depth * n2 * n3 * n4 * n5) {found = 1;// 更新最小深度和最优解if (depth < minDepth) {minDepth = depth;bestDepth = depth;bestA = a;bestB = b;bestC = c;bestD = d;bestE = e;}}}}}}}}if (found) {printf("%d %d %d %d %d %d\n", bestDepth, bestA, bestB, bestC, bestD, bestE);} else {printf("not found\n");}return 0;
}

这段代码首先读取输入的井深k和绳长n1、n2、n3、n4、n5。然后,使用嵌套的循环来遍历所有可能的井深和绳长的组合。

对于每一组井深和绳长的组合,我们计算出A、B、C、D、E的绳长,并检查是否满足给定的条件。如果满足条件,我们更新最小深度和最优解的值。

最后,如果找到了可行解,就输出最优解的井深和A、B、C、D、E的绳长。如果不存在可行解,就输出 “not found”。

第3题:爬楼

已知楼梯的数量,可以每次走2级或者3级,求不同的走法数
例如:楼梯一共有7级,一共3种方法:2 2 3或者 2 3 2 或者 3 2 2。
时间限制:1000
内存限制:65536
输入
输入包含若干行,每行包含一个正整数N,代表楼梯级数,1 <= N <= 50。 最后一行为0,表示测试结束。
输出
不同的走法数,每一行输入对应一行输出
样例输入
7
0
样例输出
3

这个问题可以使用动态规划来解决。我们可以定义一个数组dp,其中dp[i]表示爬到第i级楼梯的不同走法数。初始时,我们将dp[0]设置为1,表示爬到第0级楼梯的方法数为1。

然后,我们可以根据题目中给出的规则进行状态转移。爬到第i级楼梯的方法数等于爬到第i-2级楼梯的方法数加上爬到第i-3级楼梯的方法数。即dp[i] = dp[i-2] + dp[i-3]。

最后,我们遍历输入的楼梯级数,根据dp数组输出对应的不同走法数。

以下是使用C语言编写的解决方案:

#include <stdio.h>#define MAX_N 51int main() {int dp[MAX_N];dp[0] = 1;dp[1] = 0;dp[2] = 1;dp[3] = 1;int n;while (1) {scanf("%d", &n);if (n == 0) {break;}for (int i = 4; i <= n; i++) {dp[i] = dp[i - 2] + dp[i - 3];}printf("%d\n", dp[n]);}return 0;
}

在这段代码中,我们首先定义一个数组dp来存储不同楼梯级数对应的走法数。然后,我们根据题目中给出的初始条件,将dp[0]、dp[1]、dp[2]、dp[3]的值分别设置为1、0、1、1。

接下来,我们通过循环遍历输入的楼梯级数,根据动态规划的状态转移公式dp[i] = dp[i-2] + dp[i-3]计算出不同走法数。最后,输出dp[n],即第n级楼梯的不同走法数。

注意,在这段代码中,我们使用了一个循环来处理多个输入的情况,直到遇到输入的结束标志0。

第4题:表达式求值

输入一个布尔表达式,请你输出它的真假值。
比如:( V | V ) & F & ( F | V )
V表示true,F表示false,&表示与,|表示或,!表示非。
上式的结果是F
时间限制:1000
内存限制:65536
输入
输入包含多行,每行一个布尔表达式,表达式中可以有空格,总长度不超过1000
输出
对每行输入,如果表达式为真,输出"V",否则出来"F"
样例输入
( V | V ) & F & ( F| V)
!V | V & V & !F & (F | V ) & (!F | F | !V & V)
(F&F|V|!V&!F&!(F|F&V))
样例输出
F
V
V

这个问题可以使用递归和逻辑运算符的优先级来解决这个问题。以下是一个解决该问题的C语言代码示例:

#include <stdio.h>
#include <stdbool.h>
#include <string.h>bool evaluateExpression(char* expr, int* index) {bool result = false;bool operand1, operand2;char operator;while (*index < strlen(expr)) {char currentChar = expr[*index];if (currentChar == '(') {(*index)++;operand1 = evaluateExpression(expr, index);} else if (currentChar == 'V' || currentChar == 'F') {operand1 = (currentChar == 'V');(*index)++;} else if (currentChar == '!') {(*index)++;operand1 = !evaluateExpression(expr, index);} else {operator = currentChar;(*index)++;break;}if (operator == '|' && operand1) {result = true;break;} else if (operator == '&' && !operand1) {result = false;break;}}while (*index < strlen(expr)) {char currentChar = expr[*index];if (currentChar == ')') {(*index)++;break;} else if (currentChar == '|' || currentChar == '&') {operator = currentChar;(*index)++;} else {break;}if (operator == '|') {operand2 = evaluateExpression(expr, index);result = result || operand2;} else if (operator == '&') {operand2 = evaluateExpression(expr, index);result = result && operand2;}}return result;
}int main() {char expr[1000];while (fgets(expr, sizeof(expr), stdin)) {if (strcmp(expr, "0\n") == 0) {break;}int index = 0;bool result = evaluateExpression(expr, &index);printf("%c\n", (result ? 'V' : 'F'));}return 0;
}

在这段代码中,我们定义了一个递归函数evaluateExpression来对布尔表达式进行求值。我们从左到右遍历表达式的字符,根据字符的类型和逻辑运算符的优先级进行求值。

当遇到左括号时,我们递归调用evaluateExpression函数来求解括号内的子表达式。

当遇到字母VF时,我们将其作为操作数,直接赋值给operand1

当遇到!运算符时,我们递归调用evaluateExpression函数来求解!后面的子表达式,并对其求反。

当遇到|运算符时,如果operand1为真,则结果为真,否则继续求解后面的子表达式。

当遇到&运算符时,如果operand1为假,则结果为假,否则继续求解后面的子表达式。

最后,我们使用printf函数输出求得的结果。

希望这个简单的解决方法对你有帮助!

第5题:数列

用以下方式构造数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数a,要求数列中第a个数对1000取模的结果是多少。
时间限制:1000
内存限制:65536
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 1000000)。
输出
n行,每行输出对应一个输入。输出应是一个正整数,为数列中第a个数对1000取模得到的结果。
样例输入
4
5
2
19
1
样例输出
5
1
181
1

你可以使用循环来生成数列,并在生成过程中对每个数进行取模操作,以避免数值溢出。以下是一个解决该问题的C语言代码示例:

#include <stdio.h>int main() {int n;scanf("%d", &n);while (n--) {int a;scanf("%d", &a);int num1 = 1;int num2 = 1;int result = 1;if (a == 1 || a == 2) {printf("%d\n", result);continue;}for (int i = 3; i <= a; i++) {result = (num1 + num2) % 1000;num1 = num2;num2 = result;}printf("%d\n", result);}return 0;
}

在这段代码中,我们首先读取测试数据的组数n,并使用一个循环来处理每组测试数据。

对于每组测试数据,我们读取正整数a,并使用变量num1num2来追踪数列中的前两个数,初始值都为1。

接下来,我们使用一个循环从第3个数开始生成数列。每次迭代,我们计算当前数的值为num1 + num2,并对结果进行取模操作,以保证结果不会溢出。然后,我们更新num1num2的值,并继续迭代,直到生成到第a个数。

最后,我们输出第a个数对1000取模的结果。

希望这个代码示例能够帮助你解决问题!

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

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

相关文章

CNN卷积详解(三)

一、卷积层的计算 4 ∗ * ∗ 4的输入矩阵 I I I 和 3 ∗ * ∗ 3 的卷积核 K K K: 在步长&#xff08;stride&#xff09;为 1 时&#xff0c;输出的大小为 ( 4 − 3 1 ) ( 4 − 3 1) 计算公式&#xff1a; ● 输入图片矩阵 I I I 大小&#xff1a; w w w w ww ●…

微服务系列文章之 SpringBoot 最佳实践

Spring Boot 是一种广泛使用且非常流行的企业级高性能框架。 以下是一些最佳实践和一些技巧&#xff0c;我们可以使用它们来改进 Spring Boot 应用程序并使其更加高效。 Spring Boot 的四大核心 1、自动配置 针对很多Spring应用程序和常见的应用功能&#xff0c;Spring Boo…

攻防世界-fileclude

原题 解题思路 直接展示源码了&#xff0c;flag.php应该存放了flag&#xff0c;在file1与file2都不为空且file2是“hello ctf”时file1将被导入。接下来做法很明显&#xff0c;让file为flag.php&#xff0c;file2为“hello ctf”。“?file1php://filter/readconvert.base64-en…

Open3D 最小二乘拟合空间直线(方法一)

目录 一、算法原理1、空间直线2、最小二乘法拟合二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、空间直线 x −

基于web的停车场收费管理系统/基于springboot的停车场管理系统

摘 要 随着汽车工业的迅猛发展&#xff0c;我国汽车拥有量急剧增加。停车场作为交通设施的组成部分,随着交通运输的繁忙和不断发展&#xff0c;人们对其管理的要求也不断提高&#xff0c;都希望管理能够达到方便、快捷以及安全的效果。停车场的规模各不相同,对其进行管理的模…

ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步

文章目录 数据聚合一、聚合的种类二、DSL实现聚合1、Bucket&#xff08;桶&#xff09;聚合2、Metrics&#xff08;度量&#xff09;聚合 三、RestAPI实现聚合 自动补全一、拼音分词器二、自定义分词器三、自动补全查询四、实现搜索款自动补全&#xff08;例酒店信息&#xff0…

【rust/egui】(三)看看template的app.rs:序列化、持久化存储

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 serde app.rs中首先定义了我们的Templ…

Git判断本地是否最新

场景需求 需要判断是否有新内容更新,确定有更新之后执行pull操作&#xff0c;然后pull成功之后再将新内容进行复制到其他地方 pgit log -1 --prettyformat:"%H" HEAD -- . "origin/HEAD" rgit rev-parse origin/HEAD if [[ $p $r ]];thenecho "Is La…

域名解析和代理

购买域名 这里使用腾讯云进行购买。 对域名进行解析 通过添加记录接口对域名进行解析。 此时我们的服务器地址就被解析到域名上了。 我们可以通过以下格式进行访问&#xff1a; [域名]:[对应的项目端口] 效果为下: 通过nginx进行代理 如果我们使用上述的方式进行访问还是…

【hive】hive分桶表的学习

hive分桶表的学习 前言&#xff1a; 每一个表或者分区&#xff0c;hive都可以进一步组织成桶&#xff0c;桶是更细粒度的数据划分&#xff0c;他本质不会改变表或分区的目录组织方式&#xff0c;他会改变数据在文件中的分布方式。 分桶规则&#xff1a; 对分桶字段值进行哈…

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等 一、react-redux介绍二、React-Redux-基本使用三、获取状态useSelector四、分发动作useDispatch五、 Redux 数据流六、代码结构七、ActionType的使用八、Reducer的分离与合并九、购物挣…

计算机视觉的应用11-基于pytorch框架的卷积神经网络与注意力机制对街道房屋号码的识别应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用11-基于pytorch框架的卷积神经网络与注意力机制对街道房屋号码的识别应用&#xff0c;本文我们借助PyTorch&#xff0c;快速构建和训练卷积神经网络&#xff08;CNN&#xff09;等模型&#xff0c;…

【Redis从头学-5】Redis中的List数据类型实战场景之天猫热销榜单

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…

git错误记录

露id没有影响&#xff0c;搞得微软不知道我ip一样 git fatal: 拒绝合并无关的历史的错误解决(亲测有效)

mybatis缓存

目的&#xff1a;提高查询效率。 映射语句文件中的所有 select 语句的结果将会被缓存。映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。缓存会使用最近最少使用算法&#xff08;LRU, Least Recently Used&#xff09;算法来清除不需要的缓存。缓存不会定时进行…

Matplotlib绘图知识小结--Python数据分析学习

一、Pyplot子库绘制2D图表 1、Matplotlib Pyplot Pyplot 是 Matplotlib 的子库&#xff0c;提供了和 MATLAB 类似的绘图 API。 Pyplot 是常用的绘图模块&#xff0c;能很方便让用户绘制 2D 图表。 Pyplot 包含一系列绘图函数的相关函数&#xff0c;每个函数会对当前的图像进行…

爬虫框架- feapder + 爬虫管理系统 - feaplat 的学习简记

文章目录 feapder 的使用feaplat 爬虫管理系统部署 feapder 的使用 feapder是一款上手简单&#xff0c;功能强大的Python爬虫框架 feapder 官方文档 文档写的很详细&#xff0c;可以直接上手。 基本命令&#xff1a; 创建爬虫项目 feapder create -p first-project创建爬虫 …

根据源码,模拟实现 RabbitMQ - 实现消息持久化,统一硬盘操作(3)

目录 一、实现消息持久化 1.1、消息的存储设定 1.1.1、存储方式 1.1.2、存储格式约定 1.1.3、queue_data.txt 文件内容 1.1.4、queue_stat.txt 文件内容 1.2、实现 MessageFileManager 类 1.2.1、设计目录结构和文件格式 1.2.2、实现消息的写入 1.2.3、实现消息的删除…

如何将常用的jdbc方法封装起来???

你是否还在为每次新建项目连接数据库而烦恼&#xff1f;&#xff1f;&#xff1f;&#xff08;教你一次代码&#xff0c;简单完成每次连接&#xff09; 1.建立maven项目 还没下载安装或者不会建立maven项目的可以看这里哦&#xff1a;maven的下载安装与配置环境变量&#xff0…

javascript期末作业【三维房屋设计】 【源码+文档下载】

1、引入three.js库 官网下载three.js 库 放置目录并引用 引入js文件: 设置场景&#xff08;scene&#xff09; &#xff08;1&#xff09;创建场景对象 &#xff08;2&#xff09;设置透明相机 1,透明相机的优点 透明相机机制更符合于人的视角,在场景预览和游戏场景多有使用…