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.rhkb.cn/news/101493.html

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

相关文章

2023国赛数学建模B题思路模型代码 高教社杯

本次比赛我们将会全程更新思路模型及代码&#xff0c;大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…

svg mask和stroke冲突问题

目录 先说结论各种样例首先是水平、垂直的线然后是斜线如果是图形加stroke呢用《g》标签包起来呢 总结 先说结论 实际上svg里&#xff0c;mask对svg内元素起作用的并非元素本身&#xff0c;而是元素几何形状的外包矩形&#xff0c;特别是和stroke有冲突&#xff0c;会产生奇怪…

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)

STM32 CubeMX STM32 CubeMX ____Freertos任务通信&#xff1a;队列、信号量、互斥量&#xff0c;事件组&#xff0c;任务通知 STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09;使用…

苍穹外卖 day3 实现登录过程中MD5加密

一 原来是明文存的 密码可见度太高&#xff0c;MD5加密为密文图像 效果 二 密文实现步骤 修改明文密码&#xff0c;改成密文 123456 密文值&#xff1a;e10adc3949ba59abbe56e057f20f883e代码如下所示 在这里插入代码片 package com.sky.service.impl;import com.sky.con…

Vue使用Animate.css

说一下Animate.css这个动画库&#xff0c;很多的动画在这个库里面都定义好了&#xff0c;我们用的时候可以直接使用里面的类名就可以了&#xff0c;就是直接目标元素绑定对应的类名就可以实现动画效果&#xff0c;非常方便&#xff0c;库其实也相对简单&#xff0c;使用起来也简…

数据结构(3)

线性表是多个具有相同特征的数据的有限序列。 前驱元素&#xff1a;A在B前面&#xff0c;称A为B的前驱元素。 后继元素&#xff1a;B在A后面&#xff0c;称B为A的后继元素。 线性表特征&#xff1a; 1.一个元素没有前驱元素&#xff0c;就是头结点&#xff1b; 2.最后一个…

法线矩阵推导

法线矩阵推导 https://zhuanlan.zhihu.com/p/72734738 https://juejin.cn/post/7113952418613690382 https://blog.csdn.net/wangjianxin97?typeblog 1、为什么需要法线矩阵 vec3 normalEyeSpace modelViewMatrix * normal;如果模型矩阵执行了非等比缩放, 顶点的改变会导致法…

PSP - 蛋白质结构预测 AlphaFold2 的结构模版 (Template) 搜索与特征逻辑

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132427617 结构模版 (Template) 是一种已知的蛋白质结构&#xff0c;可以作为 AlphaFold2 蛋白质结构预测的参考&#xff0c;AlphaFold2 可以从多…

springMVC 已解密的登录请求

问题描述&#xff1a; 解决方案&#xff1a; 1.对用户所输入的密码在页面进行MD5加密并反馈至密码输入框。 2. 手动生成SSL安全访问证书&#xff1b;在此不做介绍&#xff0c;相关方法可通过网上查找&#xff1b; 3. 将产品HTTP访问方式改为SSL安全访问方式&#xff1b;在Ap…

【C++】STL——map的介绍和使用、map的构造函数、map的迭代器、map的容量和访问函数、map的增删查改函数

文章目录 1.map的介绍2.map的使用2.1map的构造函数2.2map的迭代器2.3map的容量和访问函数2.4map的增删查改函数 1.map的介绍 map的介绍 &#xff08;1&#xff09;map是关联容器&#xff0c;它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。 &#xff…

【React学习】React组件生命周期

1. 介绍 在 React 中&#xff0c;组件的生命周期是指组件从被创建到被销毁的整个过程。React框架提供了一系列生命周期方法&#xff0c;在不同的生命周期方法中&#xff0c;开发人员可以执行不同的操作&#xff0c;例如初始化状态、数据加载、渲染、更新等。一个组件的生命周期…

C# 使用递归方法实现汉诺塔步数计算

C# 使用递归方法实现汉诺塔步数计算 Part 1 什么是递归Part 2 汉诺塔Part 3 程序 Part 1 什么是递归 举一个例子&#xff1a;计算从 1 到 x 的总和 public int SumFrom1ToX(int x) {if(x 1){return 1;}else{int result x SumFrom1ToX_2(x - 1); // 调用自己return result…

Vim学习(四)——命令使用技巧

命令模式 打开文本默认模式&#xff0c;按**【ESC】**重新进入 【/关键字】&#xff1a;搜索匹配关键字 G&#xff1a;最后一行 gg&#xff1a;第一行 hjkl:左下右上 yy: 复制一行 dd&#xff1a;删除一行 p:粘贴 u: 撤销插入模式 按**【i / a / o】**键均可进入文本编辑模式…

2023年国赛 高教社杯数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

uniapp 回退到指定页面 保存页面状态

uniapp 历史页面回退到指定页面。 getCurrentPages() 内容如下 let delta getCurrentPages().reverse().findIndex(item > item.route "pages/popularScience/daodi") if(delta-1){uni.navigateTo({url: /pages/popularScience/daodi,success: res > {},fa…

Python编程基础-文件的打开和读取

文件的访问 使用 open() 函数 打开文件 &#xff0c;返回一个 file 对象 使用 file 对象的读 / 写方法对文件进行读 / 写的 操作 使用 file 对象的 close() 方法关闭文件 打开文件 open()方法&#xff0c;需要一个字符串路径&#xff0c;并返回一个文件对象&#xff0c;默认是”…

2023年国赛数学建模思路 - 案例:退火算法

文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…

【分享】华为设备登录安全配置案例

微思网络www.xmws.cn&#xff0c;2002年成立&#xff0c;专业IT认证培训21年&#xff0c;面向全国招生&#xff01; 微 信 号 咨 询&#xff1a; xmws-IT 华为HCIA试听课程&#xff1a;超级实用&#xff0c;华为VRP系统文件详解【视频教学】华为VRP系统文件详解 华为HCIA试听课…

原生轮播图的实现

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>轮播图</title><style>* {margin: 0;pad…

WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换 资料收集

野火 ATGM332D简介 高性能、低功耗 GPS、北斗双模定位模块 STM32 GPS定位_为了维护世界和平_的博客-CSDN博客 秉火多功能调试助手上位机开源&#xff01;共六款软件&#xff0c;学到你吐... , - 电脑上位机 - 野火电子论坛 - Powered by Discuz! https://www.firebbs.cn/for…