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

在这里插入图片描述

第1题:和数

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

要解决这个问题,我们可以使用两层循环来遍历数列中的元素,并在内层循环中检查当前元素是否等于其他两个元素的和。如果是,则将计数器加1。

下面是使用C语言编写的解题代码:

#include <stdio.h>int main() {int n;scanf("%d", &n);int arr[100];for (int i = 0; i < n; i++) {scanf("%d", &arr[i]);}int count = 0;for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {for (int k = 0; k < n; k++) {if (k != i && k != j && arr[k] == arr[i] + arr[j]) {count++;break;}}}}printf("%d\n", count);return 0;
}

在上述代码中,我们首先读取输入的数列长度 n,然后读取数列中的元素并存储在数组 arr 中。

接下来,我们使用两层循环来遍历数列中的元素。外层循环控制第一个相加的数 arr[i],内层循环控制第二个相加的数 arr[j],其中 ji+1 开始以避免重复计算。在内层循环中,我们使用另一个循环遍历数列中的元素 arr[k],并检查是否存在一个不等于 arr[i]arr[j] 的元素等于它们的和 arr[i] + arr[j]。如果存在,则将计数器 count 加1,并跳出内层循环。

最后,我们输出计数器 count 的值作为结果。

编译并运行上述代码可以解决该问题。你可以使用 C 语言编译器将代码保存为 .c 文件,然后编译并运行该文件来获取结果。

第2题:质数的和与积

两个质数的和是S,它们的积最大是多少?
时间限制:10000
内存限制:65536
输入
一个不大于10000的正整数S,为两个质数的和。
输出
一个整数,为两个质数的最大乘积。数据保证有解。
样例输入
50
样例输出
589

要解决这个问题,我们可以使用一个函数来判断一个数是否为质数。然后,我们可以从S开始递减,找到最大的两个质数使它们的和等于S,并计算它们的乘积。

下面是使用C语言编写的解题代码:

#include <stdio.h>
#include <stdbool.h>bool isPrime(int num) {if (num <= 1) {return false;}for (int i = 2; i * i <= num; i++) {if (num % i == 0) {return false;}}return true;
}int main() {int S;scanf("%d", &S);int maxProduct = 0;for (int i = S / 2; i >= 2; i--) {if (isPrime(i) && isPrime(S - i)) {maxProduct = i * (S - i);break;}}printf("%d\n", maxProduct);return 0;
}

在上述代码中,我们首先定义了一个函数 isPrime 来判断一个数是否为质数。该函数接收一个正整数 num,如果 num 小于等于1,则返回 false。否则,我们使用一个循环从2开始遍历到 num 的平方根,检查是否存在一个数能整除 num。如果存在,则 num 不是质数,返回 false。如果循环结束后仍未找到可以整除 num 的数,则 num 是质数,返回 true

在主函数中,我们首先读取输入的和 S,然后从 S/2 开始递减到2。在每次迭代中,我们检查当前数 i 是否为质数,并且 S - i 也是质数。如果满足条件,则计算 iS - i 的乘积,并将其赋值给 maxProduct。然后跳出循环。

最后,我们输出 maxProduct 的值作为结果。

编译并运行上述代码可以解决该问题。你可以使用 C 语言编译器将代码保存为 .c 文件,然后编译并运行该文件来获取结果。

第3题:爬楼

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

要解决这个问题,我们可以使用递归来计算不同的走法数。每次递归,我们可以选择走2级或3级,直到达到目标楼梯级数。

下面是使用C语言编写的解题代码:

#include <stdio.h>int countWays(int n) {if (n == 0 || n == 1) {return 1;} else if (n == 2) {return 2;} else if (n == 3) {return 3;} else {return countWays(n - 2) + countWays(n - 3);}
}int main() {int N;while (1) {scanf("%d", &N);if (N == 0) {break;}int ways = countWays(N);printf("%d\n", ways);}return 0;
}

在上述代码中,我们定义了一个递归函数 countWays 来计算不同的走法数。该函数接收一个参数 n,代表当前楼梯级数。如果 n 为0或1,表示已经到达目标楼梯,返回1。如果 n 为2,表示剩余2级楼梯可以走2次,返回2。如果 n 为3,表示剩余3级楼梯可以走3次,返回3。否则,我们可以选择先走2级楼梯,然后递归计算剩余 n-2 级楼梯的走法数,或者选择先走3级楼梯,然后递归计算剩余 n-3 级楼梯的走法数。最后,将两种情况的走法数相加作为结果返回。

在主函数中,我们使用一个循环来读取输入的楼梯级数 N,如果 N 为0,则表示测试结束,跳出循环。否则,我们调用 countWays 函数计算不同的走法数,并将结果输出。

编译并运行上述代码可以解决该问题。你可以使用 C 语言编译器将代码保存为 .c 文件,然后编译并运行该文件来获取结果。

第4题:生成括号

Paul是一名数学专业的同学,在课余选修了C++编程课,现在他能够自己写程序判断判断一个给定的由’(‘和’)'组成的字符串是否是正确匹配的。可是他不满足于此,想反其道而行之,设计一个程序,能够生成所有合法的括号组合,请你帮助他解决这个问题。
时间限制:1000
内存限制:65536
输入
输入只有一行N,代表生成括号的对数(1 ≤ N ≤ 10)。
输出
输出所有可能的并且有效的括号组合,按照字典序进行排列,每个组合占一行。
样例输入
3
样例输出
((()))
(()())
(())()
()(())
()()()

要解决这个问题,我们可以使用递归来生成所有合法的括号组合。每次递归,我们可以选择放置一个左括号或右括号,但需要满足以下条件:左括号的数量不能超过N,右括号的数量不能超过左括号的数量。

下面是使用C语言编写的解题代码:

#include <stdio.h>void generateParentheses(int leftCount, int rightCount, int n, char* current, int index) {if (leftCount == n && rightCount == n) {current[index] = '\0';printf("%s\n", current);return;}if (leftCount < n) {current[index] = '(';generateParentheses(leftCount + 1, rightCount, n, current, index + 1);}if (rightCount < leftCount) {current[index] = ')';generateParentheses(leftCount, rightCount + 1, n, current, index + 1);}
}int main() {int N;scanf("%d", &N);char parentheses[20];generateParentheses(0, 0, N, parentheses, 0);return 0;
}

在上述代码中,我们定义了一个递归函数 generateParentheses 来生成所有合法的括号组合。该函数接收五个参数:leftCount 表示当前已放置的左括号的数量,rightCount 表示当前已放置的右括号的数量,n 表示括号的对数,current 是一个字符数组,用于存储当前的括号组合,index 表示当前要放置括号的位置。

在递归函数中,我们首先判断是否已经放置了 n 对括号(即左括号数量和右括号数量都等于 n)。如果是,则当前括号组合已经生成完毕,将 current 数组末尾设置为字符串结束符 \0,然后输出当前括号组合。

否则,我们可以选择放置一个左括号。在 current 数组的当前位置 index 放置一个左括号,并递归调用 generateParentheses 函数,同时将左括号的数量加1。

然后,我们检查是否可以放置一个右括号。只有当已放置的右括号数量小于当前已放置的左括号数量时,我们才可以放置一个右括号。在 current 数组的当前位置 index 放置一个右括号,并递归调用 generateParentheses 函数,同时将右括号的数量加1。

在主函数中,我们首先读取输入的括号对数 N。然后,我们定义一个字符数组 parentheses 来存储括号组合,初始时为空。接下来,我们调用 generateParentheses 函数,并传入初始的左括号数量、右括号数量、括号对数、parentheses 数组和初始的位置索引。

编译并运行上述代码可以解决该问题。你可以使用 C 语言编译器将代码保存为 .c 文件,然后编译并运行该文件来获取结果。

第5题:铺砖

对于一个2行N列的走道。现在用12,22的砖去铺满。问有多少种不同的方式。
时间限制:3000
内存限制:131072
输入
整个测试有多组数据,请做到文件底结束。每行给出一个数字N,0 <= n <= 250
输出
如题
样例输入
2
8
12
100
200
样例输出
3
171
2731
845100400152152934331135470251
1071292029505993517027974728227441735014801995855195223534251

要解决这个问题,我们可以使用动态规划来计算不同的铺砖方式。我们可以定义一个数组 dp,其中 dp[i] 表示铺满一行长度为 2*i 的走道的不同铺砖方式数。

根据题目要求,我们可以有两种方式来铺满走道的一行:使用一块 1x2 的砖或者使用一块 2x2 的砖。

对于 dp[i],我们可以考虑最后铺砖的方式是使用一块 1x2 的砖,这样我们需要在 dp[i-1] 的基础上铺上这块砖。或者考虑最后铺砖的方式是使用一块 2x2 的砖,这样我们需要在 dp[i-2] 的基础上铺上这块砖。因此,我们可以得到递推关系:dp[i] = dp[i-1] + dp[i-2]

注意,初始情况下,当走道长度为0时,即 dp[0] = 1,表示不需要铺砖的方式数为1。

下面是使用C语言编写的解题代码:

#include <stdio.h>unsigned long long int dp[251] = {0};void calculateDP() {dp[0] = 1;dp[1] = 1;dp[2] = 3;for (int i = 3; i <= 250; i++) {dp[i] = dp[i - 1] + dp[i - 2];}
}int main() {calculateDP();int N;while (scanf("%d", &N) == 1) {printf("%llu\n", dp[N]);}return 0;
}

在上述代码中,我们首先定义一个数组 dp,用于存储不同的铺砖方式数。然后,我们定义了一个函数 calculateDP 来计算 dp 数组的值。在该函数中,我们通过遍历从 3 到 250 的走道长度,根据递推关系 dp[i] = dp[i-1] + dp[i-2] 计算不同的铺砖方式数。

在主函数中,我们首先调用 calculateDP 函数来计算 dp 数组。然后,我们使用一个循环来读取输入的走道长度 N,并输出对应的不同铺砖方式数 dp[N]

编译并运行上述代码可以解决该问题。你可以使用 C 语言编译器将代码保存为 .c 文件,然后编译并运行该文件来获取结果。

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

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

相关文章

TCP-消息队列模型

#include "main.h" fd_win_set setSockets;VOID Server_write_error() {}int cteateserver(HWND hwnd) {WORD wVersionRequested;WSADATA wsaData;int err;/* 使用Windef.h中声明的MAKEWORD&#xff08;低字节、高字节&#xff09;宏 */wVersionRequested MAKEWORD(…

AMBA总线协议(6)——AHB(四):传输细节

一、前言 在之前的文章中&#xff0c;我们已经讲述了AHB传输中的两种情况&#xff0c;基本传输和猝发传输。我们进行一个简单的回顾&#xff0c;首先&#xff0c;开始一次传输之前主机需要向仲裁器申请获得总线的使用权限&#xff0c;然后主机给出地址和控制信号&#xff0c;根…

非计算机科班如何丝滑转码

近年来&#xff0c;很多人想要从其他行业跳槽转入计算机领域。非计算机科班如何丝滑转码&#xff1f; 方向一&#xff1a;如何规划才能实现转码&#xff1f; 对于非计算机科班的人来说&#xff0c;想要在计算机领域实现顺利的转码并不是一件容易的事情&#xff0c;但也并非不…

【JavaEE进阶】SpringMVC

文章目录 一. 简单认识SpringMVC1. 什么是SpringMVC?2. SpringMVC与MVC的关系 二. SpringMVC1. SpringMVC创建和连接2. SpringMVC的简单使用2.1 RequestMapping 注解介绍2.2 RequestMapping支持的请求类型2.3 GetMapping 和 PostMapping 3. 获取参数3.1 传递单个参数3.2 传递对…

【linux】2 Linux编译器-gcc/g++和Linux调试器-gdb

文章目录 一、Linux编译器-gcc/g使用1.1 背景知识1.2 gcc如何完成1.3 函数库1.4 gcc选项 二、linux调试器-gdb使用2.1 背景2.2 开始使用 总结 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)&#xff89;" 一、Linux编译器-gcc/g使用 1.1 背景…

/root/.ssh/config line 2: Bad protocol 2 host key algorithms ‘+ssh-rsa‘.

文章目录 1、问题2、查看openssh版本3、解决问题4、重新生成密钥5、查看是否可连接工蜂 1、问题 ssh访问工蜂报错&#xff1a; [rootlocalhost .ssh]# ssh -T gitgit.code.tencent.com /root/.ssh/config line 2: Bad protocol 2 host key algorithms ‘ssh-rsa’. 2、查看o…

升级Qt后VS项目不能使用

错误场景&#xff1a; 如果你的QT卸载了装了新版,那么VS你原来设置的项目就不能跑了. 问题 升级Qt后&#xff36;&#xff33;项目不能使用 跟我一起开始挽救自己的项目 升级Qt后&#xff36;&#xff33;项目不能使用 假如你从5.14.6 升级到 Qt6.2并删除了原来的QT 你在VS里…

Unity 3d角色展示脚本(旋转 平移 缩放)展示界面

不考虑性能 很简陋的一个功能&#xff0c;主要是用于角色渲染的观察用&#xff0c;比simplecontroller要好用一点 using System; using UnityEngine;public class CharacterViewer : MonoBehaviour {public Transform target; // 人物模型的Transformpublic float rotationSpee…

Java网络编程(一)网络基础

概述 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递 网络分类 局域网(LAN) 局域网是一种在小区域内使用的,由多台计算机组成的网络,覆盖范围…

hive-sql

hive-常用SQL汇总 查看数据库 -- 查看所有的数据库 show databases; 使用默认的库 -- 下面的语句可以查看默认的库 use default ;查看某个库下的表 -- 查看所有的表 show tables ; -- 查看包含 stu的表 &#xff0c;这种是通配的方法来查看 show tables like *stu*; 查…

【深入理解jvm读书笔记】jvm如何进行内存分配

jvm如何进行内存分配 内存分配方式内存分配方式的选择并发场景下的内存分配内存空间的初始化构造函数 内存分配方式 指针碰撞空闲列表 指针碰撞法&#xff1a; 假设Java堆中内存是绝对规整的&#xff0c;所有被使用过的内存都被放在一边&#xff0c;空闲的内存被放在另一边&a…

春秋云镜 CVE-2019-16692

春秋云镜 CVE-2019-16692 phpIPAM 1.4 - SQL Injection 靶标介绍 phpIPAM 1.4后台存在SQL Injection。 启动场景 漏洞利用 后台SQL注入&#xff0c;admin/admin888登陆成功。 exp POST /app/admin/routing/edit-bgp-mapping-search.php HTTP/1.1 Host: xxx.com Content-Le…

mysql从传统模式切到GTID模式后启动主从,主从异常报错1236

一 前言 MySQL 的主从复制作为一项高可用特性&#xff0c;用于将主库的数据同步到从库&#xff0c;在维护主从复制数据库集群的时候&#xff0c;作为专职的MySQL DBA&#xff0c;笔者相信大多数人都会遇到“Got fatal error 1236 from master when reading data from binary …

MySQL数据库:内置函数

日期函数 规定&#xff1a;日期&#xff1a;年月日 时间&#xff1a;时分秒 函数名称作用描述current_date()当前日期current_time()当前时间current_timestamp()当前时间戳date(datetime)返回datetime参数的日期部分date_add(date,interval d_value_type)在date中添加…

jenkins自动部署微服务到docker

1、代码上传到git&#xff1b; 2、jenkins拉取git的代码&#xff0c;maven打包&#xff0c;使用插件生成镜像&#xff0c;自动上传docker&#xff1b; 两个插件&#xff0c;一个打包插件&#xff0c;一个创建镜像上传docker仓库.&#xff08;将dockerfile内容搬到插件配置&…

仿mudou高性能高并发服务器

"这个结局是我的期待&#xff0c;我会一直为你祝福。" 项目实现目标: 仿muduo库One Thread One Loop式主从Reacto模型实现高并发服务器。通过实现高并发服务器组件&#xff0c;简洁快速完成搭建一个高性能服务器。并且&#xff0c;通过组件内提供的不同应⽤层协议⽀…

Kafka基本使用

查看Kafka的进程是否在运行 #命令行终端中运行如下命令 ps -ef | grep kafkafind / -iname kafka-server-start.shcd /usr/local/kafka/bin/#启动kafka ./kafka-server-start.sh -daemon /usr/local/kafka/config/server.propertiesKafka默认使用9092端口提供服务&#xf…

九、Linux下,如何在命令行进入文本编辑页面?

1、文本编辑基础 说到文本编辑页面&#xff0c;那就必须提到vi和vim&#xff0c;两者都是Linux系统中&#xff0c;常用的文本编辑器 2、三种工作模式 3、使用方法 &#xff08;1&#xff09;在进入Linux系统&#xff0c;在输入vim text.txt之后&#xff0c;会进入文本编辑中&…

第8章 CPU后端优化

CPU后端低效&#xff1a;当前端完成取指和译码后&#xff0c;后端发生了过载而不能处理新的指令。TMA将后端bound分为存储和计算bound。 8.1 存储bound 当应用程序执行大量的内存访问并且花费比较长的时间等待内存访问完成时&#xff0c;即被视为存储bound。意味着要改善存储…

vue静态html加载外部组件

当我们在开发vue应用时, 使用的是html页面开发, 需要引用外部vue组件, 怎么办呢, 首先我们引用http-vue-loader.js文件, 像下面这样: <script src"/assets/javascript/vue.min.js"></script> <script src"/assets/javascript/http-vue-loader.j…