全国青少年软件编程C++语言等级考试真题试卷

2024-07-09
| 246页
| 242人阅读
| 4人下载

内容正文:

青少年编程等级考试题库 目录 一、 考试简介 1 二、等级考试相关链接 1 三、 项目背景 2 C 语言一级题库 80 题 C 语言一级考纲说明 11 1、计算(a+b)/c 的值 12 2、反向输出一个三位数(2020 年真题) 12 3、打印字符 12 4、输出保留 12 位小数的浮点数 13 5、判断能否被 3,5,7 整除 13 6、骑车与走路 13 7、画矩形 14 8、含 k 个 3 的数 14 9、计算表达式的值 15 10、判断是否存在重复的数(2019 年真题) 15 11、日期输出 15 12、与指定数字相同的数的个数 15 13、输出第二个整数 16 14、浮点数向零舍入 16 15、计算(a+b)*c 的值 16 16、苹果和虫子 17 17、输出绝对值 17 18、计算邮资 17 19、求整数的和与均值 18 20、数 1 的个数 18 21、逻辑判断问题 18 22、ASCII 码 18 23、判断平闰年 18 24、求最大公约数 18 25、分糖果游戏 18 26、自行车和三轮车 19 27、数据分段问题 19 28、字符菱形 19 29、 对齐输出 19 30、 等差数列末项计算 20 31、 计算线段长度 20 32、 计算 2 的幂 20 33、奇偶数判断 21 34、分段函数 21 ( 第 3 页 共 251 页 ) 学科网(北京)股份有限公司 35、银行利息 21 36、财务管理 22 37、计算多项式的值 23 38、温度表达转化 23 39、与圆相关的计算 23 40、大象喝水 24 41、判断是否为两位数 24 42、三角形判断 25 43、简单计算器 25 44、最高的分数 25 45、人口增长问题 26 46、斐波那契数列 26 47、球弹跳高度的计算 26 48、角谷猜想(2021 真题) 27 49、统计满足条件的 4 位数个数 27 50、分离整数的各个数位 28 51、开关灯 28 52、 地球人口承载力估计 28 53、 计算分数的浮点数值 29 54、 晶晶赴约会(2021 年真题) 29 55、求平均年龄 29 56、最高的分数 30 57、 奥运奖牌计数 30 58、 奇数求和 31 59、整数的个数(2020 年真题) 31 60、救援 31 61、津津的储蓄计划 32 62、正常血压 33 63、 计算星期几 33 64、 数字反转 34 65、求阶乘的和 34 66、质因数分解 34 67、 计算并联电阻 35 68、 计算球的体积 35 69、 行李收费 35 70、 买笔方案 36 71、 输出整数(2020 年真题) 36 72、 新冠疫情死亡率(2020 年真题) 36 73、 有一门课不及格的学生(2020 年真题) 37 74、 骑士的金币(2020 年真题) 37 75、 求满足条件的 3 位数(2020 年真题) 37 76、 数的输入和输出(2021 年 6 月真题) 38 77、 大写字母的判断(2021 年 6 月真题) 38 78、 特殊求和(2021 年 6 月真题) 38 79、 硬币翻转(开关门开关灯(2021 年 6 月真题) 39 80、 百钱百鸡问题 (搬砖问题) 39 C 语言一级题库 80 题参考答案 1、计算(a+b)/c 的值 40 2、反向输出一个三位数 40 3、打印字符 40 4、保留 12 位小数的浮点数 41 5、判断能否被 3,5,7 整除 41 6、骑车与走路 41 7、画矩形 42 8、含 k 个 3 的数 42 9、计算表达式的值 44 10、判断是否存在重复的数 44 11、日期输出 44 12、与指定数字相同的数的个数 45 13、输出第二个整数 45 14、浮点数向零舍入 45 15、计算(a+b)*c 的值 46 16、苹果和虫子 46 17、输出绝对值 46 18、计算邮资 47 19、求整数的和与均值 47 20、数 1 的个数 47 21、 三个数中最大数 48 22、 ASCII 码 48 23、 判断平闰年 49 24、求最大公约数 49 25、 分糖果游戏 49 26、 自行车和三轮车 50 27、数据分段问题 50 28、字符菱形 51 29、对齐输出 51 30、等差数列末项计算 51 31、计算线段长度 52 32、计算 2 的幂 52 33、奇偶数判断 52 34、分段函数 53 35、银行利息 53 36、财务管理 54 37、计算多项式的值 54 38、温度表达转化 54 39、与圆相关的计算 55 40、大象喝水 55 41、判断是否为两位数 55 42、三角形判断 56 43、简单计算器 56 44、最高的分数 57 45、人口增长问题 58 46、斐波那契数列 58 47、球弹跳高度的计算 59 48、角谷猜想 59 49、统计满足条件的 4 位数 60 50、分离整数的各个数位 60 51、开关灯 61 52、地球人口承载力估计 61 53、计算分数的浮点数值 62 54、晶晶赴约会 62 55、求平均年龄 62 56、最高的分数 63 57、奥运奖牌计数 63 58、奇数求和 64 59、整数的个数 64 60、救援 65 61、津津的储蓄计划 65 62、 正常血压 66 63、计算星期几 66 64、数字反转 67 65、 求阶乘的和 67 66、质因数分解 68 67、计算并联电阻 68 68、计算球的体积 69 69、 行李收费 69 70、 买笔方案 70 71、输出整数(2020 年真题) 71 72、新冠疫情死亡率(2020 年真题) 71 73、有一门课不及格的学生(2020 年真题) 71 74、骑士的金币(2020 年真题) 72 75、求满足条件的 3 位数(2020 年真题) 72 76、数的输入和输出(2021 年 6 月真题) 73 77、大写字母的判断(2021 年 6 月真题) 73 78、特殊求和(2021 年 6 月真题) 74 79、硬币翻转 (开关门 开关灯)(2021 年 6 月真题) 75 80、百钱百鸡问题 (搬砖问题) 75 C 语言二级题库 61 题及参考答案 C 语言二级考纲说明 76 数组部分 1、与指定数字相同的数的个数(2021 真题) 77 2、陶陶摘苹果 78 3、计算书费 79 4、数组逆序重存放 80 5、校门外的树 80 6、开关灯 82 7、查找特定的值 83 8、最大值和最小值的差(2021 真题) 84 9、不与最大数相同的数字之和 84 11、整数去重 87 12、铺地毯 88 13、矩阵交换行 89 14、计算矩阵边缘元素之和 90 15、计算鞍点 91 16、矩阵转置 93 17、统计数字字符个数 94 18、找第一个只出现一次的字符(2021 真题) 95 19、石头剪子布 96 20、合法 C 标识符 97 21、密码翻译 98 22、加密的病历单 99 23、单词的长度 100 24、单词翻转 101 25、判断字符串是否为回文 102 27、最长单词 104 函数部分 28、求正整数 2 和 n 之间的完全数 105 29、素数个数 106 30、绝对素数 107 31、亲和数 107 32、回文三位数 108 33、哥德巴赫猜想 109 34、甲流病人初筛 110 35、统计单词数 111 36、素数对 113 37、小蓝家的门牌号 114 38、质数的和与积 115 39、判断素数个数 116 40、最大质因子序列 117 41、二进制分类 118 42、十六进制转十进制 119 43、十进制转十六进制 120 44、简单密码 121 46、图像相似度(2021 真题) 123 47、和为给定数(2021 真题) 125 48、计算两个日期之间的天数 (2021 真题) 126 49、石头剪刀布(2021 真题) 128 50、最长最短单词(2021 真题) 129 51、啤酒厂选址(2021 真题) 131 52、统计误差范围内的数(2020 真题) 132 53、单词倒排(2020 真题) 133 54、细菌的繁殖与扩散(2020 真题) 135 55、大整数加法(2020 真题) 136 56、循环数(2020 真题) 138 57、数字放大 高精度乘法(2021 年 6 月真题) 139 58、统一文件名(2021 年 6 月真题 141 59、求矩阵内部元素之和(2021 年 6 月真题) 142 60、整数奇偶排序(2021 年 6 月真题) 143 61、计算好数(二进制分类)(2021 年 6 月真题) 144 C 语言三级题库 56 题及参考答案 C 语言三级考纲说明 145 1、求 1+2+3+ 146 2、倒序数 146 3、十进制转任意进制 147 4、字符串逆序 148 5、阿克曼(Ackmann)函数 149 6、digit 函数 150 7、Hermite 多项式 150 8、流感传染 151 9、苹果消消乐 154 10、车厢重组 (冒泡排序) 155 11、求逆序对 156 12、谁考了第 k 名 157 13、奇数单增序列 158 14、成绩排序 159 15、奖学金 160 16、分数线划定 162 17、整数奇偶排序 164 18、合影效果(真题 整数奇偶排序 ) 165 19、明明的随机数(排序 去重) 166 20、单词排序 167 21、出现次数超过一半的数 168 22、统计字符数 170 23、昆虫繁殖 171 24、位数问题 171 25、斐波那契数列 173 26、Pell 数列 174 27、上台阶 巧克力吃法问题 176 28、放苹果 177 29、吃糖果 179 30、踩方格 180 31、分解因数 180 32、最大公约数和最小公倍数 182 33、2 的幂次方表示 182 34、计算鞍点 183 35、逆波兰表达式 185 36、求因子和 186 37、质数的和与积 186 38、数字方格 187 39、最简真分数 188 40、全排列 189 41、爬楼梯 190 42、求最大公约数问题 191 43、Minecraft 193 44、因子问题 (真题) 194 45、铺砖 (真题) 194 46、汉诺塔问题 196 47、求最大公约数问题 197 48、因子分解 198 49、完美立方 199 50、猴子吃桃 200 51、 过河卒 (NOIP2002) 201 52、 山区建小学 202 53、 数对 204 54、 井和绳子 205 55、 数列 206 56、 爬楼 207 C 语言四级题库 35 题 C 语言四级考纲说明 207 1、大盗阿福 208 2、数字三角形最佳路径问题 209 3、小球放盒子-动态规划 210 4、最大子矩阵 211 2020 年 12 月真题 212 5、宠物小精灵之收服 212 6、酒鬼 214 7、鸣人的影分身 215 8、重启系统 216 9、登山-动态规划 216 10、最大上升子序列 217 11、判断整除-地推算法 219 12、计算字符串距离 220 2020 年 12 月真题 221 13、开餐馆 221 14、带通配符的字符串匹配 222 2020 年 9 月真题 224 15、怪盗基德的滑翔翼 224 16、糖果 225 17、切割回文 226 2020 年 6 月真题 228 18、最长上升子序列 228 19、核电站 229 20、山区建小学-地推算法 231 21、公共子序列 232 22、数字金字塔 233 23、拦截导弹 234 24、 挖地雷 235 25、 友好城市 237 26、 合唱队形 238 27、 机器分配 240 28、 摘花生 241 29、 最低通行费 242 30、 合并石子 243 31、 乘积最大 244 32、 方格取数 245 33、 滑雪 247 34、 数的划分 动态规划 248 35、 股票买卖 248 ( 第 10 页 共 251 页 ) 学科网(北京)股份有限公司 C 语言一级考纲说明 考试性质 全国青少年软件编程等级考试标准(C/C++)由中国电子学会科普培训与应用推广 中心指定。由全国青少年电子信息科普创新联盟标准工作组开发,由中国电子学会普及 工作委员会审核通过,适用于由中国电子学会主办的青少年软件编程等级考试(C/C++)。 适合人群 适用年龄 8 周岁(建议 10 周岁)以上的青少年。 能力目标 通过本级考核的学生,能对 C 语言有基本的了解,会使用顺序结构、选择结构、循 环结构编写程序,具体用计算思维的方式解决简单的问题。 考核目标 考核内容是根据软件开发所需要的技能和知识,以及国内编程教育的普及情况制 定。主要以考察基础语法、算法和实践应用能力为主。 熟悉 C 语言的基本语法规则;熟悉 C 语言的各种运算符理解顺序结构、选择结构和 循环结构,并能运用它们编写简单的程序 考试标准 1、理解变量的概念 2、掌握变量的定义、类型和转换方法 3、掌握变量的赋值方法 4、掌握编程中基本的输入输出方法 5、掌握编程基础的算术表达式 6、能够完成一个顺序结构的程序 7、理解逻辑运算的基本概念 8、掌握编程基础的逻辑表达式 9、掌握选择语句的功能和写法 10、能够完成一段选择结构的程序 11、掌握循环语句的功能和写法 12、能够完成一段循环结构的程序 能够使用上述方法编写指定功能的正确、完整的程序。 题型配比 考试共 8 道题,都是编程题。 C 语言一级题库 80 题 1、计算(a+b)/c 的值 给定 3 个整数 a、b、c,计算表达式(a+b)/c 的值,/是整除运算。 输入: 输入仅一行,包括三个整数 a、b、c, 数与数之间以一个空格分开。(-10,000 < a,b,c < 10,000, c 不等于 0) 输出: 输出一行,即表达式的值。 样例输入 1 1 3 样例输出 0 2、反向输出一个三位数(2020 年真题) 将一个三位数反向输出。 输入: 一个三位数 n。 输出: 反向输出 n。 样例输入 100 样例输出 001 3、打印字符 输入一个 ASCII 码,输出对应的字符。 输入 一个整数,即字符的 ASCII 码,保证存在对应的可见字符。 输出 一行,包含相应的字符。 样例输入 65 样例输出 A ( 内部资料 请勿外传 翻印必究 ) 4、输出保留 12 位小数的浮点数 读入一个双精度浮点数,保留 12 位小数,输出这个浮点数。 输入: 只有一行,一个双精度浮点数。 输出: 也只有一行,保留 12 位小数的浮点数。 样例输入 3.1415926535798932 样例输出 3.141592653580 5、判断能否被 3,5,7 整除 给定一个整数,判断它能否被 3,5,7 整除,并输出以下信息: 1、能同时被 3,5,7 整除(直接输出 3 5 7,每个数中间一个空格); 2、只能被其中两个数整除(输出两个数,小的在前,大的在后。例如:3 5 或者 3 7 或者 5 7,中间用空格分隔); 3、只能被其中一个数整除(输出这个除数); 4、不能被任何数整除,输出小写字符‘n’,不包括单引号。 输入: 输入一行,包括一个整数。 输出: 输出一行,按照描述要求给出整数被 3,5,7 整除的情况。 6、骑车与走路 在北大校园里,没有自行车,上课办事会很不方便.但实际上,并非去办任何事情都是 骑车快,因为骑车总要找车、开锁、停车、锁车等,这要耽误一些时间.假设找到自行车, 开锁并车上自行车的时间为 27 秒;停车锁车的时间为 23 秒;步行每秒行走 1.2 米,骑车 每秒行走 3.0 米。请判断走不同的距离去办事,是骑车快还是走路快。 输入:输入一行,包含一个整数,表示一次办事要行走的距离,单位为米。 输出:输出一行,如果骑车快,输出一行"Bike";如果走路快,输出一行"Walk";如果一样 快,输出一行"All"。 样例输入 120 样例输出 Bike 根据参数,画出矩形。 输入: 输入一行,包括四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于 3 行 不多于 10 行,宽不少于 5 列不多于 10 列);第三个参数是一个字符,表示用来画图的 矩形符号;第四个参数为 1 或 0,0 代表空心,1 代表实心。 输出:输出画出的图形。 样例输入 7 7 @ 0 样例输出 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 8、含 k 个 3 的数 输入两个正整数 m 和 k,其中 1 < m < 100000,1 < k < 5 ,判断 m 能否被 19 整除,且恰好含有 k 个 3,如果满足条件,则输出 YES,否则,输出 NO。 例如,输入: 43833 3 满足条件,输出 YES。 如果输入: 39331 3 尽管有 3 个 3,但不能被 19 整除,也不满足条件,应输出 NO。 输入: m 和 k 的值,中间用单个空格间隔。 输出: 满足条件时输出 YES,不满足时输出 NO。 样例输入 43833 3 样例输出 YES ( 内部资料 请勿外传 翻印必究 ) ( 7 、画矩形 ) 9、计算表达式的值 给定整数 x,y 的值,计算 3*x+2*y 的值。 输入 一行包括 2 个整数 x,y,以空格作为分隔。数据保证最后计算结果还在整数表示范围内。 (-10000<a,b,c<10000) 输出 按照题目要求输出结果。 样例输入 2 3 样例输出 12 10、判断是否存在重复的数(2019 年真题) 给定 3 个数,判断是否存在 2 个数相等,如果存在输出“YES”,否则输出“NO”。 输入 一行,包括 3 个整数,以空格分隔。 输出 按照题目要求输出结果。 样例输入:2 7 2 样例输出:YES 11、日期输出 给定两个整数,表示一个日期的月和日。请按照“MM-DD”的格式输出日期,即如果 月和日不到 2 位时,填补 0 使得满足 2 位。 输入 2 个整数 m,d(0<m<=12,0<d<=31)。 数据保证日期合法。 输出 按照题目要求输出日期 样例输入 7 18 样例输出 07-18 12、与指定数字相同的数的个数 输出一个整数序列中与指定数字相同的数的个数。 输入 输入包含 2 行:第一行为 N 和 m,表示整数序列的长度(N <= 100)和指定的数字,中间 ( 内部资料 请勿外传 翻印必究 ) 用一个空格分开;第 2 行为 N 个整数,整数之间以一个空格分开。 输出 输出为 N 个数中与 m 相同的数的个数。 样例输入 3 2 2 3 2 样例输出 2 13、输出第二个整数 输入三个整数,把第二个输入的整数输出。 输入 只有一行,共三个整数,整数之间由一个空格分隔。整数是 32 位有符号整数。 输出 只有一行,一个整数,即输入的第二个整数。 样例输入:123 456 789 样例输出:456 14、浮点数向零舍入 输入一个单精度浮点数,将其向零舍入到整数。 说明:向零舍入的含义是,正数向下舍入,负数向上舍入。 提示:可以使用强制类型转换来实现。 输入:一个单精度浮点数。 输出:一个整数,即向零舍入到整数的结果。 样例输入:2.3 样例输出:2 15、计算(a+b)*c 的值 给定 3 个整数 a、b、C,计算表达式(a+b)*c 的值。 输入 输入仅一行,包括三个整数 a、b、C,数与数之间以一个空格分开。(-10000<a,b,c<10000) 输出 输出一行,即表达式的值。 样例输入:2 3 5 样例输出:25 16、苹果和虫子 你买了一箱 n 个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每 X 小时能 吃掉一个苹果,假设虫子在吃完一个苹果之前不会吃另一个,那么经过 y 小时你还有多 少个完整的苹果? 输入 输入仅一行,包括 n,X 和 y(均为整数)。输入数据保证 y<=n*X。 输出 输出也仅一行,剩下的苹果个数。 样例输入 10 4 9 样例输出 7 17、输出绝对值 输入一个浮点数,输出这个浮点数的绝对值。 输入 输入一个浮点数,其绝对值不超过 10000。 输出 输出这个浮点数的绝对值,保留到小数点后两位。 样例输入:-3.14 样例输出:3.14 18、计算邮资 根据邮件的重量和用户是否选择加急计算邮费。 计算规则: 重量在 1000 克以内(包括 1000 克),基本费 8 元。 超过 1000 克的部分每 500 克加收超重费 4 元,不足 500 克部分按 500 克计算;如果用户 选择加急,多收 5 元。 输入 输入一行,包含整数和一个字符,以一个空格分开,分别表示重量(单位为克)和是否加 急。 如果字符是 y,说明选择加急;如果字符是 n,说明不加急。 输出 输出一行,包含一个整数,表示邮费。 样例输入 1200 y 样例输出 17 19、求整数的和与均值 读入 n(1<=n<=10000)个整数,求它们的和与均值。 时间跟制:1000 内存限制:65536 输入 输入第一行是一个整数 n,表示有 n 个整数。 第 2~n+1 行每行包含 1 个整数。 每个整数的绝对值均不超过 10000 输出 输出一行,先输出和,再输出平均值(保留到小数点后 5 位), 两个数用单个空格分隔。 样例输入:4 344 222 343 222 样例输出 1131 282.75000 20、数 1 的个数 给定一个十进制正整数 n,写下从 1 到 n 的所有整数,然后数一下其中出现的数字 1 的个数。 例如: 当 n=2 时,写下 1,2。 这样只出现了 1 个 1; 当 n=12 时,写下 1,2,3,4,5,6,7,8,9,10,11,12。 这样出现了 5 个 1。 输入:正整数 n。1<=n<=10000。 输出:一个正整数,即 1 的个数。 样例输入 12 样例输出 5 21、逻辑判断问题 输入三个数 a,b,c,输出最大者。 22、ASCII 码 输入一个字符,通过计算输出该字符的前一个字符和后一个字符。 23、判断平闰年 判断闰年的规则:四年一闰,百年不闰, 四百年一闰。 输入的年份是闰年,则输出“YES”,否则输出“NO”。 24、求最大公约数 输入两个整数后,求这两个整数的最大公约数。 25、分糖果游戏 有三个小朋友甲乙丙。甲有 50 粒糖果,乙有 43 粒糖果,丙有 13 粒糖果。现在他们做一个游戏。从甲开始,将自己的糖分三份,自己留一份,其余 两份分别给乙与丙,多余的糖果自己吃掉,然后乙与丙也依次这样做。问最后甲、乙、 丙三人各有多少粒糖果? 26、自行车和三轮车 鸡兔同笼问题 某车棚存有自行车和三轮车共 65 辆,它 们的轮子数合计为 150 个,求该棚内存有的自行车和三轮车各是多少辆? 27、数据分段问题 某市的士费起步价 8 元,可以行驶 3 公里。3 公里以后, 按每公里 1.6 元计算,输入的士的公里数,请你计算顾客需付费多少元? 28、字符菱形 给定一个字符,用它构造一个对角线长 5 个字符,倾斜放置的菱形。 输入:输入只有一行, 包含一个字符。 输出 该字符构成的菱形。 样例输入 * 样例输出 * *** ***** *** * 29、对齐输出 读入三个整数,按每个整数占 8 个字符的宽度,右对齐输出它们。 输入 只有一行,包含三个整数,整数之间以一个空格分开。 输出 只有一行,按照格式要求依次输出三个整数,之间以一个空格分开。 样例输入 123456789 0 -1 样例输出 123456789 0 -1 30、等差数列末项计算 给出一个等差数列的前两项 a1,a2,求第 n 项是多少。 输入 一行,包含三个整数 a1,a2,n。-100 <= a1,a2 <= 100,0 < n <= 1000。 输出 一个整数,即第 n 项的值。 样例输入:1 4 100 样例输出:298 31、计算线段长度 已知线段的两个端点的坐标 A(Xa,Ya),B(Xb,Yb),求线段 AB 的长度。 输入共两行。 第一行是两个实数 Xa,Ya,即 A 的坐标。 第二行是两个实数 Xb,Yb,即 B 的坐标。 输入中所有实数的绝对值均不超过 10000。 输出 一个实数,即线段 AB 的长度,保留到小数点后 3 位。 样例输入 1 1 2 2 样例输出 1.414 32、计算 2 的幂 给定非负整数 n,求 2n。 输入 一个整数 n。0 <= n < 31。 输出 一个整数,即 2 的 n 次方。 样例输入 3 样例输出 8 ( 第 20 页 共 251 页 ) 学科网(北京)股份有限公司 33、奇偶数判断 给定一个整数,判断该数是奇数还是偶数。 输入 输入仅一行,一个大于零的正整数 n。 输出 输出仅一行,如果 n 是奇数,输出 odd;如果 n 是偶数,输出 even。 样例输入 5 样例输出 odd 34、分段函数 编写程序,计算下列分段函数 y=f(x)的值。 y=-x+2.5; 0 <= x < 5 y=2-1.5(x-3)(x-3); 5 <= x < 10 y=x/2-1.5; 10 <= x < 20 输入 一个浮点数 N,0 <= N < 20 输出 输出 N 对应的分段函数值:f(N)。结果保留到小数点后三位。 样例输入 1.0 样例输出 1.500 35、银行利息 农夫约翰在去年赚了一大笔钱!他想要把这些钱用于投资,并对自己能得到多少收 益感到好奇。已知投资的复合年利率为 R(0 到 20 之间的整数)。约翰现有总值为 M 的 钱(100 到 1,000,000 之间的整数)。他清楚地知道自己要投资 Y 年(范围 0 到 400)。 请帮助他计算最终他会有多少钱,并输出它的整数部分。数据保证输出结果在 32 位有 符号整数范围内。 输入 一行包含三个整数 R,M,Y,相邻两个整数之间用单个空格隔开。 输出 一个整数,即约翰最终拥有多少钱(整数部分)。 样例输入 5 5000 4 样例输出 6077 提示 在样例中, 第一年后: 1.05 * 5000 = 5250 第二年后: 1.05 * 5250 = 5512.5 第三年后: 1.05 * 5512.50 = 5788.125 第四年后: 1.05 * 5788.125 = 6077.53125 6077.53125 的整数部分为 6077。 来源:USACO 2004 November 36、财务管理 Larry 今年毕业并找到了一份工作。他赚很多钱,但似乎总是不够。Larry 认为他需 要控制他的投资以解决自己的财务问题。Larry 拿到了自己的银行账户详单,想看看自 己有多少钱。请帮助 Larry 写一个程序,通过过去 12 个月中每月的月末结余,计算平 均结余。 输入 输入包含 12 行,每行包含一个数,为某个月的结余。每个数都是不大于 1,000,000 的 正数,保留两位小数,省略"$"符。 输出 输出一个数,为这 12 个月的平均月末结余,保留到小数点后第二位,并在最前面加一 个"$"符。 样例输入 100.00 489.12 12454.12 1234.10 823.05 109.20 5.27 1542.25 839.18 83.99 1295.01 1.75 样例输出 $1581.42 37、计算多项式的值 对于多项式 f(x) = ax3 + bx2 + cx + d 和给定的 a, b, c, d, x,计算 f(x)的值。 输入 输入仅一行,包含 5 个实数,分别是 x,及参数 a、b、c、d 的值,每个数都是绝对值不 超过 100 的双精度浮点数。数与数之间以一个空格分开。 输出:输出一个实数,即 f(x)的值,保留到小数点后 7 位。 样例输入:2.31 1.2 2 2 3 样例输出:33.0838692 38、温度表达转化 利用公式 C = 5 * (F-32) / 9 (其中 C 表示摄氏温度,F 表示华氏温度) 进行计 算转化。 输入 输入一行,包含一个实数 f,表示华氏温度。(f >= -459.67) 输出 输出一行,包含一个实数,表示对应的摄氏温度,要求精确到小数点后 5 位。 样例输入 41 样例输出 5.00000 提示 C/C++,使用 double 39、与圆相关的计算 给出圆的半径,求圆的直径、周长和面积。 输入 输入包含一个实数 r(0 < r <= 10,000),表示圆的半径。 输出 输出一行,包含三个数,分别表示圆的直径、周长、面积,数与数之间以一个空格分开, 每个数保留小数点后 4 位。 样例输入 3.0 样例输出 6.0000 18.8495 28.2743 提示 如果圆的半径是 r,那么圆的直径、周长、面积分别是 2*r、2 * pi * r、pi * r * r, 其中约定 pi=3.14159。 可以使用 printf("%.4lf", ...)实现保留小数点后 4 位。 来源:习题(3-1) 计算概论 07(工学院)周文灵 40、大象喝水 一只大象口渴了,要喝 20 升水才能解渴,但现在只有一个深 h 厘米,底面半径为 r 厘米的小圆桶(h 和 r 都是整数)。问大象至少要喝多少桶水才会解渴。 输入 输入有一行:包行两个整数,以一个空格分开,分别表示小圆桶的深 h 和底面半径 r, 单位都是厘米。 输出 输出一行,包含一个整数,表示大象至少要喝水的桶数。 样例输入 23 11 样例输出 3 提示 如果一个圆桶的深为 h 厘米,底面半径为 r 厘米,那么它最多能装 Pi * r * r * h 立 方厘米的水。(设 Pi=3.14159) 1 升 = 1000 毫升 1 毫升 = 1 立方厘米 来源:计算概论化学学院期末考试 41、判断是否为两位数 判断一个正整数是否是两位数(即大于等于 10 且小于等于 99)。 输入 一个正整数,不超过 1000。 输出 一行。若该正整数是两位数,输出 1,否则输出 0。 样例输入 54 样例输出 1 42、三角形判断 给定三个正整数,分别表示三条线段的长度,判断这三条线段能否构成一个三角形。 输入 输入共一行,包含三个正整数,分别表示三条线段的长度,数与数之间以一个空格分开。 输出 如果能构成三角形,则输出“yes” ,否则输出“no”。 样例输入:3 4 5 样例输出:Yes 43、简单计算器 一个最简单的计算器,支持+, -, *, / 四种运算。仅需考虑输入输出为整数的情况, 数据和运算结果不会超过 int 表示的范围。 输入 输入只有一行,共有三个参数,其中第 1、2 个参数为整数,第 3 个参数为操作符 (+,-,*,/)。 输出 输出只有一行,一个整数,为运算结果。然而: 1. 如果出现除数为 0 的情况,则输出:Divided by zero! 2. 如果出现无效的操作符(即不为 +, -, *, / 之一),则输出:Invalid operator! 样例输入: 1 2 + 样例输出: 3 提示:可以考虑使用 if 和 switch 44、最高的分数 孙老师讲授的《计算概论》这门课期中考试刚刚结束,他想知道考试中取得的最高 分数。因为人数比较多,他觉得这件事情交给计算机来做比较方便。你能帮孙老师解决 这个问题吗? 输入:输入两行,第一行为整数 n(1 <= n < 100),表示参加这次考试的人数.第二行 是这 n 个学生的成绩,相邻两个数之间用单个空格隔开。所有成绩均为 0 到 100 之间的 整数。 输出;输出一个整数,即最高的成绩。 样例输入 5 85 78 90 99 60 样例输出 99 我国现有 x 亿人口,按照每年 0.1%的增长速度,n 年后将有多少人? 输入:一行,包含两个整数 x 和 n,分别是人口基数和年数,以单个空格分隔。 输出:输出最后的人口数,以亿为单位,保留到小数点后四位。1 <= x <= 100, 1 <= n <= 100。 样例输入:13 10 样例输出:13.1306 46、斐波那契数列 斐波那契数列是指这样的数列: 数列的第一个和第二个数都为 1,接下来每个数都 等于前面 2 个数之和。 给出一个正整数 k,要求菲波那契数列中第 k 个数是多少。 输入 输入一行,包含一个正整数 k。(1 <= k <= 46) 输出 输出一行,包含一个正整数,表示菲波那契数列中第 k 个数的大小 样例输入:19 样例输出:4181 47、球弹跳高度的计算 一球从某一高度落下(整数,单位米),每次落地后反跳回原来高度的一半,再落 下。 编程计算球在第 10 次落地时,共经过多少米? 第 10 次反弹多高? 输入 输入一个整数 h,表示球的初始高度。 输出 输出包含两行: 第 1 行:到球第 10 次落地时,一共经过的米数。 第 2 行:第 10 次弹跳的高度。 注意:结果可能是实数,结果用 double 类型保存。 提示:输出时不需要对精度特殊控制,用 cout << ANSWER,或者 printf("%g", ANSWER) 即可。 样例输入:20 样例输出 59.9219 0.0195313 ( 内部资料 请勿外传 翻印必究 ) ( 45 、人口增长问题 ) 所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘 3 加 1,如果是偶数, 则除以 2,得到的结果再按照上述规则重复处理,最终总能够得到 1。如,假定初始整 数为 5,计算过程分别为 16、8、4、2、1。 程序要求输入一个整数,将经过处理得到 1 的过程输出来。 输入 一个正整数 N(N <= 2,000,000) 输出 从输入整数到 1 的步骤,每一步为一行,每一部中描述计算过程。最后一行输出"End"。 如果输入为 1,直接输出"End"。 样例输入 5 样例输出 5*3+1=16 16/2=8 8/2=4 4/2=2 2/2=1 End 49、统计满足条件的 4 位数个数 给定若干个四位数,求出其中满足以下条件的数的个数: 个位数上的数字减去千位数上的数字,再减去百位数上的数字, 再减去十位数上的数 字的结果大于零。 输入 输入为两行,第一行为四位数的个数 n,第二行为 n 个的四位数,数与数之间以一个空 格分开。(n <= 100) 输出 输出为一行,包含一个整数,表示满足条件的四位数的个数。 样例输入 5 1234 1349 6119 2123 5017 样例输出:3 ( 内部资料 请勿外传 翻印必究 ) ( 48 、角谷猜想( 2021 真题) ) 给定一个整数,要求从个位开始分离出它的每一位数字。 输入:输入一个整数,整数在 1 到 100000000 之间。 输出:从个位开始按照从低位到高位的顺序依次输出每一位数字。数字之间以一个空格 分开。 样例输入:123 样例输出:3 2 1 51、开关灯 假设有 N 盏灯(N 为不大于 5000 的正整数),从 1 到 N 按顺序依次编号,初始时全部 处于开启状态;有 M 个人(M 为不大于 N 的正整数)也从 1 到 M 依次编号。 第一个人(1 号)将灯全部关闭,第二个人(2 号)将编号为 2 的倍数的灯打开,第三 个人(3 号)将编号为 3 的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打 开)。依照编号递增顺序,以后的人都和 3 号一样,将凡是自己编号倍数的灯做相反处 理。 请问:当第 M 个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号 间隔。 输入正整数 N 和 M,以单个空格隔开。 顺次输出关闭的灯的编号,其间用逗号间隔。 样例输入:10 10 样例输出:1,4,9 52、地球人口承载力估计 假设地球上的新生资源按恒定速度增长。照此测算,地球上现有资源加上新生资源 可供 x 亿人生活 a 年,或供 y 亿人生活 b 年。 为了能够实现可持续发展,避免资源枯竭,地球最多能够养活多少亿人? 输入 输入只有一行,包括四个正整数 x,a,y,b,两个整数之间用单个空格隔开。x>y,a<b, ax<by,各整数均不大于 10000。 输出 一个实数 z,表示地球最多养活 z 亿人,舍入到小数点后两位。 输入样例 110 90 90 210 输出样例 75.00 ( 内部资料 请勿外传 翻印必究 ) ( 50 、分离整数的各个数位 ) 两个整数 a 和 b 分别作为分子和分母,既分数 a/b,求它的浮点数值(双精度浮点 数,保留小数点后 9 位)。 输入 输入仅一行,包括两个整数 a 和 b。 输出 输出也仅一行,分数 a/b 的浮点数值(双精度浮点数,保留小数点后 9 位)。 输入样例 5 7 输出样例 0.714285714 54、晶晶赴约会(2021 年真题) 晶晶的朋友贝贝约晶晶下周一起去看展览,但晶晶每周的 1、3、5 有课必须上课, 请帮晶晶判断她能否接受贝贝的邀请,如果能输出 YES;如果不能则输出 NO。注意 YES 和 NO 都是大写字母! 输入:输入有一行,贝贝邀请晶晶去看展览的日期,用数字 1 到 7 表示从星期一到星期 日。输出:输出有一行,如果晶晶可以接受贝贝的邀请,输出 YES,否则,输出 NO。注 意 YES 和 NO 都是大写字母! 输入样例:2 输出样例:YES 55、求平均年龄 班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄, 保留到小数点后两位。 输入:第一行有一个整数 n(1≤ n ≤ 100),表示学生的人数。其后 n 行每行有 1 个整 数,表示每个学生的年龄,取值为 15 到 25。 输出:输出一行,该行包含一个浮点数,为要求的平均年龄,保留到小数点后两位。 输入样例 2 18 17 输出样例:17.50 ( 内部资料 请勿外传 翻印必究 ) ( 53 、计算分数的浮点数值 ) 56、最高的分数 孙老师讲授的《计算概论》这门课期中考试刚刚结束,他想知道考试中取得的最高 分数。因为人数比较多,他觉得这件事情交给计算机来做比较方便。你能帮孙老师解决 这个问题吗? 输入:输入两行,第一行为整数 n(1 ≤ n < 100),表示参加这次考试的人数.第二行 是这 n 个学生的成绩,相邻两个数之间用单个空格隔开。所有成绩均为 0 到 100 之间的 整数。 输出:输出一个整数,即最高的成绩。 输入样例 5 85 78 90 99 60 输出样例: 99 57、奥运奖牌计数 2008 年北京奥运会,A 国的运动员参与了 n 天的决赛项目(1≤n≤17)。现在要统计 一下 A 国所获得的金、银、铜牌数目及总奖牌数。输入第 1 行是 A 国参与决赛项目的天 数 n,其后 n 行,每一行是该国某一天获得的金、银、铜牌数目。输出 4 个整数,为 A 国所获得的金、银、铜牌总数及总奖牌数。 输入 输入 n+1 行,第 1 行是 A 国参与决赛项目的天数 n,其后 n 行,每一行是该国某一天获 得的金、银、铜牌数目,以一个空格分开。 输出 输出 1 行,包括 4 个整数,为 A 国所获得的金、银、铜牌总数及总奖牌数,以一个空格 分开。 输入样例 3 1 0 3 3 1 0 0 3 0 输出样例 4 4 3 11 ( 第 30 页 共 251 页 ) 学科网(北京)股份有限公司 58、奇数求和 计算非负整数 m 到 n(包括 m 和 n)之间的所有奇数的和,其中,m 不大于 n,且 n 不 大于 300。例如 m=3, n=12, 其和则为:3+5+7+9+11=35。 输入:两个数 m 和 n,两个数以一个空格分开,其中 0 ≤ m ≤ n ≤ 300 。 输出:输出一行,包含一个整数,表示 m 到 n(包括 m 和 n )之间的所有奇数的和 输入样例 7 15 输出样例 55 59、整数的个数(2020 年真题) 给定 k(1<k<100)个正整数,其中每个数都是大于等于 1,小于等于 10 的数。写程序 计算给定的 k 个正整数中,1,5 和 10 出现的次数。 输入:输入有两行:第一行包含一个正整数 k,第二行包含 k 个正整数,每两个正整数 用一个空格分开。 输出:输出有三行,第一行为 1 出现的次数,,第二行为 5 出现的次数,第三行为 10 出现的次数。 输入样例 5 1 5 8 10 5 输出样例 1 2 1 60、救援 救生船从大本营出发,营救若干屋顶上的人回到大本营,屋顶数目以及每个屋顶的 坐标和人数都将由输入决定,求出所有人都到达大本营并登陆所用的时间。 在直角坐标系的原点是大本营,救生船每次从大本营出发,救了人之后将人送回大本营。 坐标系中的点代表屋顶,每个屋顶由其位置坐标和其上的人数表示。救生船每次从大本 营出发,以速度 50 米/分钟驶向下一个屋顶,达到一个屋顶后,救下其上的所有人,每 人上船 1 分钟,船原路返回,达到大本营,每人下船 0.5 分钟。假设原点与任意一个屋 顶的连线不穿过其它屋顶。 输入 第一行,一个整数,表示屋顶数 n。接下来依次有 n 行输入,每一行上包含两个表示屋 顶相对于大本营的平面坐标位置的实数(单位是米)、一个表示人数的整数。 ( 内部资料 请勿外传 翻印必究 ) 输出 救援需要的总时间,精确到分钟(向上取整)。 输入样例 1 30 40 3 输出样例 7 解题思路:一次救援一个地方,给出了救援的坐标,和每次救援需要上船的人数,上船 和下船需要花费时间,过去和回来的路上也需要花费时间,让计算一共花费的总时间, 向上取整精确到分钟。 给定平面任意两点坐标(x1,y1)和(x2,y2)距离公式为: sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)) 故,(x,y)与坐标原点(0,0)直接的距离计算公式:sqrt(x*x+y*y) 61、津津的储蓄计划 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 元钱,津津会预算 这个月的花销,并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了 年末她会加上 20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈 妈给的零花钱后,如果她预计到这个月的月末手中还会有多于 100 元或恰好 100 元,她 就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。 例如 11 月初津津手中还有 83 元,妈妈给了津津 300 元。津津预计 11 月的花销是 180 元,那么她就会在妈妈那里存 200 元,自己留下 183 元。到了 11 月月末,津津手中 会剩下 3 元钱。 现在请你根据 2004 年 1 月到 12 月每个月津津的预算,判断会不会出现这种情况。如果 不会,计算到 2004 年年末,妈妈将津津平常存的钱加上 20%还给津津之后,津津手中 会有多少钱。 输入: 包括 12 行数据,每行包含一个小于 350 的非负整数,分别表示 1 月到 12 月津 津的预算。 输出: 只包含一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出 -X,X 表示出现这种情况的第一个月;否则输出到 2004 年年末津津手中会有多少钱。 输入样例 290 230 280 200 300 170 340 50 90 80 200 60 输出样例: -7 62、正常血压 监护室每小时测量一次病人的血压,若收缩压在 90-140 之间并且舒张压在 60-90 之间(包含端点值)则称之为正常,现给出某病人若干次测量的血压值,计算病人保持正 常血压的最长小时数。 输入 第一行为一个正整数 n(n<100),其后有 n 行,每行 2 个正整数,分别为一次测量的收缩 压和舒张压。 输出 输出仅一行,血压连续正常的最长小时数。 输入样例 4 100 80 90 50 120 60 140 90 输出样例 2 63、计算星期几 假设今天是星期日,那么 a^b 天之后是星期几? 输入 两个正整数 a,b,中间用单个空格隔开。0<a≤100, 0<b≤10000。 输出 一个字符串,代表过 a^b 天之后是星期几。 其中,Monday 是星期一,Tuesday 是星期二,Wednesday 是星期三,Thursday 是星期四, Friday 是星期五,Saturday 是星期六,Sunday 是星期日。 输入样例: 3 2000 输出样例: Tuesday 64、数字反转 给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常 见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零,例如 输入-380,反转后得到的新数为-83。 输入:输入共 1 行,一个整数 N。-1,000,000,000 ≤ N≤ 1,000,000,000。 输出:输出共 1 行,一个整数,表示反转后的新数。 输入样例:123 输出样例:321 65、求阶乘的和 给定正整数 n,求不大于 n 的正整数的阶乘的和(即求 1!+2!+3!+...+n!),输出阶 乘的和。 输入:输入有一行,包含一个正整数 n(1 < n < 12)。 输出:输出有一行:阶乘的和。 输入样例:5 输出样例:153 66、质因数分解 已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。 输入 输入只有一行,包含一个正整数 n。 对于 60%的数据,6≤n≤1000。 对于 100%的数据,6≤n≤2×10^9。 输出 输出只有一行,包含一个正整数 p,即较大的那个质数。 输入样例 21 输出样例 7 67、计算并联电阻 对于阻值为 r1 和 r2 。 输入两个电阻阻抗大小,浮点型。输出并联之后的阻抗大小,结果保留小数点后 2 位。 输入 两个电阻阻抗大小,浮点型,以一个空格分开。 输出 并联之后的阻抗大小,结果保留小数点后 2 位。 输入样例 1 2 输出样例 0.67 68、计算球的体积 对于半径为 r 的球,其体积的计算公式为 V=43πr3,这里取 π=3.14。 现给定 r,即球半径,类型为 double,求球的体积 V,保留到小数点后 2 位。 输入 输入为一个不超过 100 的非负实数,即球半径,类型为 double。 输出 输出一个实数,即球的体积,保留到小数点后 2 位。 输入样例 4 输出样例 267.95 69、行李收费 乘坐飞机时,当乘客行李小于等于 20 公斤时,按每公斤 1.68 元收费,大于 20 公斤 时,按每公斤 1.98 元收费,编程计算收费(保留 2 位小数)。 输入 行李重量。 输出 费用(保留 2 位小数)。 输入样例:20.00 输出样例:33.60 ( 内部资料 请勿外传 翻印必究 ) 70、买笔方案 期末来临了,班长小 Q 决定将剩余班费 x 元钱,用于购买若干支钢笔奖励给一些学 习好、表现好的同学。已知商店里有三种钢笔,它们的单价为 6 元、5 元和 4 元。小 Q 想买尽量多的笔(鼓励尽量多的同学),同时他又不想有剩余钱。请您编一程序,帮小 Q 制订出一种买笔的方案。 输入 一个正整数 x(剩余班费)。 输出 一行,依次为 6 元、5 元和 4 元钱笔的数目,用一个空格隔开。 输入样例:10 输出样例: 1 0 1 71、输出整数(2020 年真题) 输入四个整数,把输入的第三、第四个整数输出。 输入 只有一行,共四个整数,整数之间由一个空格分隔。整数是 32 位有符号整数。 输出 只有一行,二个整数,即输入的第三、第四个整数,以一个空格分开。 样例输入 12 34 56 789 样例输出 56 789 72、新冠疫情死亡率(2020 年真题) 2020 年全世界爆发了新冠疫情,请根据某个国家报告的新冠确诊数和死亡数,计算 新冠疫情在该国的死亡率。 输入 输入仅一行,有两个整数,第一个为确诊数,第二个为死亡数。 输出 输出仅一行,新冠死亡率,以百分数形式输出,精确到小数点后 3 位。 样例输入:10433 60 样例输出:0.575% 提示:输出%可以使用 printf(“%%”) 给出一名学生的语文和数学成绩,判断他是否恰好有一门课不及格(成绩小于 60 分)。 输入 一行,包含两个在 0 到 100 之间的整数,分别是该生的语文成绩和数学成绩。 输出 若该生恰好有一门课不及格,输出 1;否则输出 0。 样例输入 50 80 样例输出 1 74、骑士的金币(2020 年真题) 国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天 (第二天和第三天)里,每天收到两枚金币;之后三天(第四、五、六天)里,每天收 到三枚金币;之后四天(第七、八、九、十天)里,每天收到四枚金币……这种工资发 放模式会一直这样延续下去:当连续 N 天每天收到 N 枚金币后,骑士会在之后的连续 N+1 天里,每天收到 N+1 枚金币(N 为任意正整数)。 你需要编写一个程序,确定从第一天开始的给定天数内,骑士一共获得了多少金币。 输入 一个整数(范围 1 到 10000),表示天数。 输出 骑士获得的金币数。 样例输入:6 样例输出:14 75、求满足条件的 3 位数(2020 年真题) 编写程序,按从小到大的顺序寻找同时符合条件 1 和 2 的所有 3 位数,条件为: 1.该数为完全平方数 2.该数至少有 2 位数字相同 例如,100 同时满足上面两个条件。 输入 输入一个数 n,n 的大小不超过实际满足条件的 3 位数的个数。 输出 输出为第 n 个满足条件的 3 位数(升序) 样例输入:1 样例输出:100 ( 内部资料 请勿外传 翻印必究 ) ( 73、 有一门课不及格的学生( 2020 年真题) ) 编写程序,按从小到大的顺序寻找同时符合条件 1 和 2 的所有 3 位数,条件为: 1.该数为完全平方数 2.该数至少有 2 位数字相同 例如,100 同时满足上面两个条件。 输入一个整数和双精度浮点数,先将浮点数保留 2 位小数输岀,然后输出整数。 输入 一行两个数,分别为整数 N (不超过整形范 围),双精度浮点数 F ,以一个空格分 开。 输出 一行两个数,分别为保留 2 位小数输出的 F,以及整数 N,以一个空格分开。 样例输入 100 123.456789 样例输出 123.46 100 77、大写字母的判断(2021 年 6 月真题) 输入一个字符,判断是否是英文大写字母.即是否是 A-Z 中的一个。 如果是英文大写字母,则输出 YES,否者输 NO 样例输入:K 样例输出: YES 78、特殊求和(2021 年 6 月真题) 如果一个数能等被 7 整除或者十制表示中含有数字 7,那么我们称这个数为幻数, 比如 17 21 73 是幻数 而 6 59 不是。为于给定的 N 求上 1-N 中所有幻数的和。 输入 一个整数 N (1< N<1000。 输出 一个整数 表示 1-N 中所有幻数的和 样例输入:14 样例输出:21 ( 内部资料 请勿外传 翻印必究 ) ( 76、 数的输入和输出( 2021 年 6 月真题) ) 79、硬币翻转(开关门开关灯(2021 年 6 月真题) 假设有 N 枚硬币(N 为不大于 5000 的正整数),从 1 到 N 按顺序依次编号,初始时全 部处于正面向上状态;有 M 个人(M 为不大于 N 的正整数)也从 1 到 M 依次编号。 第一个人(1 号)将硬币全部翻转一次,第二个人(2 号)将编号为 2 的倍数的硬币翻转, 第三个人(3 号)将编号为 3 的倍数的硬币翻转一次。依照编号递增顺序,以后的人都和 3 号一样,将凡是自己编号倍数的硬币翻转一次。 请问:当第 M 个人操作之后,哪些硬币是正面向上的,按从小到大输出其编号,以 空格分开。 80、百钱百鸡问题 (搬砖问题) 我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一 值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何? ( 内部资料 请勿外传 翻印必究 ) C 语言一级题库 80 题参考答案 1、计算(a+b)/c 的值 #include<iostream> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; cout<<(a+b)/c; return 0; } 2、反向输出一个三位数 #include<iostream> using namespace std; int main() { int n; cin>>n; cout<<n%10<<n/10%10<<n/100; return 0;} 3、打印字符 #include<iostream> using namespace std; int main() { int a; cin>>a; cout<<char(a); return 0; } ( 第 40 页 共 251 页 ) 学科网(北京)股份有限公司 4、保留 12 位小数的浮点数 #include<cstdio> #include<iostream> using namespace std; int main() { double a; cin>>a; printf("%0.12f",a ); return 0; } 5、判断能否被 3,5,7 整除 #include<iostream> using namespace std; int main() { int x; cin>>x; if(x%3==0) cout<<3<<" "; if(x%5==0) cout<<5<<" "; if(x%7==0) cout<<7; if(x%3!=0&&x%5!=0&&x%7!=0) cout<<"n"; return 0; } 6、骑车与走路 #include<iostream> using namespace std; int main() { int n; float bx,qc; cin>>n; qc=(n/3.0)+27+23; bx=n/1.2; if(qc<bx) cout<<"Bike"; if(qc>bx) cout<<"Walk"; if(qc==bx) cout<<"All"; return 0; } 7、画矩形 #include<iostream> using namespace std; int main() { int i,j,gao,kuan,s; char a; cin>>gao>>kuan>>a>>s; for(i=1;i<=gao;i++) { for(j=1;j<=kuan;j++) { if(s==0&&i>1&&i<gao&&j>1&&j<kuan) cout<<" ";//仅考虑什么情况输出空格 else cout<<a; } cout<<endl; } return 0; } 8、含 k 个 3 的数 #include<iostream> using namespace std; int main() { int m,k,sum=0,t; cin>>m>>k; t=m;//保留现场,因为下面循环结束后 m=0 m%19==0 永远为真 while(m>0) { if(m%10==3) sum++; //分离出来的个位数等于 3 m=m/10; //减少一位 } if(t%19==0 && sum==k) //m 能被 19 整除且含有 k 个 3 cout<<"YES"; else cout<<"NO"; return 0; } ( 内部资料 请勿外传 翻印必究 ) 方法二、 #include<iostream> using namespace std; int main() { int m,k,sum=0,t; cin>>m>>k; if(m%19==0) //最容易判断的条件不满足就不再进行其他判断 { while(m>0) { if(m%10==3) sum++; //分离出来的个位数等于 3 m=m/10; //减少一位 } if(t%19==0 && sum==k) //m 能被 19 整除且含有 k 个 3 cout<<"YES"; else cout<<"NO"; } else cout<<"NO"; return 0; } 9、计算表达式的值 #include<iostream> using namespace std; int main() { int x,y; cin>>x>>y; cout<<3*x+2*y; return 0; } 10、判断是否存在重复的数 #include<iostream> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; if(a==b || a==c || b==c) cout<<"YES"; else cout<<"NO"; return 0; } 11、日期输出 #include<iostream> using namespace std; int main() { int m,d; cin>>m>>d; if(m<10) cout<<"0"; cout<<m<<"-"; if(d<10) cout<<"0"; cout<<d; return 0; } #include<iostream> using namespace std; int main() { int N,m,k,sum=0; cin>>N>>m; for(int i=1;i<=N;i++) { cin>>k; if(k==m)sum++; } cout<<sum; return 0; } 13、输出第二个整数 #include<iostream> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; cout<<b; return 0; } 14、浮点数向零舍入 #include<iostream> using namespace std; int main() { float a; cin>>a; cout<<int(a); return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 12 、与指定数字相同的数的个数 ) #include<iostream> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; cout<<(a+b)*c; return 0; } 16、苹果和虫子 #include <iostream> #include <cmath> using namespace std; int main() { float n,x,y,s; // 整型变量除以整型变量结果为整型 改为 float 类型 cin>>n>>x>>y; s=int(n-y/x); //int( ) 强制类型取整 等同 ceil( )向下取整函数 if (s<0) cout<<0; //考虑出现负数情况 else cout<<s; return 0; } 17、输出绝对值 #include<iostream> #include<cstdio> using namespace std; int main() { float n; cin>>n; if(n<0) n=0-n; printf("%.2f",n); return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 15 、计算 (a+b)*c 的值 ) 18、计算邮资 #include<iostream> #include<cmath> //ceil 函数需要用到此文件头 using namespace std; int main() { int x,m; char jj; cin>>x>>jj; if(x<=1000) m=8; else m=8+ceil((x-1000)*1.0/500)*4; //ceil 向上取整函数不足 500 按 500 算 if(jj=='y') m=m+5; cout<<m; } 19、求整数的和与均值 #include<iostream> #include<cstdio> using namespace std; int main() { int n,t,sum=0; cin>>n; for(int i=1;i<=n;i++) {cin>>t; sum=sum+t; } cout<<sum<<" "; printf("%.5f",sum*1.0/n); return 0; } 20、数 1 的个数 #include<iostream> #include<cstdio> using namespace std; ( 内部资料 请勿外传 翻印必究 ) int main() { int n,t,sum=0; cin>>n; for(int i=1; i<=n; i++) { t=i; //保留现场 尽量不改变循环变量的值 while(t!=0) { if(t%10==1) sum++; t=t/10; } } cout<<sum; return 0; } 21、三个数中最大数 #include<iostream> using namespace std; int main() { int a,b,c,max=0; cin>>a>>b>>c; max=a; //打擂法 if(b>max) max=b; if(c>max) max=c; cout<<max; return 0; } 22、ASCII 码 #include<iostream> using namespace std; int main() { char n; cin>>n; cout<<char(n-1)<<" "<<char(n+1);//char( ) 强制类型转换 return 0; //字符型与整型运算先取出字符型变量 ASCII 码与整型运算 } 23、判断平闰年 判断闰年的规则:四年一闰,百年不闰, 四百年一闰。 #include<iostream> using namespace std; int main() { int year; cin>>year; if(year%4==0&&year%100!=0||year%400==0) cout<<"YES"; else cout<<"NO"; return 0; } 24、求最大公约数 // 适合 m,n<10000,超范围会运行超时 #include <iostream> using namespace std; int main() { int m,n,k,i; cin>>m>>n; k=min(m,n); for(i=k; i>=1; i--) { //用最小数做循环次数 if(m%i==0&&n%i==0) { cout<<i; break; } } return 0; } 25、分糖果游戏 #include<iostream> #include<iomanip> using namespace std; int main() { int a=50,b=43,c=13; a=a/3; b=(a+b)/3; c=(a+b+c)/3; cout<<a<<" "<<b<<" "<<c; return 0; } 26、自行车和三轮车 #include<iostream> #include<iomanip> using namespace std; int main() { int a=65,b=150; int bike,sanlun; sanlun=b-a*2; bike=a-sanlun; cout<<bike<<" "<<sanlun; return 0; } 27、数据分段问题 #include <iostream> using namespace std; int main() { int lc; float fy; cin>>lc; if(lc<=3) fy=8; else fy=8+(lc-3)*1.6; cout<<fy; return 0; } ( 第 50 页 共 251 页 ) 学科网(北京)股份有限公司 28、字符菱形 #include <iostream> using namespace std; int main() { char a; cin>>a; cout<<" "<<a<<endl; cout<<" "<<a<<a<<a<<endl; cout<<a<<a<<a<<a<<a<<endl; cout<<" "<<a<<a<<a<<endl; cout<<" "<<a<<endl; return 0; } 29、对齐输出 #include<iostream> #include<cstdio> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; printf("%8d %8d %8d",a,b,c); return 0; } 30、等差数列末项计算 #include<iostream> using namespace std; int main() { int a1,a2,an,n; cin>>a1>>a2>>n; an=a1+(n-1)*(a2-a1);//等差数列通项公式 cout<<an; return 0; } 已知线段的两个端点的坐标 A(Xa,Ya),B(Xb,Yb),求线段 AB 的长度。 #include<iostream> #include<cstdio> #include<cmath> using namespace std; int main() { double xa,xb,ya,yb,len; cin>>xa>>ya; cin>>xb>>yb; len=sqrt(pow(2,xa-xb) +pow(2,ya-yb));//sqrt( )开平方函数 pow( )幂函数 printf("%0.3f",len); return 0; } 32、计算 2 的幂 给定非负整数 n,求 2^n。 #include<iostream> #include<cmath> using namespace std; int main() { int n; cin>>n; cout<<pow(2,n); return 0; } 33、奇偶数判断 给定一个整数,判断该数是奇数还是偶数。 #include <iostream> using namespace std; int main() { int n; cin>>n; if(n%2==1) cout<<"odd"; else cout<<"even"; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 31 、计算线段长度 ) y=-x+2.5; 0 <= x < 5 y=2-1.5(x-3)(x-3); 5 <= x < 10 y=x/2-1.5; 10 <= x < 20 #include <iostream> #include <cstdio> using namespace std; int main() { double x,y; cin>>x; if(x>=0&&x<5) y=-x+2.5; if(x>=5&&x<10) y=2-1.5*(x-3)*(x-3); if(x>=10&&x<20) y=x/2-1.5; printf("%.3f",y); return 0; } 35、银行利息 #include <iostream> #include <cmath> using namespace std; int main() { int R,Y; long long M; cin>>R>>M>>Y; M=M*pow(1+R*0.01,Y); cout<<M; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 34 、分段函数 ) #include<iostream> #include<cstdio> using namespace std; int main() { float a,sum=0; for( int i=1;i<=12;i++) { cin>>a; sum=sum+a; } printf("$%.2f",sum/12); return 0; } 37、计算多项式的值 #include<iostream> #include<cstdio> using namespace std; int main() { double a,b,c,d,x; cin>>x>>a>>b>>c>>d; printf("%.7f",a*x*x*x+b*x*x+c*x+d); return 0; } 38、温度表达转化 #include<iostream> #include<cstdio> using namespace std; int main() { double f; cin>>f; printf("%.5f",5*(f-32)/9); return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 36 、财务管理 ) #include<iostream> #include<cstdio> using namespace std; int main() { double pi=3.14159; float r; cin>>r; printf("%.4lf %.4lf %.4lf",2*r,2*pi*r,pi*r*r); return 0; } 40、大象喝水 #include<iostream> #include<cmath> using namespace std; int main() { double pi=3.14159; int h, r,n; cin>>h>>r; n=ceil( 20000/(pi*r*r*h) ); cout<<n; return 0; } 41、判断是否为两位数 #include<iostream> using namespace std; int main() { int a; cin>>a; if(a>=10&&a<=99) cout<<"1"; else cout<<"0"; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 39 、与圆相关的计算 ) 42、三角形判断 #include<iostream> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; if(a+b>c&&a+c>b&&b+c>a) //任意两条边之和都大于第三边 cout<<"yes"; else cout<<"no"; return 0; } 43、简单计算器 方法一:用 switch #include <iostream> using namespace std; int main() { int a,b; char ch; cin>>a>>b>>ch; switch (ch) { case '+': cout<<a+b; break; case '-': cout<<a-b; break; case '*': cout<<a*b; break; case '/': if(b==0) cout<<"Divided by zero!"; else cout<<a/b; break; default: ( 内部资料 请勿外传 翻印必究 ) cout<<"Invalid operator!"; } return 0; } 方法二:用 if 难点在于如何判断不是合法的运算符 #include <iostream> using namespace std; int main() { int a,b,count=0; char ch; cin>>a>>b>>ch; if(ch=='+') {cout<<a+b; count++;} if(ch=='-') {cout<<a-b; count++;} if(ch=='*') {cout<<a*b; count++;} if(ch=='/') {if(b==0) cout<<"Divided by zero!"; else cout<<a/b; count++; } if(count==0) //加减乘除一次也没运算过 即为非法运算符 cout<<"Invalid operator!"; return 0; } //错误提示部分一定用复制粘贴方法避免输入错误 44、最高的分数 #include<iostream> using namespace std; int main() { int m,n,max=0,i; cin>>n; for(i=1; i<=n; i++) { cin >>m; if(m>max) max=m; } cout<<max; return 0; } 45、人口增长问题 #include<iostream> #include<cstdio> using namespace std; int main() { double x,n; int i; cin>>x>>n; for(i=1; i<=n; i++) x=x*1.001; printf("%.4lf ",x); return 0; } 46、斐波那契数列 #include <iostream> using namespace std; int main() { long long f1=1,f2=1,f3; int i,k; cin>>k; for(i=3; i<=k; i++) { f3=f1+f2; f1=f2; f2=f3; } cout<<f3; return 0; } #include<iostream> using namespace std; int main() { double h,sum; int i; cin>>h; sum=h; for(i=1; i<=10; i++) { sum=sum+h;//累加反弹与落地的米数 h=h/2;//每次反弹回原高的一半 } cout<<sum-h<<endl<<h; return 0; } 48、角谷猜想 #include<iostream> using namespace std; int main() { long int n,a; cin>>n; while(n!=1) { if(n%2==1) { //奇数乘以 3 加 1 偶数除以 2 cout<<n<<"*3+1="<<n*3+1<<endl; n=n*3+1; } else { cout<<n<<"/2="<<n/2<<endl; n=n/2; } } cout<<"End"; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 47 、球弹跳高度的计算 ) #include<iostream> using namespace std; int main() { int n,m; int a,b,c,d,sum=0; int i; cin>>n; for(i=1; i<=n; i++) { cin>>m; a=m%10; b=m/10%10; c=m/100%10; d=m/1000%10; if(a-b-c-d>0) sum++; } cout<<sum; return 0; } 50、分离整数的各个数位 #include<iostream> using namespace std; int main() { long int n; cin>>n; while(n!=0) { cout<<n%10<<" "; n=n/10;//整除 10 相当于删除个位 } return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 49 、统计满足条件的 4 位数 ) ( 第 60 页 共 251 页 ) 学科网(北京)股份有限公司 #include<iostream> #include<cstring> using namespace std; int main() { int n,m; int a[5001]= { }; //初始化为 0 将灯全打开。 int i,j; int flag=1; cin>>n>>m; for(i=1; i<=m; i++) //m 个人依次进行操作 for(j=1; j<=n; j++) //对 n 盏灯进行操作 if(j%i==0)//只对人编号的倍数进行操作 a[j]=!a[j];//对灯进行相反处理 0 1 变化 for(i=1; i<=n; i++) { //输出灯是关闭的序号 if(a[i]==1) { if(flag) flag=0;//仅第一次不用先输出逗号 else cout<<","; cout<<i; } } return 0;} 52、地球人口承载力估计 #include<iostream> #include<cstdio> using namespace std; int main() { int x,y,a,b; double z; cin>>x>>a>>y>>b; z=(y*b-x*a)/(b-a); printf("%0.2f",z); return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 51 、开关灯 ) #include<iostream> using namespace std; int main() { double a,b; cin>>a>>b; printf("%0.9f",a/b); return 0; } 54、晶晶赴约会 #include <iostream> using namespace std; int main() { int n; cin>>n; if((n==1)||(n==3)||(n==5)) cout<<"NO"<<endl; else cout<<"YES"<<endl; return 0; } 55、求平均年龄 #include<iostream> #include<cstdio> using namespace std; int main() { int i,n,age; double sum=0; cin>>n; for(i=1; i<=n; i++) { cin>>age; sum=sum+age; } printf("%0.2f",sum/n); return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 53 、计算分数的浮点数值 ) #include<iostream> using namespace std; int main() { int n,i; float max=0,temp; cin>>n; for(i=1; i<=n; i++) { cin>>temp; if(temp>max) max=temp; } cout<<max; return 0; } 57、奥运奖牌计数 #include<iostream> using namespace std; int main() { int n,i,j,y,t; int sum,sumj=0,sumy=0,sumt=0;//初始化 cin>>n; for(i=1; i<=n; i++) { cin>>j>>y>>t;//每天的奖牌数 sumj=sumj+j;//金牌数 sumy=sumy+y;//银牌数 sumt=sumt+t;//铜牌数 } sum=sumj+sumy+sumt; cout<<sumj<<" "<<sumy<<" "<<sumt<<" "<<sum; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 56 、最高的分数 ) #include<iostream> using namespace std; int main() { int m,n,i,sum=0; cin>>m>>n; if(m%2==0) m++; for(i=m; i<=n; i=i+2) { sum=sum+i; } cout<<sum; return 0; } 59、整数的个数 #include<iostream> using namespace std; int main() { int i,n,temp; int sum1=0,sum5=0,sum10=0; cin>>n; for(i=1; i<=n; i++) { cin>>temp; if(number==1) sum1++; if(number==5) sum5++; if(number==10) sum10++; } cout<<sum1<<endl<<sum5<<endl<<sum10; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 58 、奇数求和 ) 60、救援 #include<iostream> #include<cmath> using namespace std; int main() { double n,p,x,y; double len,time=0; int i; cin>>n; for(i=1; i<=n; i++) { cin>>x>>y; cin>>p; len=sqrt(x*x+y*y);//求(x,y)坐标点与原点(0,0)之间距离的公式 time=time+2*len/50+p*1.5; // 船往返距离除以速度+每人上船 1 下船 0.5 分 } cout<<ceil(time);//输出要求精确到分钟(向上取整) return 0; } 61、津津的储蓄计划 #include <iostream> using namespace std; int main() { int i,p,m,r=0; float sum=0; bool flag=1; for(i=1; i<=12; i++) { r=300+r; cin>>p; m=(r-p)/100; r=r-p-m*100; sum=sum+m*100; if(r<0) { cout<<"-"<<i; flag=0; break; } } ( 内部资料 请勿外传 翻印必究 ) if(flag==1) { sum=sum*1.2+r; cout<<sum; } return 0; } 62、正常血压 #include<iostream> using namespace std; int main() { int i,n; int ssy,szy,max=0,sum=0;//ssy 收缩压 szy 舒张压 cin>>n; for(i=1; i<=n; i++) { cin>>ssy>>szy; if(ssy>=90&&ssy<=140&&szy>=60&&szy<=90) { sum++; if(sum>max) max=sum; } else sum=0; } cout<<max; return 0; } 63、计算星期几 #include<iostream> #include<string> using namespace std; int main() { int i,a,b,n=1; string week[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Wedne sday"}; cin>>a>>b; for(i=1; i<=b; i++) n=n*a%7; //循环计算 n 天后是周几 cout<<week[n]; return 0; } 64、数字反转 #include<iostream> using namespace std; int main() { int n,sum=0; cin>>n; if(n<0) { cout<<"-"; n=0-n; } while(n!=0) { sum=sum*10+n%10; n=n/10; } cout<<sum; return 0; } 65、求阶乘的和 #include<iostream> using namespace std; int main() { int n,i; long long sum=0,temp=1; cin>>n; for(i=1; i<=n; i++) { temp=temp*i;//计算阶乘 sum=sum+temp;//累加 } cout<<sum; return 0; } #include<iostream> #include<cmath> using namespace std; int main() { int n,i,j; cin>>n; for(i=2; i<=sqrt(n); i++) { //两个不同质数,其中必有一个≤sqrt(n) if(n%i==0) { cout<<n/i;//较大质数=n/较小质数,输出 break; } } return 0; } 67、计算并联电阻 #include<iostream> #include<cstdio> using namespace std; int main() { double r1,r2,R; cin>>r1>>r2; R=1.0/((1/r1)+(1/r2));//根据公式列算式注意用括号改变优先级 printf("%0.2f",R); return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 66 、质因数分解 ) #include<iostream> #include<cstdio> using namespace std; int main() { double r,v; cin>>r; v=(4*3.14*r*r*r)/3.0; printf("%0.2f",v); return 0; } 69、行李收费 #include<iostream> #include<cstdio> using namespace std; int main() { double n,sum=0; cin>>n; if(n<=20) sum=n*1.68; else sum=n*1.98; printf("%0.2f",sum); return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 68 、计算球的体积 ) 解题思路:都买 4 元的笔肯定可以买最多支笔。因此最多可买的笔为 x / 4 支。 由于小 q 要把钱用完,故我们可以按以下方法将钱用完: 若买完 x / 4 支 4 元钱的笔,还剩 1 元,则 4 元笔少买 1 支,换成一支 5 元笔; 若买完 x / 4 支 4 元钱的笔,还剩 2 元,则 4 元笔少买 1 支,换成一支 6 元笔; 若买完 x / 4 支 4 元钱的笔,还剩 3 元,则 4 元笔少买 2 支,换成一支 5 元和一支 6 元 #include<iostream> using namespace std; int main(){ int a,b,c,x,y; //a,b,c 分别对应 6 元、5 元和 4 元钱笔的数目 cin>>x; //输入 x c=x/4; //4 元笔最多买的数目 y=x%4; //求买完 c 支 4 元笔后剩余的钱数 y switch (y) //判断购买方案 { case 0: a=0; b=0; break; case 1: a=0; b=1; c--; break; case 2: a=1; b=0; c--; break; case 3: a=1; b=1; c=c-2; break; } cout<<a<<' '<<b<<' '<<c; return 0; } 方法二、参考解题思路找买 5 元笔和 6 元笔的规律 #include<iostream> using namespace std; int main() { int a,b,c,x; cin>>x; a=x%4>1; b=x%2; c=x/4-a-b; cout<<a<<" "<<b<<" "<<c; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 70 、买笔方案 ) ( 第 70 页 共 251 页 ) 学科网(北京)股份有限公司 #include<iostream> using namespace std; int main() { int a,b,c,d; cin>>a>>b>>c>>d; cout<<c<<d; return 0; } 72、新冠疫情死亡率(2020 年真题) #include<iostream> #include<cstdio> using namespace std; int main() { float a,b,c; cin>>a>>b; c=b/a;//死亡率=死亡数/确诊数 printf("%0.3f",c*100);//百分比形式输出结果乘以 100 前加% cout<<"%"; return 0; } 73、有一门课不及格的学生(2020 年真题) #include<iostream> using namespace std; int main() { int a,b; cin>>a>>b; if((a<60 && b>=60)||(a>=60 && b<60))//只能有一门成绩不合格 cout<<"1"; else cout<<"0"; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 71 、输出整数( 2020 年真题) ) #include <iostream> using namespace std; int main() { int k, n, ans, s,i; cin>>n; //输入天数 k=1; //所给金币数 for(i=1; i<=n; i++) { ans+=k; //计算国王给的总的金币 s++; //计算给相同金币的重复天数 if (k==s) { //如果所给金币个数等于重复的天数 k++; //将每天给的金币的个数增加 1 s=0; //将重复天数重新归零 } } cout<<ans; return 0; } 75、求满足条件的 3 位数(2020 年真题) #include <iostream> using namespace std; int main(){ int n,num=0; cin>>n; for (int i = 10; i < 40; i++) { int temp=i*i; int a=temp/100,b=temp/10%10,c=temp%10; if(a==b||b==c||c==a){ num++; } if(num==n){ cout<<temp; return 0; } } } ( 内部资料 请勿外传 翻印必究 ) ( 74 、骑士的金币( 2020 年真题) ) 76、数的输入和输出(2021 年 6 月真题) #include<iostream> #include<cstdio> using namespace std; int main() { long long N; double F; cin>>N>>F; printf("%0.2f",F); cout<<" "<<N; return 0; } 77、大写字母的判断(2021 年 6 月真题) 方法一、 #include<iostream> using namespace std; int main() { char a; cin>>a; if(a>=65&& a<=90) //字母 A ASCII 码为 65 后面还有 25 个字母推出 Z 为 90 cout<<"YES"; else cout<<"NO"; return 0; } 方法二、 #include<iostream> #include<cstdio> using namespace std; int main() { char a; cin>>a; ( 内部资料 请勿外传 翻印必究 ) if(a>='A' && a<='Z') //此处为单引号 cout<<"YES"; else cout<<"NO"; return 0; } 78、特殊求和(2021 年 6 月真题) #include<iostream> using namespace std; int main() {int i,n,t,count=0; long long sum=0; cin>>n; for(i=7;i<=n;i++) //N>1 第一个满足条件的是 7 { t=i; //保留现场,不能直接对循环变量进行处理 while(t!=0) { if(t%10==7) count++; t=t/10; } if(i%7==0 || count>0) sum=sum+i; count=0; //计数清零 } cout<<sum; return 0; } 79、硬币翻转 (开关门 开关灯)(2021 年 6 月真题) #include<iostream> using namespace std; int main() { int n,m,i,j; cin>>n>>m; int a[n+1]={0};//初始化数组元素全部为 0 for(i=1; i<=m; i++) //遍历人的编号 for(j=1; j<=n; j++) //遍历硬币的编号 if(j%i==0) //硬币编号是人编号的倍数关系 a[j]=!a[j]; for(i=1; i<=n; i++) { if(a[i]==0) cout<<i<<" "; } return 0; } 80、百钱百鸡问题 (搬砖问题) 解题思路:翻译后,公鸡一只 5 块钱,母鸡一只 3 块钱,3 只小鸡值一块钱,现在要用 一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只? 如果用数学的方法解决百钱买百鸡问题,可将该问题抽象成方程式组。 设公鸡 x 只,母鸡 y 只,小鸡 z 只,得到以下方程式组: 1:5x+3y+1/3z = 100 2:x+y+z = 100 #include<iostream> using namespace std; int main() { int x,y,z; for(x=0; x<=20; x++) for(y=0; y<=33; y++) { z=100-x-y; if((5*x+3*y+z/3==100)&&(z%3==0)) cout<<x<<" "<<y<<" "<<z<<endl; } return 0; } C 语言二级考纲说明 能力目标 通过本级考核的学生, 掌握数组和字符串的操作, 会编写函数和调用函数。 能够编写指定功能的正确完整的程序。 考试标准 1、理解数制的基本概念; 2、能够进行二进制、十进制以及十六进制之间的转换; 3、掌握一维数组、二维数组及多维数组的用法; 4、理解编码的概念; 5、掌握字符串的用法; 6、掌握在数组中进行顺序查找的方法; 7、掌握对数组中数据进行简单排序的方法; 8、对于排序了的数组,能否利用二分查找的方法找到满足条件的数据; 9、理解函数及过程抽象的概念; 10、理解函数的参数和返回值的概念; 11、能够自己创建一个带参数的函数; 12、能够自己创建一个有返回值的函数。 能够使用上述方法编写指定功能的正确完整的程序。 1、数制 理解数制的概念, 知道什么是二进制、 八进制、 十进制和十六进制能够进行 二进制、十进制和十六进制之间的转换 2、数组 知道什么是一维数组、二维数组和多维数组掌握一维数组、二维数组和多维数 组的用法,知道如何初始化数组、访问数组元素掌握在数组中进行顺序查找的方 法掌握对数组数据简单的排序方法,比如冒泡排序、选择排序对于已经排序的数 组,掌握二分查找法找到满足条件的数据 3、字符串 理解 C 语言中字符串的概念掌握字符串的操作: 复制字符串、 连接字符串、 比较字符串、返回字符第一次出现的位置、返回字符子串第一次出现的位置 4、编码 理解编码的概念 5、函数 理解函数和过程的概念理解函数的参数和返回值能够定义带参数的函数和有 返回值的函数 C 语言二级题库 61 题及参考答案 数组部分 1、与指定数字相同的数的个数(2021 真题) 输出一个整数序列中与指定数字相同的数的个数。 输入:输入包含三行: 第一行为 N,表示整数序列的长度(N ≤ 100); 第二行为 N 个整数,整数之间以一个空格分开; 第三行包含一个整数,为指定的数字 m。 输出 输出为 N 个数中与 m 相同的数的个数。 输入样例 3 2 3 2 2 输出样例 2 ##include<iostream> using namespace std; int main() { int i,n,m,count=0; cin>>n;//共有 n 个数 int a[n+1];//动态生成数组从 下标为 1 位置存储 for(i=1; i<=n; i++) cin>>a[i];//读入 n 个数 cin>>m;//读取第三行指定数 m for(i=1; i<=n; i++) //对数据逐个进行比较 if(a[i]==m) count++;//若与指定数字相同,计数器+1 cout<<count; return 0; } 2、陶陶摘苹果 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10 个苹果。苹果成熟的时 候,陶陶就会跑去摘苹果。陶陶有个 30 厘米高的板凳,当她不能直接用手摘到苹果的 时候,就会踩到板凳上再试试。 现在已知 10 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度, 请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。 输入 包括两行数据。第一行包含 10 个 100 到 200 之间(包括 100 和 200)的整数(以厘米 为单位)分别表示 10 个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二 行只包括一个 100 到 120 之间(包含 100 和 120)的整数(以厘米为单位),表示陶陶把手 伸直的时候能够达到的最大高度。 输出 包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。 输入样例 100 200 150 140 129 134 167 198 200 111 110 输出样例 5 #include<iostream> using namespace std; int main() { int a[10],h,count=0; int i; for(i=0; i<10; i++) cin>>a[i]; //输入苹果高度 cin>>h;//输入伸直手的高度 h=h+30;//踩上板凳后的高度 for(i=0; i<10; i++) //对每个苹果进行比较 if(a[i]<=h)//如果苹果高度<能够到的高度 count++;//计数器+1 cout<<count; return 0; } 下面是一个图书的单价表: 计算概论 28.9 元/本 数据结构与算法 32.7 元/本 数字逻辑 45.6 元/本 C++程序设计教程 78 元/本 人工智能 35 元/本 计算机体系结构 86.2 元/本 编译原理 27.8 元/本 操作系统 43 元/本 计算机网络 56 元/本 JAVA 程序设计 65 元/本 给定每种图书购买的数量,编程计算应付的总费用。 输入:输入一行,包含 10 个整数(大于等于 0,小于等于 100),分别表示购买的《计 算概论》、《数据结构与算法》、《数字逻辑》、《C++程序设计教程》、《人工智能》、 《计算机体系结构》、《编译原理》、《操作系统》、《计算机网络》、《JAVA 程序设 计》的数量(以本为单位)。每两个整数用一个空格分开。 输出:输出一行,包含一个浮点数 f,表示应付的总费用。精确到小数点后一位。 输入样例 1 5 8 10 5 1 1 2 3 4 输出样例 2410.2 #include<iostream> #include<cstdio> using namespace std; int main() { double price[10]= {28.9,32.7,45.6,78,35,86.2,27.8,43,56,65}; int num[10]; double sum=0; int i; for(i=0; i<10; i++) { cin>>num[i]; sum+=num[i]*price[i];//累加每种书的价格 } printf("%.1f",sum);//保留 1 位小数输出 return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 3 、计算书费 ) 4、数组逆序重存放 将一个数组中的值按逆序重新存放。例如,原来的顺序为 8,6,5,4,1。要求改为 1,4,5,6,8。 输入 输入为两行:第一行数组中元素的个数 n(1<n<100),第二行是 n 个整数,每两个 整数之间用空格分隔。 输出 输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。 输入样例 5 8 6 5 4 1 输出样例 1 4 5 6 8 #include<iostream> using namespace std; int main() { int n,i; cin>>n; int num[n+1]; for(i=1; i<=n; i++) cin>>num[i]; for(i=n; i>=1; i--) //倒序输出 cout<<num[i]<<" "; return 0; } 5、校门外的树 某校大门外长度为 L 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我 们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 L 的位置;数轴上 的每个整数点,即 0,1,2,……,L,都种有一棵树。 由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点 表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。 现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树 都移走后,马路上还有多少棵树。 输入 第一行有两个整数 L(1 ≤ L ≤ 10000)和 M(1 ≤ M ≤ 100),L 代表马路的 长度,M 代表区域的数目,L 和 M 之间用一个空格隔开。接下来的 M 行每行包含两个不 ( 内部资料 请勿外传 翻印必究 ) ( 第 80 页 共 251 页 ) 学科网(北京)股份有限公司 同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。 对于 20%的数据,区域之间没有重合的部分;对于其它的数据,区域之间有重合的 情况。 输出 包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。 输入样例 500 3 150 300 100 200 470 471 输出样例 298 #include<iostream> using namespace std; int main() { int L,M,i,j; int s[10001]= {0}; int a,b,sum=0,ex,new; cin>>L>>M;//输入马路长度与区域数目 for (i=0; i<M; i++) { cin>>a>>b;//输入起始点与终止点 for(j=a; j<=b; j++) //令范围内的树移走 s[j]=1; } for(i=0; i<=L; i++) //统计马路长度内被移走的树的数目 if(s[i]==1) sum++; ex=L+1; new=ex-sum;//移走后的树的数目 cout<<new; return 0; } 6、开关灯 假设有 N 盏灯(N 为不大于 5000 的正整数),从 1 到 N 按顺序依次编号,初始时全部 处于开启状态;有 M 个人(M 为不大于 N 的正整数)也从 1 到 M 依次编号。 第一个人(1 号)将灯全部关闭,第二个人(2 号)将编号为 2 的倍数的灯打开,第三 个人(3 号)将编号为 3 的倍数的灯做相反处理(即将打开的灯关闭,将关闭的灯打开)。 依照编号递增顺序,以后的人都和 3 号一样,将凡是自己编号倍数的灯做相反处理。 请问:当第 M 个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用 逗号间隔。 输入:输入正整数 N 和 M,以单个空格隔开。 输出:顺次输出关闭的灯的编号,其间用逗号间隔。 输入样例 10 10 输出样例 1,4,9 #include<iostream> #include<cstring> using namespace std; int main() { int n,m,i,j; int flag=1; cin>>n>>m; bool a[n+1]; memset(a,0,sizeof(a));//初始化为 0 将灯关上 固定格式 for(i=1; i<=m; i++) //m 个人依次进行操作 for(j=1; j<=n; j++) //对 n 盏灯进行操作 if(j%i==0)//只对人编号的倍数进行操作 a[j]=!a[j];//对灯进行相反处理 for(i=1; i<=n; i++) { //输出灯是关闭的序号 if(a[i]) { if(flag) flag=0;//仅第一次不用先输出逗号 else cout<<","; cout<<i; } } return 0; } 在一个序列(下标从 1 开始)中查找一个给定的值,输出第一次出现的位置。 输入 第一行包含一个正整数 n,表示序列中元素个数。1 ≤n≤ 10000。 第二行包含 n 个整数,依次给出序列的每个元素,相邻两个整数之间用单个空格隔 开。元素的绝对值不超过 10000。 第三行包含一个整数 x,为需要查找的特定值。x 的绝对值不超过 10000。 输出 若序列中存在 x,输出 x 第一次出现的下标;否则输出-1。 输入样例 5 2 3 6 7 3 3 输出样例 2 #include<iostream> #include<cstring> using namespace std; int main() { int n,i,x,flag=0; cin>>n; int a[n+1]; for(i=1; i<=n; i++) cin>>a[i]; cin>>x;//输入查找特定值 for(i=1; i<=n; i++) { //对每个数依次比较 if(a[i]==x) { //若查找到了 flag=1;//记录标志,说明数列中存在 x cout<<i<<endl;//输出下标位置 break;//终止循环 } } if(flag==0)//如果记录标志为 0,说明数列中不存在 x cout<<-1;//输出-1 return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 7 、查找特定的值 ) 8、最大值和最小值的差(2021 真题) 输出一个整数序列中最大的数和最小的数的差。 输入 第一行为 M,表示整数个数,整数个数不会大于 10000; 第二行为 M 个整数,以空格隔开,每个整数的绝对值不会大于 10000。 输出 输出 M 个数中最大值和最小值的差。 输入样例 5 2 5 7 4 2 输出样例 5 #include<iostream> using namespace std; int main() { int m,max,min,temp; cin>>m; cin>>temp; max=min=temp; for(int i=2; i<=m; i++) { cin>>temp; if(temp>max) max=temp; if(temp<min) min=temp; } cout<<max-min; return 0; } 9、不与最大数相同的数字之和 输出一个整数数列中不与最大数相同的数字之和。 输入 输入分为两行: 第一行为 N(N 为接下来数的个数,N ≤ 100); 第二行 N 个整数,数与数之间以一个空格分开,每个整数的范围是-1000,000 到 1000,000。 输出 输出为 N 个数中除去最大数其余数字之和。 ( 内部资料 请勿外传 翻印必究 ) 输入样例 3 1 2 3 输出样例 3 #include <iostream> using namespace std; int main() { int n,i,max,sum=0; cin>>n; int a[n+1]; cin>>a[1]; max=a[1];//读入第一个数作为最大值 打擂法 for(i=2; i<=n; i++) { cin>>a[i];//输入 n 个整数 if(a[i]>max) max=a[i];//记录最大值 } for(i=1; i<=n; i++) //计算除去与最大值相同的数的和 if(a[i]!=max) sum+=a[i]; cout<<sum; return 0; } 10、白细胞计数(高难度 仅供挑战) 医院采样了某临床病例治疗期间的白细胞数量样本 n 份,用于分析某种新抗生素对 该病例的治疗效果。为了降低分析误差,要先从这 n 份样本中去除一个数值最大的样本 和一个数值最小的样本,然后将剩余 n-2 个有效样本的平均值作为分析指标。同时,为 了观察该抗生素的疗效是否稳定,还要给出该平均值的误差,即所有有效样本(即不包 括已扣除的两个样本)与该平均值之差的绝对值的最大值。 现在请你编写程序,根据提供的 n 个样本值,计算出该病例的平均白细胞数量和对 应的误差。 输入:输入的第一行是一个正整数 n(2 <n≤ 300),表明共有 n 个样本。 以下共有 n 行,每行为一个浮点数,为对应的白细胞数量,其单位为 10^9/L。数与 数之间以一个空格分开。 输出:输出为两个浮点数,中间以一个空格分开。分别为平均白细胞数量和对应的 误差,单位也是 10^9/L。计算结果需保留到小数点后 2 位。 输入样例 5 12.0 13.0 11.0 9.0 10.0 输出样例:11.00 1.00 #include <iostream> #include<cstdio> #include<cmath> int main() { float item,ave,sum; int i,n,k; cin>>n; float a[n],b[n], for(i=0;i<n;i++) //输入数据并且排好顺序 { cin>>a[i]; for(k=0;k<i;k++) if(a[i]<a[k]) swap(a[i],a[k]); } for(i=1;i<n-1;i++) //对有效数据进行求平均值 sum=sum+a[i]; ave=sum/(n-2); printf("%.2f ",ave); for (i=0;i<n-2;i++) //在 b[n]中存差值 b[i]=fabs(a[i+1]-ave); float max; max=0; for(i=0;i<(n-2);i++) //对差值排序 if(b[i]>max) max=b[i]; printf("%.2f",max); return 0; } 11、整数去重 给定含有 n 个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个 序列中每个重复出现的数,只保留该数第一次出现的位置,删除其余位置。 输入 输入包含两行: 第一行包含一个正整数 n(1 ≤ n ≤ 20000),表示第二行序列中数字的个数; 第二行包含 n 个整数,整数之间以一个空格分开。每个整数大于等于 10、小于等于 5000。 输出 输出只有一行,按照输入的顺序输出其中不重复的数字,整数之间用一个空格分开。 输入样例 5 10 12 93 12 75 输出样例 10 12 93 75 #include<iostream> using namespace std; int main() { int n; int i,j; cin>>n; int a[n+1]; bool b[n+1]; for(i=1; i<=n; i++) { cin>>a[i]; b[i]=true;//初始化为没有重复 } for(i=1; i<=n; i++) if(b[i])//判断 a[i]是否被标记为重复 for(j=i+1; j<=n; j++) //寻找 a[i]后是否有重复的数 if(a[i]==a[j]) b[j]=false;//标记为不能输出 for(i=1; i<=n; i++) //输出没有重复的数 if(b[i]==true) cout<<a[i]<<" "; return 0; } 12、铺地毯 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角 坐标系的第一象限)铺上一些矩形地毯。一共有 n 张地毯,编号从 1 到 n。现在将这些 地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好 的地毯之上。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编 号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。 样例解释:如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表 示,覆盖点(2,2)的最上面一张地毯是 3 号地毯。 输入 第一行,一个整数 n,表示总共有 n 张地毯。 接下来的 n 行中,第 i+1 行表示编号 i 的地毯的信息,包含四个正整数 a,b,g,k, 每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯 在 x 轴和 y 轴方向的长度。 第 n+2 行包含两个正整数 x 和 y,表示所求的地面的点的坐标(x,y)。 输出 输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。 输入样例 3 1 0 2 3 0 2 3 3 2 1 3 3 2 2 输出样例 3 ( 内部资料 请勿外传 翻印必究 ) #include<iostream> using namespace std; int main() { int i,n,x,y; cin>>n; int a[n+1],b[n+1],g[n+1],k[n+1]; for(i=1; i<=n; i++) { cin>>a[i]>>b[i];//输入地毯左下角坐标(a,b) cin>>g[i]>>k[i];//输入地毯在 x 轴、y 轴的长度 } cin>>x>>y;//输入所求的地面的点的坐标(x,y) for(i=n; i>=1; i--) { //找覆盖在最上的地毯,所以上到下找 if((x>=a[i]&&x<=a[i]+g[i]) && (y>=b[i]&&y<=b[i]+k[i])) { cout<<i;//判断是否在范围内 return 0; } } cout<<-1;//没有覆盖,输出-1 return 0; } 13、矩阵交换行 给定一个 5×5 的矩阵(数学上,一个 r×c 的矩阵是一个由 r 行 c 列元素排列成的 矩形阵列),将第 n 行和第 m 行交换,输出交换后的结果。 输入 输入共 6 行,前 5 行为矩阵的每一行元素,元素与元素之间以一个空格分开。 第 6 行包含两个整数 m、n,以一个空格分开(1 ≤ m,n ≤ 5)。 输出 输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。 输入样例 1 2 2 1 2 5 6 7 8 3 9 3 0 5 3 7 2 1 4 6 3 0 8 2 4 1 5 输出样例 3 0 8 2 4 5 6 7 8 3 9 3 0 5 3 7 2 1 4 6 1 2 2 1 2 #include<iostream> #include<algorithm> using namespace std; int main() { int n,m,i,j; int a[6][6]; for(i=1; i<=5; i++) for(j=1; j<=5; j++) cin>>a[i][j]; cin>>n>>m; for(i=1; i<=5; i++) swap(a[m][i],a[n][i]); for(i=1; i<=5; i++) { for(j=1; j<=5; j++) cout<<a[i][j]<<" "; cout<<endl; } return 0; } 14、计算矩阵边缘元素之和 输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第 一行和最后一行的元素以及第一列和最后一列的元素。 输入 第一行分别为矩阵的行数 m 和列数 n(m<100,n<100),两者之间以一个空格分开。 接下来输入的 m 行数据中,每行包含 n 个整数,整数之间以一个空格分开。 输出 输出对应矩阵的边缘元素和。 输入样例 3 3 3 4 1 3 7 1 2 0 1 输出样例 15 ( 第 90 页 共 251 页 ) 学科网(北京)股份有限公司 #include<iostream> using namespace std; int main() { int i,j,n,m,sum=0;; cin>>n>>m; int a[n+1][m+1]; for(i=1; i<=n; i++) { for(j=1; j<=m; j++) { cin>>a[i][j];//读入元素 if(i==1||i==n||j==1||j==m)//判断是不是边缘 sum=sum+a[i][j];//如果时,累加 } } cout<<sum; return 0; } 15、计算鞍点 给定一个 5*5 的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵 的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。 例如:在下面的例子中(第 4 行第 1 列的元素就是鞍点,值为 8 )。 11 3 5 6 9 12 4 7 8 10 10 5 6 9 11 8 6 4 7 2 15 10 11 20 25 输入 输入包含一个 5 行 5 列的矩阵。 输出 如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出"not found"。 输入样例 11 3 5 6 9 12 4 7 8 10 10 5 6 9 11 8 6 4 7 2 15 10 11 20 25 输出样例 4 1 8 #include<iostream> #include<cstring> using namespace std; int main() { int a[6][6]; int max[6]={}; //初始化数组为 0,存放行最大 int min[6]={}; //初始化数组为 0,存放列最小 memset(min,1000000,sizeof(min)); int t=5; //计算是否没找到鞍点 for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) cin>>a[i][j]; //输入数组 for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) if(a[i][j]>max[i]) //如果是行最大 max[i]=a[i][j]; //赋值 for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) if(a[j][i]<min[i]) //如果是列最小 min[i]=a[j][i]; //赋值 for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) if(a[i][j]==max[i] && a[i][j]==min[j]) //如果同时行最大和列最小 { } if(t==5) cout<<i<<" "<<j<<" "<<a[i][j]; //输出坐标和值 t--; //计数器减 1 cout<<"not found"; return 0; } 16、矩阵转置 输入一个 n 行 m 列的矩阵 A,输出它的转置 A^T。 输入 第一行包含两个整数 n 和 m,表示矩阵 A 的行数和列数(1≤n≤100,1≤m≤100)。 接下来 n 行,每行 m 个整数,表示矩阵 A 的元素。相邻两个整数之间用单个空格隔 开,每个元素均在 1~1000 之间。 输出 m 行,每行 n 个整数,为矩阵 A 的转置。相邻两个整数之间用单个空格隔开。 输入样例 3 3 1 2 3 4 5 6 7 8 9 输出样例 1 4 7 2 5 8 3 6 9 #include <iostream> using namespace std; int main() { int m,n,i,j; cin>>m>>n; int a[n+1][n+1]; for(i=1; i<=m; i++) //输入矩阵 for(j=1; j<=n; j++) cin>>a[i][j]; for(i=1; i<=n; i++) { //输出转置后的矩阵 for(j=1; j<=m; j++) cout<<a[j][i]<<" "; cout<<endl; } return 0; } 输入一行字符,统计出其中数字字符的个数。 输入 一行字符串,总长度不超过 255。 输出 输出为 1 行,输出字符串里面数字字符的个数。 输入样例 Peking University is set up at 1898. 输出样例:4 第一种写法: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char ch[256]; int len,sum=0,i; gets(ch); len=strlen(ch); for(i=0; i<=len; i++) //对字符串进行遍历 if(ch[i]>='0'&&ch[i]<='9')//如果是数字 sum++; cout<<sum; return 0; } 第二种写法: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { string s; getline(cin, s); int len,cnt = 0; len=s.size(); for (int i = 0; i < len; i++) { if (s[i] >= '0' && s[i] <= '9') { cnt++; } } cout << cnt; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 17 、统计数字字符个数 ) 给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有, 输出 no。 输入:一个字符串,长度小于 100000。 输出:输出第一个仅出现一次的字符,若没有则输出 no。 输入样例:abcabd 输出样例:c /*getline(cin,s) //接受一个字符串,可以接受空格并输出。 必须包含头文件#include<cstring>; s 必须为字符串类型,即 string s; */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { string s; int a[26]= {0}; int i,len,sum=0; getline(cin, s);//接受一个字符串,可以接受空格并输出。 len=s.size();//计算 string 中的元素个数用 size() for(i=0; i<len; i++) //桶排的思想统计 26 个小写字母出现频次 a[s[i]-'a']++; for(i=0; i<len; i++) { //对字符串进行遍历 if(a[s[i]-'a']==1) { //如果出现过一次 cout<<s[i]<<endl; return 0; } } cout<<"no"<<endl; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 18 、找第一个只出现一次的字符( 2021 真题) ) 石头剪子布,是一种猜拳游戏。起源于中国。游戏规则:石头打剪刀,布包石头, 剪刀剪布。 现在,需要你写一个程序来判断石头剪子布游戏的结果。 输入:第一行是一个整数 N,表示一共进行了 N 次游戏。1 ≤ N ≤ 100。 接下来 N 行的每一行包括两个字符串,表示游戏参与者 Player1,Player2 的选择 (石头、剪子或者是布): S1 S2 字符串之间以空格隔开 S1,S2 只可能取值在{"Rock", "Scissors", "Paper"}(大小 写敏感)中。 输出:输出包括 N 行,每一行对应一个胜利者(Player1 或者 Player2),或者游 戏出现平局,则输出 Tie。 输入样例 3 Rock Scissors Paper Paper Rock Paper 输出样例 Player1 Tie Player2 #include<iostream> using namespace std; int main() { int n,i; cin>>n; char a[n+1],b[n+1]; for(i=0; i<n; i++) { cin>>a>>b; if(a[0]=='R'&&b[0]=='S'||a[0]=='S'&&b[0]=='P'||a[0]=='P'&&b[0]=='R') //判断第一个字母即可 cout<<"Player1"<<endl; else if(a[0]==b[0]) cout<<"Tie"<<endl; else cout<<"Player2"<<endl; } return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 19 、石头剪子布 ) 给定一个不包含空白符的字符串,请判断是否是 C 语言合法的标识符号(注:题目 保证这些字符串一定不是 C 语言的保留字)。 C 语言标识符要求: 1.非保留字; 2.只包含字母、数字及下划线(“_”)。 3.不以数字开头。 输入 一行,包含一个字符串,字符串中不包含任何空白字符,且长度不大于 20。 输出 一行,如果它是 C 语言的合法标识符,则输出 yes,否则输出 no。 输入样例 RKPEGX9R;TWyYcp 输出样例 No include<iostream> #include<cstring> using namespace std; int main() { char a[21]; int len,i; gets(a); len=strlen(a); if(a[0]>='0'&&a[0]<='9') { cout<<"no"; return 0; } for(i=0; i<len; i++) { //若不包含在字母、数字、下划线范围内 if(!((a[i]>='0'&&a[i]<='9')||(a[i]>='A'&&a[i]<='Z')||(a[i]>='a'&&a[i]<=' z')||a[i]=='_')) { cout<<"no"; return 0; } } cout<<"yes"; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 20 、合法 C 标识符 ) 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简 单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们 给出一种最简的的加密方法,对给定的一个字符串,把其中从 a-y,A-Y 的字母用其后 继字母替代,把 z 和 Z 用 a 和 A 替代,其他非字母字符不变,则可得到一个简单的加密 字符串。 输入:输入一行,包含一个字符串,长度小于 80 个字符。 输出:输出每行字符串的加密字符串。 输入样例:Hello! How are you! 输出样例:Ifmmp! Ipx bsf zpv! #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char a[81]; int len,i; gets(a); len=strlen(a); for(i=0; i<len; i++) { if(a[i]=='Z'||a[i]=='z') a[i]=a[i]-25; else if(a[i]>='A'&&a[i]<='Y' || a[i]>='a'&&a[i]<='y') a[i]=a[i]+1; } for(int i=0; i<len; i++) cout<<a[i]; return 0; } } ( 内部资料 请勿外传 翻印必究 ) ( 21 、密码翻译 ) 小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会。 在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概 论中取得过好成绩后,主任又额外交给她一项任务,解密抗战时期被加密过的一些伤员 的名单。经过研究,小英发现了如下加密规律(括号中是一个“原文 -> 密文”的例子) 1.原文中所有的字符都在字母表中被循环左移了三个位置(dec -> abz) 2.逆序存储(abcd -> dcba ) 3.大小写反转(abXY -> ABxy) 输入: 一个加密的字符串。(长度小于 50 且只包含大小写字母) 输出: 输出解密后的字符串。 输入样例: GSOOWFASOq 输出样例: Trvdizrrvj #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char a[51],temp; int len,i; gets(a); len=strlen(a); for(i=0; i<len; i++) { if(a[i]>='a'&&a[i]<='z') { temp=a[i]; temp=temp+3;//向右移动 3 个字符 if(temp>122) temp=temp-26;//若为 x,y,z,转换为 a,b,c a[i]=temp-32;//小写转换为大写 } else if(a[i]>='A'&&a[i]<='Z') { temp=a[i]; temp=temp+3;//向右移动 3 个字符 if(temp>90) temp=temp-26;//若为 X,Y,Z,转换为 A,B,C a[i]=temp+32; } } for(i=len-1; i>=0; i--) cout<<a[i]; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 22 、加密的病历单 ) 输入一行单词序列,相邻单词之间由 1 个或多个空格间隔,请对应地计算各个单词 的长度。 注意:如果有标点符号(如连字符,逗号),标点符号算作与之相连的词的一部分。 没有被空格间开的符号串,都算作单词。 输入 一行单词序列,最少 1 个单词,最多 300 个单词,单词之间用至少 1 个空格间隔。 单词序列总长度不超过 1000。 输出 依次输出对应单词的长度,之间以逗号间隔。 输入样例 She was born in 1990-01-02 and from Beijing city. 输出样例 3,3,4,2,10,3,4,7,5 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char s[1001]; int len,i,sum=0; gets(s); len=strlen(s); for(i=0; i<len; i++) { if(s[i]!=' ') sum++; else { if(sum>0) cout<<sum<<","; sum=0;//计数器归零 } } cout<<sum<<endl; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 23 、单词的长度 ) ( 第 100 页 共 251 页 ) 学科网(北京)股份有限公司 输入一个句子(一行),将句子中的每一个单词翻转后输出。 输入 只有一行,为一个字符串,不超过 500 个字符。单词之间以空格隔开。 输出 翻转每一个单词后的字符串,单词之间的空格需与原文一致。 输入样例 hello world 输出样例 olleh dlrow #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char s[501]; int len,p,i,j,sum=0; gets(s); len=strlen(s); s[len]=' ';//末尾加一空格方便计算 for(i=0; i<=len; i++) { if(s[i]!=' ') sum++; else { p=i;//记录单词末位置 for(j=1; j<=sum; j++) //倒序输出 cout<<s[--p]; sum=0;//计数器归零 if(i!=len)//若不是自己加上的空格就输出空格 cout<<" "; } } return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 24 、单词翻转 ) 25、判断字符串是否为回文 输入一个字符串,输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。 输入 输入为一行字符串(字符串中没有空白字符,字符串长度不超过 100)。 输出 如果字符串是回文,输出 yes;否则,输出 no。 输入样例 abcdedcba 输出样例 yes #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char s[101]; int len,p,i,j; gets(s); len=strlen(s); i=0; j=len-1;//记录字符串首、尾位置 while( (i<j) &&(s[i]==s[j]) ) { //从首尾同时向中间判定,若不是回文串, 则退出循环 i++; j--; } if(i>=j) cout<<"yes"; else cout<<"no"; return 0; } 26、最高分数的学生姓名 输入学生的人数,然后再输入每位学生的分数和姓名,求获得最高分数的学生的姓 名。 输入:第一行输入一个正整数 N(N ≤ 100),表示学生人数。接着输入 N 行,每 行格式:分数 姓名,分数是一个非负整数,且小于等于 100;姓名为一个连续的字符串, 中间没有空格,长度不超过 20。 ( 内部资料 请勿外传 翻印必究 ) 数据保证最高分只有一位同学。 输出 获得最高分数同学的姓名。 输入样例 5 87 lilei 99 hanmeimei 97 lily 96 lucy 77 jim 输出样例 hanmeimei #include<iostream> #include<cstdio> #include<cstring> using namespace std; struct student { string name; int score; } a[100]; int main() { int n,i,j; cin>>n; for(i=0; i<n; i++) { cin>>a[i].score>>a[i].name; } for(i=0; i<n-1; i++) //冒泡排序 for(j=0; j<n-1-i; j++) if(a[j].score<a[j+1].score) swap(a[j],a[j+1]); cout<<a[0].name; return 0; } 27、最长单词 一个以‘.’结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特 殊形式。 输入 一个以‘.’结尾的简单英文句子(长度不超过 500),单词之间用空格分隔,没有 缩写形式和其它特殊形式。 输出 该句子中最长的单词。如果多于一个,则输出第一个。 输入样例 I am a student of Peking University. 输出样例 University #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char a[501]; gets(a); int n,max=0,max1,max2,sum=0; n=strlen(a); for(int i=0; i<n; i++) { if(a[i]!=' ' && a[i]!='.') sum++; else { if(sum>max) { max=sum; max1=i-sum; max2=i-1; } sum=0; } } for(int i=max1; i<=max2; i++) cout<<a[i]; return 0; } 函数部分 28、求正整数 2 和 n 之间的完全数 求正整数 2 和 n 之间的完全数(一行一个数)。 完全数:因子之和等于它本身的自然数,如 6=1+2+3 输入 输入 n。 输出 一行一个数,按由小到大的顺序。 输入样例 7 输出样例 6 #include<iostream> using namespace std; int wqs(int x) { int i; int sum=0; for(i=1; i<=x-1; i++) //枚举 1 到 x 中,判断是否为 x 的因子 if(x%i==0)//若是 x 的因子,累加 sum+=i; return sum; } int main() { int n,i; cin>>n; for(i=2; i<=n; i++) if(wqs(i)==i) cout<<i<<endl; //wqs(i)为 i 的因子之和,wqs(i)若与 i 相等,满足条件,输出 return 0; } 29、素数个数 编程求 2~n(n 为大于 2 的正整数)中有多少个素数。 输入:输入 n(2≤n≤50000)。 输出:素数个数。 输入样例:10 输出样例:4 #include<iostream> #include<cmath> using namespace std; bool prime(int n)//判断素数 { int i,t; t=int(sqrt(n)); for(i=2;i<=t;i++) if(n%i==0) break; if(i>t) return 1; return 0; } int main() { int n,i,sum=0; cin>>n; for(i=2; i<=n; i++) if(prime(i)) sum++; cout<<sum; return 0; } 30、绝对素数 如果一个自然数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例 如 13。试求出所有二位绝对素数。输入:(无) 输出:所有二位绝对素数(由小到大,一个数一行)。 输入样例:(无) 输出样例:(无) #include<iostream> #include<cmath> using namespace std; bool prime(int n)//判断素数 { int i,t; t=int(sqrt(n)); for(i=2;i<=t;i++) if(n%i==0) break; if(i>t) return 1; return 0; } int main() { int i; for(i=10; i<=99; i++) //二位绝对素数从 10 枚举到 99 if( prime(i) && prime((i%10)*10+(i/10)) )//分别判断 i 以及 i 变换 后是否是素数 cout<<i<<endl; return 0; } 31、亲和数 自然数 a 的因子是指能整除 a 的所有自然数,但不含 a 本身。例如 12 的因子为: 1,2,3,4,6。若自然数 a 的因子之和为 b,而且 b 的因子之和又等于 a,则称 a,b 为一对 “亲和数” 。求最小的一对亲和数(a<>b)。 输入:(无) 输出: 1 行,分别为 a 和 b(a<b)。 ( 内部资料 请勿外传 翻印必究 ) #include<iostream> using namespace std; int qhs(int n) { int i,sum=0; for(i=1; i<n/2+1; i++) if(n%i==0) sum=sum+i; return sum; } int main() { int i; for(i=1; i<n/2+1; i++) { if( i==qhs(qhs(i)) && i!=qhs(i) ) { //num(num(i))即为 i 因子之和的因子之和 cout<<i<<" "<<qhs(i)<<endl;//i 与 qhs(i)即满足条件的一组亲和数 break; } } return 0; } 32、回文三位数 如果一个数从左边读和从右边读都是同一个数,就称为回文数。例如 6886 就是一 个回文数,求出所有的既是回文数又是素数的三位数。 输入:(无) 输出: 所有的既是回文数又是素数的三位数。一个数一行。 #include<iostream> #include<cmath> using namespace std; bool prime(int n)//判断素数 { int i,t; t=int(sqrt(n)); for(i=2;i<=t;i++) if(n%i==0) break; if(i>t) return 1; return 0; } int main() { int i; for(i=100; i<=999; i++) //从枚举所有三位数 if( prime(i) && (i/100==i%10))//该数是素数且百位与个位相同 cout<<i<<endl; return 0; } 33、哥德巴赫猜想 哥德巴赫猜想的命题之一是:大于 6 的偶数等于两个素数之和。编程将 6~100 所有 偶数表示成两个素数之和。 输入 (无) 输出 分行输出: 例如:6=3+3 8=3+5 ... (每个数只拆开一次,请保证第一个加数最小) #include<iostream> #include<cmath> using namespace std; bool prime(int n)//判断素数 { int i,t; t=int(sqrt(n)); for(i=2;i<=t;i++) if(n%i==0) break; if(i>t) return 1; return 0; } int main() { int n,i; for(n=6; n<=100; n=n+2) //枚举 6-100 的偶数 for(i=2; i<=n/2; i++) //将 n 分解为 i 与 x-i 两个数 if(prime(i)&&prime(n-i))//若被分解的两个数皆为素数 { } return 0; } cout<<n<<"="<<i<<"+"<<n-i<<endl; break; 34、甲流病人初筛 目前正是甲流盛行时期,为了更好地进行分流治疗,医院在挂号时要求对病人的体 温和咳嗽情况进行检查,对于体温超过 37.5 度(含等于 37.5 度)并且咳嗽的病人初步 判定为甲流病人(初筛)。现需要统计某天前来挂号就诊的病人中有多少人被初筛为甲 流病人。 输入 第一行是某天前来挂号就诊的病人数 n。(n<200) 其后有 n 行,每行是病人的信息,包括三个信息:姓名(字符串,不含空格,最多 8 个字符)、体温(float)、是否咳嗽(整数,1 表示咳嗽,0 表示不咳嗽)。每行三 个信息之间以一个空格分开。 输出 按输入顺序依次输出所有被筛选为甲流的病人的姓名,每个名字占一行。之后在输 出一行,表示被筛选为甲流的病人数量。 输入样例 5 Zhang 38.3 0 Li 37.5 1 Wang 37.1 1 Zhao 39.0 1 Liu 38.2 1 输出样例 Li Zhao Liu 3 #include<iostream> #include<string> using namespace std; int main() { int n,i,sum=0; cin>>n; float temp[n+1]; int ks[n+1]; string name[n+1]; for(i=1;i<=n;i++)//依次输入姓名、体温、是否咳嗽 cin>>name[i]>>temp[i]>>ks[i]; for(i=1;i<=n;i++) ( 第 110 页 共 251 页 ) 学科网(北京)股份有限公司 if(temp[i]>=37.5 && ks[i]==1)//进行判断 { cout<<name[i]<<endl;//输出姓名 sum++; } cout<<sum;//输出总数 return 0; } 35、统计单词数 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的 位置,有的还能统计出特定单词在文章中出现的次数。 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的 文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完 全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同 (参见样例 1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2)。 输入 第 1 行为一个字符串,其中只含字母,表示给定单词; 第 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。 输出 只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格 隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时, 单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输 出一个整数-1。 输入样例 #样例一 To to be or not to be is a question #样例二 to Did the Ottoman Empire lose its power at that time 输出样例 #样例一:2 0 #样例二:-1 #include<iostream> #include<cstring> #include<cstdio> using namespace std; int main() { string w,s; int len1,len2; int i,j; int count=0,p; getline(cin,w);//输入单词 getline(cin,s);//输入句子 len1=w.size();//记录单词的长度 len2=s.size();//记录句子的长度 for(i=0; i<len2; i++) { for(j=0; j<len1; j++) { if(toupper(s[i+j])!=toupper(w[j])) break;//若字符不匹配退出循环,再从第 i+1 个开始判定 //toupper()从小写转大写 if(i>0&&s[i-1]!=' ') break;//若第 i 个字符不是文章首且前一个字符不是空格,则不 是独立单词,退出循环 } if(j==len1&&(s[i+j]==' '||j+i==len2))//若循环判定通过,且该单词 词尾为文章尾或后有空格 { count++;//累加满足条件单词数 if(count==1)//若第一次出现 p=i;//记录位置 } } if(count) cout<<count<<" "<<p; else cout<<"-1"; return 0; } 36、素数对 两个相差为 2 的素数称为素数对,如 5 和 7,17 和 19 等,本题目要求找出所有 两个数均不大于 n 的素数对。 输入:一个正整数 n(1≤n≤10000)。 输出:所有小于等于 n 的素数对。每对素数对输出一行,中间用单个空格隔开。若 没有找到任何素数对,输出 empty。 输入样例:100 输出样例: 3 5 5 7 11 13 17 19 29 31 41 43 59 61 71 73 #include<iostream> #include<cmath> using namespace std; bool prime(int n)//判断素数 { int i,t; if(n==2) return 1; t=int(sqrt(n)); for(i=2;i<=t;i++) { if(n%i==0) return 0; } if(i>t) return 1;} int main() { int n,i; bool flag=1; cin>>n; for(i=2; i<=n-2; i++) //从 2 遍历到 n-2 if( prime(i+2) && prime(i) )//若存在素数对则输出 { cout<<i<<" "<<i+2<<endl;; flag=0; } if(flag)//不存在素数对则输出 empty cout<<"empty"; return 0; } 小蓝家住在一条短胡同里,这条胡同的门牌号从 1 开始顺序编号。 若其余各家的门牌号之和减去我家门牌号的两倍,恰好等于 n,求小蓝家的门牌号 及总共有多少家。数据保证有唯一解。 输入:一个正整数 n。n<100000。 输出:一行,包含两个正整数,分别是我家的门牌号及总共有多少家,中间用单个 空格隔开。 输入样例:100 输出样例:12 16 解题思路:设最后门牌号为 k,则总和为:k*(k+1)/2 设小蓝家的门牌号为 x,则由题意:k*(k+1)/2=3*x+n 即:k*(k+1)=6*x+2*n 又:k*(k+1)+k+1>6*x+2*n 得:(k+1)*(k+1)>6*x+2*n 开方:k+1>sqrt(6*x+2*n) 两边减一:k>sqrt(6*x+2*n)-1 x 取最小值 1:home=sqrt(6+2*n)-1 #include<iostream> #include<cmath> using namespace std; int main() { int i,n,home,x; cin>>n; home=sqrt(6+2*n)-1; for(i=home;; i++) //从小蓝家的门牌号开始逐个尝试 { if((i*i+i-2*n)%6==0) { x=(i*i+i-2*n)/6; if(x<=0) continue;//x 不可能<1 if(x>0)//找到后 { cout<<x<<" "<<i; break; } } } return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 37 、小蓝家的门牌号 ) 两个质数的和是 S,它们的积最大是多少? 输入 一个不大于 10000 的正整数 S,为两个质数的和。 输出 一个整数,为两个质数的最大乘积。数据保证有解。 输入样例 50 输出样例 589 #include<iostream> #include<cmath> using namespace std; bool prime(int n)//判断素数 { int i,t; if(n==2) return 1; t=int(sqrt(n)); for(i=2;i<=t;i++) { if(n%i==0) return 0; } if(i>t) return 1; } int main() { int s,i; cin>>s; for(i=s/2; i>=2; i--) //和为定值的两个数越接近数越大,因此从中间拆分 if(prime(i) && prime(s-i))//判断拆分的两个数是否为素数 { cout<<i*(s-i)<<endl; //若是,输出两数积 break; } return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 38 、质数的和与积 ) 输入两个整数 X 和 Y,输出两者之间的素数个数(包括 X 和 Y)。 输入 两个整数 X 和 Y(1 ≤ X,Y ≤ 105)。 输出 输出一个整数,表示 X,Y 之间的素数个数(包括 X 和 Y)。 输入样例 1 100 输出样例 25 #include<iostream> #include<cmath> using namespace std; bool prime(int n)//判断素数 { int i,t; if(n==2) return 1; t=int(sqrt(n)); for(i=2;i<=t;i++) { if(n%i==0) return 0; } if(i>t) return 1; } int main() { int x,y,i,count=0; cin>>x>>y; for(i=x; i<=y; i++) //从 x 枚举到 y { if( prime(i) )//分别判断 i 是否是素数 count++; } cout<<count; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 39 、判断素数个数 ) 任意输入两个正整数 m,n(1<m<n≤5000),依次输出 m 到 n 之间每个数的最大质因子 (包括 m 和 n;如果某个数本身是质数,则输出这个数自身)。 输入 一行,包含两个正整数 m 和 n,其间以单个空格间隔。 输出 一行,每个整数的最大质因子,以逗号间隔。 输入样例 5 10 输出样例 5,3,7,2,3,5 #include<iostream> #include<cmath> using namespace std; bool prime(int n)//判断素数 { int i,t; if(n==2) return 1; t=int(sqrt(n)); for(i=2;i<=t;i++) { if(n%i==0) return 0; } if(i>t) return 1; } int main() { int m,n,i,j; cin>>m>>n; for(i=m; i<=n; i++) //从 m 枚举到 n for(j=i; j>=2; j--) //从小到大找每个数的最大质因子 if( i%j==0 && judge(j) )//找到最大质因子 { ( 内部资料 请勿外传 翻印必究 ) ( 40 、最大质因子序列 ) } return 0; } cout<<j; if(i!=n) cout<<","; break; 若将一个正整数化为二进制数,在此二进制数中,我们将数字 1 的个数多于数 字 0 的个数的这类二进制数称为 A 类数,否则就称其为 B 类数。 例如: (13)10=(1101)2,其中 1 的个数为 3,0 的个数为 1,则称此数为 A 类数; (10)10=(1010)2,其中 1 的个数为 2,0 的个数也为 2,称此数为 B 类数; (24)10=(11000)2,其中 1 的个数为 2,0 的个数为 3,则称此数为 B 类数; 程序要求:求出 1~1000 之中(包括 1 与 1000),全部 A、B 两类数的个数。 输入 (无) 输出 一行,包含两个整数,分别是 A 类数和 B 类数的个数,中间用单个空格隔开。 #include<iostream> using namespace std; bool bin(int n) { int a=0,b=0; while(n>0)//将一个数化为二进制数,并判断是 A 类数还是 B 类数 { if(n%2) a++;//a 统计 1 的个数 else b++;//b 统计 0 的个数 n=n/2; } return a>b; } int main() { int a=0,b=0,i; for(i=1; i<=1000; i++) //枚举 1-1000 的数 if(bin(i)) a++; //若 i 是 A 类数 else//若 i 是 B 类数 b++; cout<<a<<" "<<b; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 41 、二进制分类 ) 输入一个十六进制数,输出相应的十进制数。 十六进制的基数是 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f。 输入 输入有若干行,每行表示一个十六进制的数。 输出 输出每个十六进制数对应的十进制数。 样例输入 a1 1a 110 样例输出 161 26 272 //十六进制转十进制 #include<iostream> using namespace std; #include<string> #include<cmath> int main() { char a[100]; cin>>a; int l=strlen(a); long long num=0; for(int i=0; i<l; i++) { if(a[i]>='0'&&a[i]<='9') num+=(a[i]-'0')*pow(16,l-1-i); else num+=(a[i]-'A'+10)*pow(16,l-1-i); } cout<<num; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 42 、十六进制转十进制 ) 43、十进制转十六进制 十 六 进 制 数 是 在 程 序 设 计 时 经 常 要 使 用 到 的 一 种 整 数 的 表 示 方 式 。 它 有 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 共 16 个符号,分别表示十进制数的 0 至 15。十六 进制的计数方法是满 16 进 1,所以十进制数 16 在十六进制中是 10,而十进制的 17 在 十六进制中是 11,以此类推,十进制的 30 在十六进制中是 1E。 给出一个非负整数,将它表示成十六进制的形式。 输入格式 输入包含一个非负整数 a,表示要转换的数。0<=a<=2147483647 输出格式 输出这个整数的 16 进制表示 样例输入 30 样例输出 1E 方法一、 #include<iostream> using namespace std; #include<cstdlib> int main() { long long n; int m; int k = 0; char str[100]; cin >> n; if(n==0) { cout<<'0'; } while (n>0) { m = n % 16; n =n/16; //转换为字符串 if (m > 9) str[k++] = 'A' + m-10; else str[k++] = '0' + m; } for (int i = k - 1; i >= 0; i--) { cout << str[i]; ( 内部资料 请勿外传 翻印必究 ) ( 第 120 页 共 251 页 ) 学科网(北京)股份有限公司 } return 0; } 方法二、 #include<iostream> #include<cstdio> using namespace std; int main() { long long a; while(cin >> a) printf("%X",a); //输出大写的十六进制 return 0; } printf 是格式化输出函数,它可以直接打印十进制,八进制,十六进制,输出控制 符分别为: 十六进制 hex "%X" 八进制 oct "%o" 输出二进制 配合 itoa(a, s, 2) ; printf("%s", s);使用 44、简单密码 Julius Caesar 曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它 字母表中后 5 位对应的字符来代替,这样就得到了密文。比如字符 A 用 F 来代替。如下 是密文和明文中字符的对应关系。 密文 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 明文 V W X Y Z A B C D E F G H I J K L M N O P Q R S T U 你的任务是对给定的密文进行解密得到明文。 你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符, 对这些字符不用进行解码。 输入 一行,给出密文,密文不为空,而且其中的字符数不超过 200。 输出 输出一行,即密文对应的明文。 样例输入 NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX 样例输出 IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES 来源:翻译自 South Central USA 2002 的试题 #include<iostream> #include<cstring> #include<cstdio> using namespace std; int main() { string s,e; while(cin>>s) { if(s=="ENDOFINPUT") break; //需使用 getchar()来接收换行符 getchar(); char c[200]; gets(c); int num=strlen(c); for(int i=0; i<num; i++) { if(c[i]>='A'&&c[i]<='Z') { cout<<(char)((c[i]-'A'-5+26)%26+'A'); } else cout<<c[i]; } cout<<endl; cin>>e; getchar(); } } 45、蛇形填充数组 用数字 1,2,3,4,...,n*n 这 n2 个数蛇形填充规模为 n*n 的方阵。 蛇形填充方法为: 对于每一条左下-右上的斜线,从左上到右下依次编号 1,2,...,2n-1;按编号从小 到大的顺序,将数字从小到大填入各条斜线,其中编号为奇数的从左下向右上填写,编 号为偶数的从右上到左下填写。 比如 n=4 时,方阵填充为如下形式: 1 2 6 7 3 5 8 13 4 9 12 14 10 11 15 16 输入:输入一个不大于 10 的正整数 n,表示方阵的行数。 输出:输出该方阵,相邻两个元素之间用单个空格间隔。 样例输入:4 样例输出 1 2 6 7 3 5 8 13 4 9 12 14 10 11 15 16 #include <iostream> using namespace std; int main() { int n, i, j, x=1; int a[10][10]= {0}; cin >> n; for(i=0; i<=2*n-2; i++) { for(j=i; j>=0; j--) { if(j<n&i-j<n) { if(i%2!=0) //当 i 为奇数时,从右上到左下遍历 a[i-j][j] = x++; else //当 i 为时偶数,从左下到右上遍历 a[j][i-j] = x++; } } } for(i=0; i<n; i++) { for(j=0; j<n; j++) cout << a[i][j] << " "; cout << endl; } return 0; } 46、图像相似度(2021 真题) 给出两幅相同大小的黑白图像(用 0-1 矩阵)表示,求它们的相似度。 说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素 点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。 输入 第一行包含两个整数 m 和 n,表示图像的行数和列数,中间用单个空格隔开。1 <= m <= 100, 1 <= n <= 100。 之后 m 行,每行 n 个整数 0 或 1,表示第一幅黑白图像上各 像素点的颜色。相邻两个数之间用单个空格隔开。 之后 m 行,每行 n 个整数 0 或 1,表 示第二幅黑白图像上各像素点的颜色。相邻两个数之间用单个空格隔开。 输出 一个实数,表示相似度(以百分比的形式给出),精确到小数点后两位。 样例输入 3 3 1 0 1 0 0 1 1 1 0 1 1 0 0 0 1 0 0 1 样例输出 44.44 #include<iostream> using namespace std; int main() { int i,j,n,m,count=0,temp; cin>>m>>n; int a[m][n];//动态生成数组从 下标为 1 位置存储 for(i=0; i<m; i++) //m 行 for(j=0;j<n;j++)//n 列 cin>>a[i][j];//读入 m*n 个数 for(i=0; i<m; i++) //m 行 for(j=0;j<n;j++)//n 列 对数据逐个进行比较 { cin>>temp;//读入 m*n 个数 if(a[i][j]==temp) count++; //若与指定数字相同,计数器+1 } double same; same=count*1.0/(m*n)*100; printf("%0.2f",same); return 0; } 47、和为给定数(2021 真题) 给出若干个整数,询问其中是否有一对数的和等于给定的数。 输入 共三行: 第一行是整数 n(0 < n <= 100,000),表示有 n 个整数。 第二行是 n 个 整数。整数的范围是在 0 到 10^8 之间。 第三行是一个整数 m(0 <= m <= 2^30),表示 需要得到的和。 输出 若存在和为 m 的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。 若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出 一行 No。 样例输入 4 2 5 1 4 6 样例输出 1 5 方法一、 数据范围比较大 部分测试点出现超时 需要优化 #include<iostream> #include<algorithm> using namespace std; int main() { long long n,m,i,j; cin>>n; long long a[n]; for(i=0;i<n;i++) cin>>a[i]; sort(a,a+n); //快速排序 要用到 <algorithm>头文件 cin>>m; for(i=0;i<n;i++) for(j=i+1;j<n;j++) if(a[i]+a[j]==m) { cout<<a[i]<<" "<<a[j]; return 0; //找到符合条件数对 提前退出程序 } cout<<"No"; return 0; } 方法二、 考虑到数据范围比较大 采用二分查找法 可以通过全部测试点 #include<iostream> #include<algorithm> using namespace std; int main() { long long n,m,i,j; cin>>n; long long a[n]; for(i=0; i<n; i++) cin>>a[i]; sort(a,a+n); //快速排序 要用到 <algorithm>头文件 cin>>m; for(int i=0; i<n; i++) { int left=0,r=n; int t=m-a[i]; while(left<r) { //二分查找 int mid=(left+r)>>1; if(a[mid]>=t) r=mid; else left=mid+1; } if(t==a[r]&&r!=i) { //判断是否找到,并且不是之前的那个位置 cout<<a[i]<<' '<<a[r]<<endl; return 0; } } cout<<"No"<<endl; return 0; } 48、计算两个日期之间的天数 (2021 真题) 给定两个日期,计算相差的天数。比如 2010-1-1 和 2010-1-3 相差 2 天。 输入 共两行: 第一行包含三个整数 startYear,startMonth,startDay,分别是起始年、 月、日。 第二行包含三个整数 endYear,endMonth,endDay,分别是结束年、月、日。 ( 第 126 页 共 251 页 ) 学科网(北京)股份有限公司 相邻两个整数之间用单个空格隔开。 年份范围在 1~3000。保证日期正确且结束日期不 早于起始日期。 输出 输出一个整数,即是两个日期相差的天数。 样例输入 2008 1 1 2009 1 1 样例输出 366 提示:闰年被定义为能被 4 整除的年份,但是能被 100 整除而不能被 400 整除的年 是例外,它们不是闰年。闰年的 2 月份有 29 天。 解题思路:直接算两个日期距离公元元年 1 月 1 日的天数然后相减 //直接算两个日期距离公元元年 1 月 1 日的天数然后相减 #include<iostream> using namespace std; int sum(int y,int m,int d) { int x[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31}; int i,s=0; for(i=1; i<y; i++) { s=s+365; if(i%4==0 && i%100!=0 || i%400==0) s=s+1;//闰年再+1 天 } if(y%4==0 && y%100!=0 || y%400==0) x[2]=29; //闰年 2 月 29 天 修改数组 for(i=1; i<m; i++) s=s+x[i];//整月的天数 s=s+d;//日的天数 return s;//返回总天数,相对公元 1 年 } int main() { int y1,m1,d1,y2,m2,d2; cin>>y1>>m1>>d1; cin>>y2>>m2>>d2; cout<<sum(y2,m2,d2)-sum(y1,m1,d1); return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 第 127 页 共 251 页 ) 学科网(北京)股份有限公司 49、石头剪刀布(2021 真题) 石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出 拳一样,则不分胜负。 一天,小 A 和小 B 正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如: “石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周 期不断循环的。请问,小 A 和小 B 比了 N 轮之后,谁赢的轮数多? 输入 输入包含三行。 第一行包含三个整数:N,NA,NB,分别表示比了 N 轮,小 A 出拳 的周期长度,小 B 出拳的周期长度。0 < N,NA,NB < 100。 第二行包含 NA 个整数,表 示小 A 出拳的规律。 第三行包含 NB 个整数,表示小 B 出拳的规律。 其中,0 表示“石 头”,2 表示“剪刀”,5 表示“布”。相邻两个整数之间用单个空格隔开。 输出 输出一行,如果小 A 赢的轮数多,输出 A;如果小 B 赢的轮数多,输出 B;如果两人 打平,输出 draw。 样例输入 10 3 4 0 2 5 0 5 0 2 样例输出 A 提示:对于测试数据,猜拳过程为: A:0 2 5 0 2 5 0 2 5 0 B:0 5 0 2 0 5 0 2 0 5 A 赢了 4 轮,B 赢了 2 轮,双方打平 4 轮,所以 A 赢的轮数多。 #include<iostream> using namespace std; int main() { int a[105]; int b[105]; int n,x,y,k; while (cin >> n >> x >> y) { int a_win = 0, b_win = 0; for (int i = 1; i <= x; i++) cin >> a[i]; for (int i = 1; i <= y; i++) cin >> b[i]; for (int i = 1; i <= n; i++) { a[i] = a[(i - 1) % x + 1]; b[i] = b[(i - 1) % y + 1]; k=a[i]-b[i]; if (k==-2||k==-3||k==5) a_win++; if (k==2 ||k==3 ||k==-5) b_win++; } if (a_win > b_win) cout << "A" ; if (a_win < b_win) cout << "B" ; if (a_win ==b_win) cout << "draw" ; } } 50、最长最短单词(2021 真题) 输入 1 行句子(不多于 200 个单词,每个单词长度不超过 100),只包含字母、空 格和逗号。单词由至少一个连续的字母构成,空格和逗号都是单词间的间隔。 试输出第 1 个最长的单词和第 1 个最短单词。 输入 一行句子。 输出 两行输出: 第 1 行,第一个最长的单词。 第 2 行,第一个最短的单词。 样例输入 I am studying Programming language C in Peking University 样例输出 Programming I 提示 如果所有单词长度相同,那么第一个单词既是最长单词也是最短单词。 #include <iostream> #include <cstring> #include <cstdio> using namespace std; int main() { char a[1000000]; //200 个单词每个不超过 100 至少要 200*100 格子以上 gets(a); //输入字符串 a int len=strlen(a); //字符串长度 len a[len]=' '; //最后一个字符后面一格加个空格 用于最后一个单词判断 int q=0,max=0,min=100000,max_i,min_i; for(int i=0; i<=len; i++) { if( (a[i]>='a' &&a[i]<='z') || (a[i]>='A' &&a[i]<='Z') ) { //如果为大 小写字母时 计数器++ q++; } else if (q>0) { //为 ,或者空格时 且 q>0 防止多个空格情况 if(q>max) { //当 q 长度大于最大长度时 max=q; //记录长度 max_i=i-q;//修改记录这个最长单词的起点坐标 } if(q<min) { //q 长度小于最小长度时 min=q; //修改最小长度 min_i=i-q;//修改记录这个最小单词的起点坐标 } q=0; //计数器清零 } } for(int i=max_i; i<max_i+max; i++) //最长单词为 起点为 max_i 长度为 max 的单词 连续输出 cout<<a[i]; cout<<endl; //最长单词输出完了之后 换行 准备输出最小 单词 for(int i=min_i; i<min_i+min; i++) cout<<a[i]; } ( 第 130 页 共 251 页 ) 学科网(北京)股份有限公司 51、啤酒厂选址(2021 真题) 海上有一个岛,在环海边上建有一条环岛高速公路,沿着公路有 n(5 < n < 10000) 个居民点,假设每个居民点有一个编号,从 0 开始,按顺时针依次从小到大(即,0,1,…, n-1)编号。在岛上啤酒很受青睐。某啤酒企业计划在岛上投资建一个啤酒厂,并根据 啤酒需求每天向居住点送啤酒。已知两个相邻的居民点的距离以及每个居住点每天的啤 酒需求量(假设每个居住点每天不超过 2000 桶)。假定每单位长度的路程送一桶啤酒 需要的费用恒定(为单位费用)。请问,选择哪一个居民点建啤酒厂,才能使每天送啤 酒的费用最小(空车不计费用)。 输入 第一行:为居民点数目 n 后面为 n 行,每行为一个居民点的啤酒需求量以及按顺时 针离下一个居民点的距离(均为整数,空格间隔),从编号为 0 的开始,按单增顺次给 出。 注意:后面第 n 行对应于居民点(n-1)的啤酒需求量以及到编号为 0 的居民点距 离。 输出 啤酒厂所在的居民点编号以及每天的运输费用,其间以逗号间隔 样例输入 6 500 10 300 30 350 25 400 60 700 28 200 35 样例输出 0,94100 #include <iostream> using namespace std; int main() { int need[10010],dist[10010];//分别为结点所需与跟下一节点的距离 int min=-1,flag=0,length=0; int n; cin>>n; for (int i = 0; i < n; ++i) { cin>>need[i]>>dist[i]; length=length+dist[i]; } for (int i = 0; i < n; ++i) { int num=0,len=0; int temp=0; for (int j = i; j < n + i; ++j) {//遍历 temp=(j>=n)?j-n:j; //三目运算 if(len<length/2) { num=num+len*need[temp]; } else { num=num+(length-len)*need[temp]; } len=len+dist[temp]; } if(num<min||min==-1) { //得所求 min=num; flag=i; } } cout<<flag<<","<<min; } 52、统计误差范围内的数(2020 真题) 统计一个整数序列中与指定数字 m 误差范围小于等于 X 的数的个数。 输入 输入包含三行: 第一行为 N,表示整数序列的长度(N <= 100); 第二行为 N 个整 数,整数之间以一个空格分开; 第三行包含 2 个整数,为指定的整数 m,误差范围 X。 输出 输出为 N 个数中与指定数字 m 误差范围小于等于 X 的数的个数。 样例输入 5 1 2 3 4 5 3 1 样例输出 3 提示:样例中 2,3,4 都满足条件,故答案为 3 #include<cmath> using namespace std; int main() { int m,n,i,x,count=0; cin>>n; int num[n]; for(i=0; i<n; i++) { cin>>num[i]; } cin>>m>>x; for(i=0; i<n; i++) { if(abs(m-num[i])<=x) //abs()取绝对值函数 需头文件<cmath> count++; } cout<<count; return 0; } 53、单词倒排(2020 真题) 编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单 词的顺序倒排并输出,依然以单个空格分隔。 输入 输入为一个字符串(字符串长度至多为 100)。 输出 输出为按要求排序后的字符串。 样例输入 I am a student 样例输出 student a am I。 解题思路:把所有单词一个一个都存到 string 数组里面 //把所有单词一个一个都存到 string 数组里面 ( 内部资料 请勿外传 翻印必究 ) ( #include<iostream> ) #include<iostream> using namespace std; int main() { string str[100]; int n = 0; while (cin>>str[n]) n++; for (int i=n-1; i>=0; i--) cout <<str[i]<< ' '; return 0; } 方法二: #include<iostream> #include<cstring> using namespace std; int main() { char s[101]; int i,j,len,z; while(gets(s)) { len=strlen(s); j=len-1; for (i=len-1; i>=0; i--) { if (s[i]==' ') { for (z=i+1; z<=j; z++) cout<<s[z]; cout<<s[i]; j=i-1; } } if (i<0) { for (z=0; z<=j; z++) cout<<s[z]; } cout<<endl; } return 0; } ( 内部资料 请勿外传 翻印必究 ) 54、细菌的繁殖与扩散(2020 真题) 在边长为 9 的正方形培养皿中,正中心位置有 m 个细菌。假设细菌的寿命仅一天, 但每天可繁殖 10 个后代,而且这 10 个后代,有两个分布在原来的单元格中,其余的均 匀分布在其四周相邻的八个单元格中。求经过 n(1≤n≤4)天后,细菌在培养皿中的分布 情况。 输入 输入为两个整数,第一个整数 m 表示中心位置细菌的个数(2 ≤ m ≤ 30),第二 个整数 n 表示经过的天数(1 ≤ n ≤ 4)。 输出 输出九行九列整数矩阵,每行的整数之间用空格分隔。整个矩阵代表 n 天后细菌在 培养皿上的分布情况。 样例输入 2 1 样例输出 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 0 0 0 0 0 0 2 4 2 0 0 0 0 0 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 来源:北大医学部 07 计算概论模拟考试 #include<iostream> #include<cstring> #include<cmath> using namespace std; int main() { int n,m,i,j,k; int a[105][105],b[105][105]; memset(a,0,sizeof(a));//初始化数组 a 元素全为 0 cin>>m>>n; a[5][5]=m; for (k=1; k<=n; ++k) { for (i=1; i<=9; ++i) for (j=1; j<=9; ++j) b[i][j]=2*a[i][j]+a[i-1][j-1]+a[i][j-1]+a[i+1][j-1] +a[i-1][j]+a[i+1][j]+a[i-1][j+1]+a[i][j+1]+a[i+1][j+1]; for (i=1; i<=9; ++i) for (j=1; j<=9; ++j) { a[i][j]=b[i][j]; b[i][j]=0; } } for (i=1; i<=9; ++i) { for (j=1; j<=9; ++j) cout<<a[i][j]<<" "; cout<<endl; } return 0; } 55、大整数加法(2020 真题) 求两个不超过 200 位的非负整数的和。 输入 有两行,每行是一个不超过 200 位的非负整数,可能有多余的前导 0。 输出 一行,即相加后的结果。结果里不能有多余的前导 0,即如果结果是 342,那么就不 能输出为 0342。 样例输入 22222222222222222222 33333333333333333333 样例输出 55555555555555555555 解题思路:位数很多,int、long long 都没法正常完成加减乘除操作,这里采用数 组的存储方式。 #include <iostream> #include <cstring> using namespace std; int main() { char s1[1005], s2[1005];//读入要做加法的数 int n1[1005], n2[1005], ans[1005]; //n1 和 n2 倒着存输入的大整数,ans 存储加法运算后的结果 cin >> s1 >> s2 ; n1[0] = strlen(s1); //用到头文件<cstring> n2[0] = strlen(s2); for(int i = 0, j = n1[0]; i < n1[0]; i++, j--) { //s1 是字符数组,要它变成数字,需要减去一个字符 0,完成隐式转换,s2 同 n1[j] = s1[i] - '0'; } for(int i = 0, j = n2[0]; i < n2[0]; i++, j--) { n2[j] = s2[i] - '0'; } ans[0] = max(n1[0], n2[0]);//取两个字符串位数的最高位 for(int i = 1; i <= ans[0]; i++) { ans[i] = n1[i] + n2[i]; } for(int i = 1; i <= ans[0]; i++) { // 进位 if(ans[i] > 9) { ans[i + 1] += ans[i] / 10; ans[i] %= 10; if(i == ans[0]) { ++ans[0]; } } } for(int i = ans[0]; i > 0; i--) { // 倒回来输出结果 cout << ans[i]; } return 0; } 56、循环数(2020 真题) 若一个 n 位的数字串满足下述条件,则称其是循环数(cyclic):将这个数字串视 为整数(可能带有前导 0),并用任意一个 1 到 n 之间(包含 1 和 n)的整数去乘它 时, 会得到一个将原数字串首尾相接后,再在某处断开而得到的新数字串所对应的整 数。例如,数字 142857 是循环数,因为: 142857 *1 = 142857 142857 *2 = 285714 142857 *3 = 428571 142857 *4 = 571428 142857 *5 = 714285 142857 *6 = 857142。 请写一个程序判断给定的数是否是循环数。 注意:在此题中,输入数字串允许带前导 0,且前导 0 不能被忽略,例如“01”是 两位数字串,而“1”是一位数字串。但将数字串转化为整数做乘法运算或比较运算时, 可以忽略前导 0。 输入 一行,一个长度在 2 到 60 位之间的数字串。 输出 一个整数,若输入的数字串是循环数,输出 1,否则输出 0。 样例输入:142857 样例输出:1 #include<iostream> #include<cstring> using namespace std; int main() { int len,a[300]= {0},b[300]= {0},t=0,f; string st,s; cin>>st; len=st.size(); for(int i=0; i<len; i++) a[i]=st[i]-'0'; //将 st 一位一位存入数组 a 中 减 0 是字符到数字的隐形转换 st=st+st;//将 st 首尾相接 for(int j=1; j<=len; j++) { for(int k=0; k<len; k++) b[k]=a[k];//将 a 数组存入 b 中 for(int p=len-1; p>=0; p--) { b[p]=b[p]*j+t; t=b[p]/10; b[p]=b[p]%10; }//高精度乘法 s="";//将字符串 s 置空 for(int q=0; q<len; q++) s=s+(char)('0'+b[q]);//将 b 数组转换到字符串 s 中 f=st.find(s,0); if(f==-1) { //即 st 中没有 s cout<<'0'; return 0; }//输入“0”并停止运行 } cout<<'1'; return 0; } 57、数字放大 高精度乘法(2021 年 6 月真题) 给定一个整数序列以及放大倍数 x,将序列中每个整数放大 x 倍后输出。 输入 包含三行: 第一行为 N,表示整数序列的长度(N ≤ 100); 第二行为 N 个整数(不超 过整型范围),整数之间以一个空格分开; 第三行包含一个整数(不超过整型范围), 为指定的整数 x。 输出 N 个整数,为原序列放大之后的序列,整数之间以一个空格分开。 样例输入 3 1 5 7 2 样例输出 2 10 14 提示 注意答案的数据范围 解析:C++不支持大数运算,故而引入高精度算法。 2.高精度乘法将大数以字符串形式 输入,然后拆分转换为一位一位的整数,之后按照小学的竖式运算方法完成编码。 #include<iostream> #include<cstring> #include<cstdio> #include<stdlib.h> using namespace std; int main(){ int n,i; string x; char a[105][25]; cin>>n; for(i=0;i<n;i++) //读入 n 个整数 cin>>a[i][25]; cin>>x; //读入要放大的倍数 for(i=0;i<n;i++) { string s1, s2; int len1,len2; s1=x; s2=a[i][25]; len1 = s1.length(); len2 = s2.length(); int res[10001]; memset(res, 0, sizeof(res)); for(int i = 0; i < len1; i++) for(int j = 0; j < len2; j++) { res[i+j] += (s1[i] - '0')*(s2[j] - '0'); } if(res[0] >= 10) cout<<res[0]/10; for(int i = len1+len2-1; i > 0; i--) if(res[i] >= 10) { res[i-1] += res[i]/10; res[i] %= 10; } for(int i = 0; i < len1+len2-1; i++) cout<<res[i]<<" "; } return 0; } ( 第 140 页 共 251 页 ) 学科网(北京)股份有限公司 58、统一文件名(2021 年 6 月真题) 小 A 在命名文件的时候经常不注意大小写,格式比较混乱。现要求你写一个程序将 目录下的文件统一规范的格式,即文件名的第一个字符如果是字母要大写,其他字母小 写。如将 Test、test 整理成 Test。 输入:第一行一个数字 n,表示有 n 个文件名要统一,n 不超过 100。 接下来 n 行,每 行一个单词,长度不超过 20,表示文件的名字。文件名由字母、数字和-组成。 输出:n 行,每行一个单词,对应统一后的文件名。 样例输入 4 Test data 2-TEST problem-6 样例输出 Test Data 2-test Problem-6 #include<iostream> #include<cstring> using namespace std; int main() { char str[25]; int n,len; cin>>n; for(int i=0; i<n; i++) { cin>>str; if(str[0]>='a'&&str[0]<='z')//以小写开头,转为大写 str[0]-=32; //A 65 a 97 大小写差值为 32 len=strlen(str); for(int j=1; j<len; j++) { //除开头外均转为小写字母 if(str[j]>='A'&&str[j]<='Z') { str[j]+=32; } } cout<<str<<endl; } return 0; } 输入一个整数矩阵,计算位于矩阵内部的元素之和。所谓矩阵内部的元素,不在第 一行和最后一行的元素以及第一列和最后一列的元素。 输入 第一行分别为矩阵的行数 m 和列数 n(m < 100,n < 100),两者之间以一个空格分开。 接下来输入的 m 行数据中,每行包含 n 个整数(每个数大于等于 0,小于 1000),整数之 间以一个空格分开。 输出 输出对应矩阵的内部元素和 样例输入 3 3 3 4 1 3 7 1 2 0 1 样例输出 7 #include<iostream> using namespace std; int main(){ int m,n,i,j,temp,sum=0; cin>>m>>n; for(i=1;i<=m;i++) for(j=1;j<=n;j++) { cin>>temp; if(i!=1&&i!=m&&j!=1&&j!=n) sum=sum+temp; } cout<<sum; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 59 、求矩阵内部元素之和( 2021 年 6 月真题) ) 给定 10 个整数的序列,要求对其重新排序。排序要求: 1.奇数在前,偶数在后; 2.奇数按从大到小排序; 3.偶数按输入顺序逆序排序。 输入:输入一行,包含 10 个整数,彼此以一个空格分开,每个整数的范围是大于等于 0, 小于等于 100。 输出:按照要求排序后输出一行包含排序后的 10 个整数,数与数之间以一个空格分开。 样例输入 4 7 3 13 11 12 0 47 34 98 样例输出 47 13 11 7 3 98 34 0 12 4 #include<iostream> #include<algorithm> using namespace std; bool cmp(int a,int b) { return a>b; } int main() { int a[10],b[10]; int m=0,n=0,temp,i; for(i=1; i<=10; i++) { cin>>temp; if(temp%2==1) { a[m]=temp;m++; } else { b[n]=temp;n++; } } sort(a,a+m,cmp); //数组元素从大到小排序 for(i=0; i<m; i++) cout<<a[i]<<" "; for(i=0; i<n; i++) cout<<b[n-1-i]<<" "; //按输入顺序逆序排序 倒着输出 return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 60 、整数奇偶排序( 2021 年 6 月真题) ) 61、计算好数(二进制分类)(2021 年 6 月真题) 若将一个正整数化为二进制数,在此二进制数中,我们将数字 1 的个数多于数字 0 的个数的这类二进制数称为好数。 例如: (13)10 = (1101)2,其中 1 的个数为 3,0 的个数为 1,则此数是好数; (10)10 = (1010)2,其中 1 的个数为 2,0 的个数也为 2,则此数不是好数; (24)10 = (11000)2,其中 1 的个数为 2,0 的个数为 3,则此数不是好数; 对于给定的 N,写程序求出 1~N 之中(包括 1 与 N)中的好数个数。 输入 一个整数,题目中的 N(N ≤ 1000) 输出 一个整数,表示 1~N 之中(包括 1 与 N)中的好数个数 样例输入 10 样例输出 5 #include<iostream> using namespace std; int main() { int n,m,r,i,count=0; cin>>n; for(int i=1;i<=n;i++) { int yi=0,ling=0; //保存 1 和 0 的个数 每次遍历变量清零 m=i;//保留现场 不要改变循环变量的值 while(m!=0) //十进制转二进制:除 2 取余 商为零止 倒排列 { r=m%2; if(r==1) yi++; else ling++; m=m/2; } if(yi>ling) count++; } cout<<count; return 0; } ( 内部资料 请勿外传 翻印必究 ) C 语言三级考纲说明 能力目标 通过本级考核的学生,能够使用枚举、递归、递推编写算法,完成指定功能。 考试标准 1、掌握算法以及算法性能、算法效率的概念 2、掌握基本算法中枚举的概念 3、掌握基本算法中递归的概念 4、掌握自调用函数的应用,实现基本算法中的递归方法; 5、掌握基本算法中由递归变递推的方法 知识点描述 1、算法性能和算法效率 算法性能:评估算法的好坏,主要从两个方面的判断:时间复杂度和空间复杂度, 了解这两种评估的概念。算法效率:指算法执行的时间,了解如何度量算法效率。 2、枚举法 了解什么是枚举法,枚举法的优缺点,掌握实现枚举法的基本思路 3、递归 掌握算法中递归的概念了解什么是自调用函数,掌握自调用函数的应用,实现基本 算法中的递归方法了解什么是递推,掌握递归与递推的区别,能够将递归算法转成递推 算法 C 语言三级题库 56 题及参考答案 递归算法 1、求 1+2+3+... 用递归的方法求 1+2+3+……+N 的值。 输入: 输入 n。 输出: 输出和。 输入样例 5 输出样例 15 #include<iostream> using namespace std; int f(int n) { if(n==0) return 0;//判断是否到达递归边界 return f(n-1)+n; //未到达继续递归 } int main() { int n; cin>>n; cout<<f(n);//调用函数计算从 1—n 的累加值 return 0; } 2、倒序数 输入一个非负整数,输出这个数的倒序数。例如输入 123,输出 321。 输入:输入一个非负整数(保证个位不为零)。 输出:输出倒序的数。 输入样例:123 输出样例:321 #include<iostream> using namespace std; void f(int n) { cout<<n%10;//输出 n 的最后一位 if(n>=10) f(n/10);//判断是否到达递归边界 x<10 } int main() { int n; cin>>n; f(n);//调用函数计算并输出 n 的倒序数 return 0; } 3、十进制转任意进制 用递归算法将一个十进制数 X 转换成任意进制数 M(M≤16)。 输入:一行两个数,第一个十进制数 X,第二个为进制 M。 输出:输出结果。 输入样例 31 16 {将十进制 31 转化为十六进制数} 输出样例 1F #include<iostream> using namespace std; void cal(int n,int k) { char num[16]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; int temp; temp=n%k; n/=k; if(n!=0)//判断是否到达边界 n=0 cal(n,k); cout<<num[temp]; } int main() { int x,m; cin>>x>>m;//输入十进制数 x 与要转换成的进制 m cal(x,m);//调用函数进行转换 return 0; } 4、字符串逆序 输入一串以‘!’结束的字符,按逆序输出。 输入:如题述。 输出:如题述。 输入样例:abc! 输出样例:cba 解题思路:strlen(s)用来计算指定的字符串 s 的长度,不包括结束字符"\0"。 方法一: #include<iostream> #include<cstdio> using namespace std; char ch[10000]; int f(int n) { if(ch[n]!='!')//判断是否到达边界 ch[x]=! f(n+1); else return 1; cout<<ch[n]; } int main() { gets(ch);//获取一行字符串 f(0);//调用函数 cout<<endl; return 0; } 方法二: #include<iostream> #include<cstring> #include<cstdio> int main() { int len,i; char str[100]; gets(str); len=strlen(str); for(i=len-2; i>=0; i--) //去掉行末的 ! printf("%c", str[i]); return 0; } 阿克曼(Ackmann)函数 A(m,n)中,m,n 定义域是非负整数(m≤3,n≤10),函数值定义 为: akm(m,n) = n+1; (m=0 时) akm(m,n) = akm(m-1,1); (m>0,n=0 时) akm(m,n) = akm(m-1,akm(m, n-1)); (m,n>0 时) 输入:输入 m 和 n。 输出:函数值 输入样例 2 3 输出样例 9 #include<iostream> using namespace std; int ack(int m,int n) { if(m==0) return n+1;//判断是否到达递归边界 m=0 if(m>0&&n==0) return ack(m-1,1);//判断是否到达递归边界 n=0 if(m>0&&n>0) return ack(m-1,ack(m,n-1));//否则继续递归 }//递归边界分别判断 尽量不用 else int main() { int m,n; cin>>m>>n; cout<<ack(m,n); return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 5 、阿克曼 (Ackmann) 函数 ) 6、digit 函数 在程序中定义一函数 digit(n,k),它能分离出整数 n 从右边数第 k 个数字。 输入:正整数 n 和 k。 输出:一个数字。 输入样例: 31859 3 输出样例:8 #include<iostream> using namespace std; int f(int n,int k) { k--; if(k==0)//判断是否到达递归边界 k=0 return n%10; else//否则继续递归 return f(n/10,k); } int main() { int n,k; cin>>n>>k; cout<<f(n,k)<<endl; return 0; } 7、Hermite 多项式 用递归的方法求 Hermite 多项式的值 对给定的 x 和正整数 n,求多项式的值,并保留两位小数。 输入 给定的 n 和正整数 x。 输出 多项式的值。 输入样例:1 2 输出样例:4.00 ( 内部资料 请勿外传 翻印必究 ) ( 第 150 页 共 251 页 ) 学科网(北京)股份有限公司 #include<iostream> #include<cstdio> using namespace std; double f(int n,int x) { if(n==0) return 1; //判断是否到达递归边界 n=0 if(n==1) return 2*x;//判断是否到达递归边界 n=1 return ( 2*x*f(n-1,x)-2*(n-1)*f(n-2,x) ); } int main() { int n,x; cin>>n>>x; printf("%.2f",f(n,x)); return 0; } 8、流感传染 ( 2021 年 3 月三级真题) 有一批易感人群住在网格状的宿舍区内,宿舍区为 n*n 的矩阵,每个格点为一个房 间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天, 得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第 m 天得流感的人数。 输入:第一行一个数字 n,n 不超过 100,表示有 n*n 的宿舍房间。 接下来的 n 行,每行 n 个字符,’.’表示第一天该房间住着健康的人,’#’表示 该房间空着,’@’表示第一天该房间住着得流感的人。 接下来的一行是一个整数 m,m 不超过 100。 输出:输出第 m 天,得流感的人数。 输入样例 5 ....# .#.@. .#@.. #.... ..... 4 输出样例 16 #include <iostream> using namespace std; int main() { //输入 n 和相应的房间状态 int n=0; cin >> n; char a[50][50]; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) cin >> a[i][j]; //输入天数 int day = 0; cin >> day; while (day) { //前四个 for 循环处理四周的边界的传染状态更新 for (int i = 0; i < n; i++) { if (a[1][i]=='@') if (a[0][i] != '#') a[0][i] = '@'; } for (int i = 0; i < n; i++) { if (a[n][i] == '@') if (a[n-1][i] != '#') a[n-1][i] = '@'; } for (int i = 0; i < n; i++) { if (a[i][1] == '@') if (a[i][0] != '#') a[i][0] = '@'; } for (int i = 0; i < n; i++) { if (a[i][n] == '@') if (a[i][n-1] != '#') a[i][n-1] = '@'; } //摒弃四周边界的房间后,所有房间的传染更新状态 for (int i = 1; i < n-1; i++) { for (int j = 1; j < n-1; j++) { if (a[i][j] == '@') { if (a[i - 1][j]!='#') a[i - 1][j] = '@'; if (a[i][j - 1]!= '#') a[i][j - 1] = '@'; if (a[i][j + 1] != '#') a[i][j + 1] = '@'; if (a[i + 1][j] != '#') a[i + 1][j] = '@'; } } } day = day - 1; } //统计房间内被感染的数量。 int num = 0; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (a[i][j]=='@') num++; cout << num << endl; return 0; } 9、苹果消消乐 (枚举题)( 2021 年 3 月三级真题) 100 个苹果和香蕉排成一条直线,其中有 N 个香蕉,你可以使用至多 M 次魔法道 具将香蕉变成苹果,最后“最长的连续苹果数量”即为你本次苹果消消乐的得分,给定 苹果和香蕉的排列,求你能获得的最大得分。 输入格式:第一行是一个整数 T(1 <= T <= 10)T(1<=T<=10),代表测试数据的组 数。 每个测试数据第一行是 2 个整数 N 和 M(0 <= N, M <= 100)。第二行包含 N 个整数 a_1, a_2, ..., a_N(1 <= a_1 < a_2 < ... < a_N <= 100),表示第 a_1, a_2, ... ,a_N 个位置上摆放的是香蕉。 输出格式;对于每组数据,输出通过使用魔法道具后你能获得的最大得分。 样例输入 3 5 1 34 77 82 83 84 5 2 10 30 55 56 90 5 10 10 30 55 56 90 样例输出 76 59 100 #include <iostream> using namespace std; int main() { int maxn=0; int t; int n,m,line=100,ans; cin >> n >> m ; int mp[n+1]; for(int i = 1; i <= n; i++) cin >> mp[i]; mp[0] = 0; mp[n + 1] = line + 1; int r = m; line = 1; while(r <= n) { ans = max(ans,mp[r + 1] - mp[line - 1] + 1 - 2); line++; r++; } cout << ans << endl; return 0; } 10、车厢重组 (冒泡排序) 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车 站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转 180 度,则可以把相邻两节 车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站 的车厢按车厢号从小到大排列。他退休后,火车站决定将这一工作自动化,其中一项重 要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。 输入:有两行数据,第一行是车厢总数 N(不大于 10000),第二行是 N 个不同的 数表示初始的车厢顺序。 输出:一个数据,是最少的旋转次数。 输入样例 4 4 3 2 1 输出样例 6 #include<iostream> using namespace std; int main() { int n,i,j,sum=0; cin>>n; int a[n+1]; for(i=1; i<=n; i++) cin>>a[i]; for(i=1; i<=n; i++) for(j=i+1; j<=n; j++) if(a[i]>a[j]) { swap(a[i],a[j]);//交换两个数位置 sum++; } cout<<sum; return 0; } 11、求逆序对 给定一个序列 a1,a2,…,an 如果存在 i<j 并且 ai>aj,那么我们称之为逆序对, 求逆序对的数目。 输入:第一行为 n,表示序列长度,接下来的 n 行,第 i+1 行表示序列中的第 i 个数。 输出:所有逆序对总数。 输入样例: 4 3 2 3 2 输出样例:3 提示 N≤105,Ai≤105N≤105,Ai≤105。 #include<iostream> using namespace std; int main() { int i,j,n,count=0; cin>>n; int a[n+1]; for(i=1;i<=n;i++) cin>>a[i]; for(i=1; i<=n; i++) for(j=i; j<=n; j++) if(a[i]>a[j]) count++; cout<<count; return 0; } 在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考 第 k 名学生的学号和成绩。 输入:第一行有两个整数,分别是学生的人数 n(1≤n≤100)),和求第 k 名学生 的 k(1≤k≤n)。 其后有 n 行数据,每行包括一个学号(整数)和一个成绩(浮点数),中间用一个 空格分隔。 输出:输出第 k 名学生的学号和成绩,中间用空格分隔。(注:请用%g 输出成绩) 输入样例 5 3 90788001 67.8 90788002 90.3 90788003 61 90788004 68.4 90788005 73.9 输出样例 90788004 68.4 #include <iostream> using namespace std; int main() { int n,k; cin >> n >> k; long long num[n+1]; double s[n+1]; for (int i=1; i<=n; i++) { cin >> num[i] >> s[i]; } for (int i=1; i<=n; i++) { for (int j=i+1; j<=n; j++) { if (s[i] < s[j]) { swap(s[i], s[j]); swap(num[i], num[j]); } } } cout<<num[k]<<" "<<s[k]<<endl; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 12 、谁考了第 k 名 ) 给定一个长度为 N(不大于 500)的正整数序列,请将其中的所有奇数取出,并按 升序输出。 输入:第 1 行为 N; 第 2 行为 N 个正整数,其间用空格间隔。 输出:增序输出的奇数序列,数据之间以逗号间隔。数据保证至少有一个奇数。 输入样例 10 1 3 2 6 5 4 9 8 7 10 输出样例 1,3,5,7,9 #include<iostream> #include<algorithm>//算法头文件 using namespace std; int main() { int n,k=0; cin>>n; long long a[n],temp; for(int i=0; i<n; i++) { cin>>temp; if(temp%2==1) { a[k]=temp; k++; } } sort(a,a+k);//数组排序函数 默认升序排序 用头文件<algorithm> cout<<a[0]; for(int i=1; i<k; i++) cout<<","<<a[i]; return 0; } ( 内部资料 请勿外传 翻印必究 ) ( 13 、奇数单增序列 ) 14、成绩排序 给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有 相同分数则名字字典序小的在前。 输入:第一行为 n (0 < n < 20),表示班里的学生数目; 接下来的 n 行,每行为每个学生的名字和他的成绩, 中间用单个空格隔开。名字只 包含字母且长度不超过 20,成绩为一个不大于 100 的非负整数。 输出:把成绩单按分数从高到低的顺序进行排序并输出,每行包含名字和分数两项, 之间有一个空格。 输入样例 4 Kitty 80 Hanmeimei 90 Joey 92 Tim 28 输出样例 Joey 92 Hanmeimei 90 Kitty 80 Tim 28 #include<iostream> #include <cstring> using namespace std; struct node { char name[21];//名字长度不超过 20 int c; } stu[30],temp; int main() { int n,i,j; cin>>n; for(i=1; i<=n; i++) cin>>stu[i].name>>stu[i].c; for(i=1; i<=n; i++) //冒泡排序 for(j=i+1; j<=n; j++) if(stu[i].c<stu[j].c) swap(stu[i],stu[j]); else if(stu[i].c==stu[j].c && strcmp(stu[i].name,stu[j].name)>0) swap(stu[i],stu[j]); ( 内部资料 请勿外传 翻印必究 ) for(i=1; i<=n; i++) cout<<stu[i].name<<" "<<stu[i].c<<endl; return 0; 知识拓展: strcmp() 用来比较字符串(区分大小写): int strcmp(s1,s2);s1, s2 为需要比较的两个字符串。 s1 == s2 返回 0。 s1 > s2 返回大于 0 的值。 s1 < s2 返回小于 0 的值。 15、奖学金 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 名学 生发奖学金。期末,每个学生都有 3 门课的成绩:语文、数学、英语。先按总分从高到 低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语 文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。 任务:先根据输入的 3 门课的成绩计算总分,然后按上述规则排序,最后按排名顺 序输出前五名名学生的学号和总分。注意,在前 5 名同学中,每个人的奖学金都不相同, 因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据 (每行输出两个数:学号、总分) 是: 7 279 5 279 这两行数据的含义是:总分最高的两个同学的学号依次是 7 号、5 号。这两名同学的 总分都是 279279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为 7 的学生语文成绩更高一些。如果你的前两名的输出数据是: 5 279 7 279 则按输出错误处理,不能得分。 输入:包含 n+1 行: 第 1 行为一个正整数 n(小于 300),表示该校参加评选的学生人数。 第 2 到 n+1 行,每行有 3 个用空格隔开的数字,每个数字都在 0 到 100 之间。第 j 行的 3 个数字依次表示学号为 j−1 的学生的语文、数学、英语的成绩。每个学生的学 号按照输入顺序编号为 1∼n(恰好是输入数据的行号减 1)。 输出:共有 5 行,每行是两个用空格隔开的正整数,依次表示前 5 名学生的学号和 总分。 输入样例 6 90 67 80 87 66 91 78 89 91 ( 第 160 页 共 251 页 ) 学科网(北京)股份有限公司 88 99 77 67 89 64 78 89 98 输出样例 6 265 4 264 3 258 2 244 1 237 解题思路: 以空间换时间,把学生的信息算成一个数字,比如:123·088·99993 第一串为总分,第二串为语文分数,第三串为 999 减去学号的值,因为前两个条件 都相同,学号小的同学排在前面。然后按照字典顺序降序。 #include<iostream> #include<algorithm> using namespace std; bool cmp(int a,int b) { return a>b; } int main() { long long i,x,y,z,n; cin >>n; long long a[n+1]; for (i=1;i<=n;i++){ cin >>x>>y>>z; a[i]=(x+y+z)*1000000+x*1000+(999-i); } sort(a+1,a+n+1,cmp); //使用 cmp 参数降序排列 for (i=1;i<=5;i++) cout<<999-a[i]%1000<<' '<<a[i]/1000000<<endl; } 16、分数线划定 世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试 分数线根据计划录取人数的 150%划定,即如果计划录取 m 名志愿者,则面试分数线为排 名第 m×150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于 面试分数线的所有选手。 现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试 成绩。 输入:第一行,两个整数 n,m(5≤n≤5000,3≤m≤n)中间用一个空格隔开,其 中 n 表示报名参加笔试的选手总数,m 表示计划录取的志愿者人数。输入数据保证 m ×150%向下取整后小于等于 n。 第二行到第 n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报 名号 k(1000≤k≤9999)和该选手的笔试成绩 s(1≤s≤100)。数据保证选手的报名 号各不相同。 输出:第一行,有两个整数,用一个空格隔开,第一个整数表示面试分数线;第二 个整数为进入面试的选手的实际人数。 从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选 手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小 到大的顺序输出。 输入样例 6 3 1000 90 3239 88 2390 95 7231 84 1005 95 1001 88 输出样例 88 5 1005 95 2390 95 1000 90 1001 88 3239 88 提示 样例说明:m×150%=3×150%=4.5,向下取整后为 4。保证 4 个人进入面试的分数线 为 88,但因为 88 有重分,所以所有成绩大于等于 88 的选手都可以进入面试,故最终有 5 个人进入面试。 #include<iostream> #include<algorithm> using namespace std; int main() { int i,j,n,m; int s,p=0; cin>>n>>m; int num[n+1],score[n+1]; for(i=0; i<n; i++) cin>>num[i]>>score[i]; for(i=1; i<=n-1; i++) { for(j=0; j<=n-i; j++) { if(score[j]<score[j+1]) { //按面试分数排序 swap(score[j],score[j+1]); swap(num[j],num[j+1]); } if(score[j]==score[j+1] && num[j]>num[j+1]) { //成绩相同按报名号排序 swap(score[j],score[j+1]); swap(num[j],num[j+1]); } } } m=int(m*1.5);//据计划录取人数的 150%划定选手,向下取整 s=score[m-1]; for(i=0; i<n; i++) if(score[i]>=s) p++; else break; cout<<s<<" "<<p<<endl; for(i=0; i<p; i++) cout<<num[i]<<" "<<score[i]<<endl; return 0; } 17、整数奇偶排序 给定 10 个整数的序列,要求对其重新排序。排序要求: 1.奇数在前,偶数在后; 2.奇数按从大到小排序; 3.偶数按从小到大排序。 输入:输入一行,包含 10 个整数,彼此以一个空格分开,每个整数的范围是大于 等于 0,小于等于 30000。 输出:按照要求排序后输出一行,包含排序后的 10 个整数,数与数之间以一个空 格分开。 输入样例 4 7 3 13 11 12 0 47 34 98 输出样例 47 13 11 7 3 0 4 12 34 98 #include<iostream> #include<algorithm> using namespace std; bool cmp(int a,int b) //数组元素降序排列自定义参数 { return a>b; } int main() { int a[10],b[10]; int m=0,n=0,temp,i; for(i=1; i<=10; i++) { cin>>temp; if(temp%2==1) { a[m]=temp;m++; } else { b[n]=temp;n++; } } sort(a,a+m,cmp); //数组元素从大到小排序 sort(b,b+n); //数组元素从小到大排序 for(i=0; i<m; i++) cout<<a[i]<<" "; for(i=0; i<n; i++) cout<<b[i]<<" "; return 0; } 18、合影效果(真题 整数奇偶排序 ) 小云和朋友们去爬香山,为美丽的景色所陶醉,想合影留念。如果他们站成一排, 男生全部在左(从拍照者的角度),并按照从矮到高的顺序从左到右排,女生全部在右, 并按照从高到矮的顺序从左到右排,请问他们合影的效果是什么样的(所有人的身高都 不同)? 输入:第一行是人数 n(2 <= n <= 40,且至少有 1 个男生和 1 个女生)。 后面紧跟 n 行,每行输入一个人的性别(男 male 或女 female)和身高(浮点数, 单位米),两个数据之间以空格分隔。 输出:n 个浮点数,模拟站好队后,拍照者眼中从左到右每个人的身高。每个浮点 数需保留到小数点后 2 位,相邻两个数之间用单个空格隔开。 输入样例 6 male 1.72 male 1.78 female 1.61 male 1.65 female 1.70 female 1.56 输出样例 1.65 1.72 1.78 1.70 1.61 1.56 #include <cstdio> #include <iostream> #include<algorithm> //sort() 数组排序用到此头文件 using namespace std; int main() { int p=0, q=0,n; string s;//性别 float h, a[41], b[41];// h 身高 a 女生身高;b 男生身高 cin >> n; for (int i=0; i<n; i++) { cin >> s >> h; if (s == "male") // 判断男女并存储身高 {b[p] = h;p++;} else {a[q] = h;q++;} } sort(b,b+p);//数组排序,默认从小到大 sort(a,a+q); ( 内部资料 请勿外传 翻印必究 ) for (int i=0; i<p; i++)// 输出男生的身高 printf("%.2f ", b[i]); for (int i=q-1; i>=0; i--) // 输出女生的身高生从高到矮 printf("%.2f ", a[i]); return 0; } 19、明明的随机数(排序 去重) 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算 机生成了 N 个 1 到 1000 之间的随机整数(N≤100),对于其中重复的数字,只保留一 个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到 大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工 作。 输入:有 2 行,第 1 行为 1 个正整数,表示所生成的随机数的个数:N; 第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。 输出:也是 2 行,第 1 行为 1 个正整数 M,表示不相同的随机数的个数。第 2 行为 M 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。 输入样例 10 20 40 32 67 40 20 89 300 400 15 输出样例 8 15 20 32 40 67 89 300 400 解题思路:用数组桶排序并去重。 桶排序是所有排序算法中最快、最简单的排序算法。首先需要知道所有待排序元素 的范围,然后需要有在这个范围内的同样数量的桶,接着把元素放到对应的桶中,最后 按顺序输出。如有 11 个桶,我们只需要声明一个长度为 11 的数组,然后每把一个元 素往桶中放时,就把数组指定位置的值加 1,最终倒序输出数组的下标,数组每个位置 的值为几就输出几次下标,这样就可以实现桶排序了。 #include<iostream> using namespace std; int main() { int n,i,k,count=0; int num[1001]= {0}; cin>>n; for(i=1; i<=n; i++) { //桶排序输入数据 cin>>k; num[k]++; } for(i=1; i<=1000; i++) {//统计有效数据 if(num[i]>0) count++; } cout<<count<<endl; for(i=1; i<=1000; i++) { if(num[i]>0) cout<<i<<" "; } //桶号即随机数 return 0; } 20、单词排序 输入一行单词序列,相邻单词之间由 1 个或多个空格间隔,请按照字典序输出这些 单词,要求重复的单词只输出一次。(区分大小写) 输入:一行单词序列,最少 1 个单词,最多 100 个单词,每个单词长度不超过 50, 单词之间用至少 1 个空格间隔。数据不含除字母、空格外的其他字符。 输出:按字典序输出这些单词,重复的单词只输出一次。 输入样例 She wants to go to Peking University to study Chinese 输出样例 Chinese Peking She University go study to wants #include <iostream> #include <algorithm> using namespace std; int main() { string a[101], s; int n=0; while(cin>>s) { a[n++]=s; } sort(a, a+n); cout << a[0] << endl; for (int i=1; i<n; i++) if (a[i]!=a[i-1]) cout << a[i] << endl; return 0; } 方法二: #include <iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int main() { string a[110]; int i, n = 0, flag; while (cin >> a[n])//n 表示第 n 个单词 { flag = 0; for (i = 0; i < n; i++) if (a[i].compare(a[n]) == 0) flag = 1;//判断是否有重复的 if (flag == 0) n++; } sort(a, a + n); for (i = 0; i < n; i++) cout << a[i] << endl; return 0; } 21、出现次数超过一半的数 给出一个含有 n(0 < n <= 1000)个整数的数组,请找出其中出现次数超过一半的 数。数组中的数大于-50 且小于 50。 输入:第一行包含一个整数 n,表示数组大小; 第二行包含 n 个整数分别是数组中的每个元素,相邻两个元素之间用单个空格隔开。 输出:如果存在这样的数,输出这个数;否则输出 no。 输入样例 3 1 2 2 输出样例:2 解题思路: 方法一: 利用桶排序方式记录数字出现的次数,再逐个遍历桶存储的值>=n/2 即输出。 已知条件,数组中的数大于-50 且小于 50,但数组下标最小为 0,通过+50 使得数组 元素为整数即可。 #include<iostream> using namespace std; int main() {//数组中数大于-50 且小于 50 int a[101]= {0};//桶排序,数组值初始化为 0 int i,n,b; bool flag=0; cin>>n; for(i=0; i<n; i++) { cin>>b; a[b+50]++;//桶排序 } for(i=0; i<100; i++) { if(a[i]>=n/2) { flag=1; cout<<i-50<<endl; } } if(flag==0)//标志没有被更改过,没找到符合条件 cout<<"no"; return 0; } 方法二: #include <iostream> #include <algorithm> //sort 函数用到 using namespace std; int main() { int n,max=0,t=1;//max 用于记录出现次数最多的数字次数 int flag,i,j; cin>>n; int a[n]; for(i=0; i<n; i++) cin>>a[i]; sort(a,a+n); //进行排序 for(i=0; i<n; i++) { for(j=i+1; j<n; j++) if(a[i]==a[j]) t++; //计算相同的数字次数 if(t>max) { flag=a[i]; max=t; } //找出数字重复次数最多的数字 t=1; } if(max>(n/2)) cout<<flag; //判断重复次数最多的数字次数是否超过总数一半 else cout<<"no"; return 0; } 22、统计字符数 给定一个由 a-z 这 26 个字符组成的字符串,统计其中哪个字符出现的次数最多。 输入:输入包含一行,一个字符串,长度不超过 1000。 输出:输出一行,包括出现次数最多的字符和该字符出现的次数,中间以一个空格 分开。如果有多个字符出现的次数相同且最多,那么输出 ascii 码最小的那一个字符。 输入样例:abbccc 输出样例:c 3 #include<iostream> #include<cstring> using namespace std; int main() { int a[26]= {0};//桶排序清空桶 int len,max=0,i,p; char str[1001];//长度不超过 1000 cin>>str; len=strlen(str); for(i=0; i<len; i++) a[str[i]-'a']++; //差值存入例如'a'-'a'=0 for(i=0; i<26; i++) if(a[i]>max) { p=i; max=a[i];//存储位置并替换最大值变量 } cout<<char('a'+p)<<" "<<max; return 0; } ( 第 170 页 共 251 页 ) 学科网(北京)股份有限公司 23、昆虫繁殖 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫 过 x 个月产 y 对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一 对成虫,且卵长成成虫后的第一个月不产卵(过 x 个月产卵),问过 z 个月以后,共有成 虫多少对?0≤x≤20,1≤y≤20,X≤z≤500≤x≤20,1≤y≤20,X≤z≤50。 输入:x,y,z 的数值。 输出:过 z 个月以后,共有成虫对数。 输入样例:1 2 8 输出样例:37 #include<iostream> #include<cstring> using namespace std; long long a[60],b[60]; int main() { int x,y,z; int i; cin>>x>>y>>z; for(i=1; i<=x; i++) { a[i]=1;//a[i]第 i 个月的成虫 b[i]=0;//b[i]第 i 个月的卵 } for(i=x+1; i<=z+1; i++) { b[i]=a[i-x]*y;//第 i-x 月的成虫在 x 个月后产下 y 个卵 a[i]=a[i-1]+b[i-2];//第 i 个月$$

资源预览图

全国青少年软件编程C++语言等级考试真题试卷
1
全国青少年软件编程C++语言等级考试真题试卷
2
全国青少年软件编程C++语言等级考试真题试卷
3
所属专辑
相关资源
示范课
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。