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,一经查实,立即删除!

相关文章

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

一、前言 在之前的文章中&#xff0c;我们已经讲述了AHB传输中的两种情况&#xff0c;基本传输和猝发传输。我们进行一个简单的回顾&#xff0c;首先&#xff0c;开始一次传输之前主机需要向仲裁器申请获得总线的使用权限&#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里…

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

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

春秋云镜 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中添加…

仿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;会进入文本编辑中&…

Android学习之路(9) Intent

Intent 是一个消息传递对象&#xff0c;您可以用来从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信&#xff0c;但其基本用例主要包括以下三个&#xff1a; 启动 Activity Activity 表示应用中的一个屏幕。通过将 Intent 传递给 startActivity()&…

简单计算器的实现(含转移表实现)

文章目录 计算器的一般实现使⽤函数指针数组的实现&#xff08;转移表&#xff09; 计算器的一般实现 通过函数的调用&#xff0c;实现加减乘除 # define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int Add(int x, int y) {return x y; }int Sub(int x, int y) {retur…

服务注册中心 Eureka

服务注册中心 Eureka Spring Cloud Eureka 是 Netflix 公司开发的注册发现组件&#xff0c;本身是一个基于 REST 的服务。提供注册与发现&#xff0c;同时还提供了负载均衡、故障转移等能力。 Eureka 有 3 个角色 服务中心&#xff08;Eureka Server&#xff09;&#xff1a;…

vue项目配置git提交规范

vue项目配置git提交规范 一、背景介绍二、husky、lint-staged、commitlint/cli1.husky2.lint-staged3.commitlint/cli 三、具体使用1.安装依赖2.运行初始化脚本3.在package.json中配置lint-staged4.根目录新增 commitlint.config.js 4.提交测试1.提示信息格式错误时2.eslint校验…

线程池的实现v2.0(可伸缩线程池)

目录 前言 可伸缩线程池原理 可伸缩线程池实现 完整程序 前言 本篇可伸缩线程池的实现是在静态线程池上拓展而来&#xff0c;对于静态线程池的实现&#xff0c;请参考&#xff1a; 线程池的实现全过程v1.0版本&#xff08;手把手创建&#xff0c;看完必掌握&#xff01;&…

Java课题笔记~Element UI

Element&#xff1a;是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库&#xff0c;用于快速构建网页。 Element 提供了很多组件&#xff08;组成网页的部件&#xff09;供我们使用。例如 超链接、按钮、图片、表格等等~ 如下图左边的是我们编写页面看到的按钮&#…

5G与4G的RRC协议之异同

什么是无线资源控制&#xff08;RRC&#xff09;&#xff1f; 我们知道&#xff0c;在移动通信中&#xff0c;无线资源管理是非常重要的一个环节&#xff0c;首先介绍一下什么是无线资源控制&#xff08;RRC&#xff09;。 手机和网络通过无线信道相互通信&#xff0c;彼此交…

【踩坑日记】STM32 USART 串口与 FreeRTOS 冲突

文章目录 问题描述问题出现的环境问题解决过程第一步第二步第三步第四步第五步第六步第七步第八步 后续验证一些思考类似的问题后记 问题描述 笔者使用 FreeRTOS 创建了两个任务&#xff0c;使两颗 LED 以不同频率闪烁&#xff0c;但是在加入串口 USART 部分代码后&#xff0c…