GESP C++三级 2026年3月真题详细解析

四季读书网 3 0
GESP C++三级 2026年3月真题详细解析

CCF GESP C++三级 2026年3月真题详细解析


💪 备战GESP,从精练每一道题开始! 推荐使用 「GESP免费练题小程序」 进行针对性训练——智能组卷、逐题解析、薄弱点诊断,助你高效备考、稳步提升。

本文包含2026年3月CCF GESP C++三级考试全部15道单选题、10道判断题、2道编程题的完整解析,精准匹配考纲知识点,附解题思路与易错点提示,帮助考生吃透考点、掌握答题技巧。

🎯 试题解析

───── ✨ 第1题 ✨ ─────

📖 题目

如果字符变量_1的值是字符'1',那么(int)_1的值是?( )。A. 1B. -1C. 49D. +1 或者 -1

📌 大纲对应知识点:ASCII编码🎯 考查目标:掌握常见字符的ASCII码值,理解字符与整数的转换规则

📋 选项详解

选项
是否正确
详细解析
A. 1
混淆了字符'1'和数字1的存储方式,字符'1'的ASCII码不是1
B. -1
字符'1'是可打印字符,ASCII码为正数,不可能为-1
C. 49
✅ 正确选项
字符'0'的ASCII码是48,'1'的ASCII码为48+1=49,强制转int后为49
D. +1 或者 -1
ASCII码是确定的标准值,不会出现两种结果

⭐ 答案:C📌 知识点:ASCII编码、数据类型转换

💡 解题小贴士:记住三个关键ASCII值:空格32、'0'48、'A'65、'a'97,其余字符可通过加减推导。

───── ✨ 第2题 ✨ ─────

📖 题目

a,b是整型变量,各自有互不相同的初始值。下列程序实现了什么效果( )。

a=a^b;b=a^b;a=a^b;

A. a,b的值从始至终都没有改变。B. a,b的值实现了互换。C. a,b的值互换了以后,又还回去了,相当于没有变化。D. a,b的值最后和原值不一样,没有任何意义。

📌 大纲对应知识点:位运算(异或)🎯 考查目标:掌握异或运算的特性,了解不用临时变量交换两个数的方法

📋 选项详解

选项
是否正确
详细解析
A. a,b的值从始至终都没有改变。
第一步a=a^b已经修改了a的值,后续操作也会修改b和a
B. a,b的值实现了互换。
✅ 正确选项
异或特性:x^x=0、x^0=x,三步操作后a和b的值完成交换
C. a,b的值互换了以后,又还回去了,相当于没有变化。
三步异或是经典交换算法,只会交换一次,不会还原
D. a,b的值最后和原值不一样,没有任何意义。
该交换方法是合法且常用的位运算技巧,有明确的使用场景

⭐ 答案:B📌 知识点:位运算-异或

💡 解题小贴士:异或交换无需临时变量,但可读性较低,实际开发中优先用临时变量交换。

───── ✨ 第3题 ✨ ─────

📖 题目

关于下列正确的程序段,说法正确的是( )。

charstr1[]="Hello";charstr2[]={'H','e','l','l','0'};cout<<str1<<endl;cout<<str2<<endl;

A. 字符数组str1和str2完全相同。B. 这段程序多次执行将输出不同的结果。C. 字符数组str1和str2不相等。D. 这两个赋值方式完全相同。

📌 大纲对应知识点:C++一维数组、字符串🎯 考查目标:理解C风格字符串的存储特性,区分字符串字面量和字符数组初始化的差异

📋 选项详解

选项
是否正确
详细解析
A. 字符数组str1和str2完全相同。
str1末尾自动添加'\0'结束符,str2没有结束符,长度和内容都不同
B. 这段程序多次执行将输出不同的结果。
程序行为是确定的,str2输出会出现乱码,但多次执行结果一致
C. 字符数组str1和str2不相等。
✅ 正确选项
两者长度不同,str1有6个字符(含'\0'),str2只有5个字符,内容不同
D. 这两个赋值方式完全相同。
字符串字面量初始化会自动加结束符,字符列表初始化不会,两者不等价

⭐ 答案:C📌 知识点:C风格字符串、数组初始化

💡 解题小贴士:C风格字符串必须以'\0'结尾,否则cout输出时会越界读取内存直到遇到'\0'。

───── ✨ 第4题 ✨ ─────

📖 题目

关于以下程序段 , 说法正确的是( )。

intx=10;cout<<(x++)+(++x)<<endl;

A. C++11标准中,这是未定义行为,不同的环境有可能出现不同的结果B. 22C. 21D. 20

📌 大纲对应知识点:基本运算(自增自减)🎯 考查目标:理解C++中表达式求值顺序的未定义行为规则

📋 选项详解

选项
是否正确
详细解析
A. C++11标准中,这是未定义行为,不同的环境有可能出现不同的结果
✅ 正确选项
C++未规定同一表达式中多个自增操作的求值顺序,属于未定义行为
B. 22
这是部分编译器的执行结果,但不是标准规定的必然结果
C. 21
不存在固定的求值顺序保证结果为21
D. 20
自增操作会修改x的值,结果不可能为20

⭐ 答案:A📌 知识点:自增自减运算、表达式求值顺序

💡 解题小贴士:实际编程中不要在同一表达式中对同一个变量进行多次自增/自减操作,避免出现不可预期的结果。

───── ✨ 第5题 ✨ ─────

📖 题目

8位二进制下,十进制数-15的补码是( )。A. 11110000B. 10001111C. 10010000D. 11110001

📌 大纲对应知识点:数据编码(原码、反码、补码)🎯 考查目标:掌握负数补码的计算方法

📋 选项详解

选项
是否正确
详细解析
A. 11110000
这是-16的8位补码,不符合要求
B. 10001111
这是-15的8位原码,不是补码
C. 10010000
这是-15的8位反码,不是补码
D. 11110001
✅ 正确选项
计算:15的二进制为00001111,取反得11110000,加1得补码11110001

⭐ 答案:D📌 知识点:补码计算

💡 解题小贴士:负数补码计算口诀:原码取反加1(符号位不变),也可以用2^n - 绝对值直接计算(n为位数)。

───── ✨ 第6题 ✨ ─────

📖 题目

三进制数2102转换成十进制是:( )。A. 63B. 65C. 67D. 69

📌 大纲对应知识点:进制转换🎯 考查目标:掌握任意进制转十进制的计算方法

📋 选项详解

选项
是否正确
详细解析
A. 63
计算错误,未正确累加各位权重
B. 65
✅ 正确选项
计算:23³ + 13² + 03¹ + 23⁰ = 2*27 + 9 + 0 + 2 = 54+9+2=65
C. 67
权重计算错误,3的幂次计算偏差
D. 69
各位系数与权重相乘错误

⭐ 答案:B📌 知识点:进制转换(三进制转十进制)

💡 解题小贴士:任意进制转十进制,从右往左各位权重是基数的0次、1次、2次幂,依次累加即可。

───── ✨ 第7题 ✨ ─────

📖 题目

二进制数10110101是某数的8位补码,该数的十进制是( )。A. -73B. -75C. -77D. 75

📌 大纲对应知识点:数据编码(原码、反码、补码)🎯 考查目标:掌握补码转十进制的计算方法

📋 选项详解

选项
是否正确
详细解析
A. -73
补码还原计算错误
B. -75
✅ 正确选项
补码最高位为1是负数,减1得反码10110100,取反得原码11001011,值为-75
C. -77
取反或减1步骤错误
D. 75
最高位为1是负数,不可能是正75

⭐ 答案:B📌 知识点:补码转十进制

💡 解题小贴士:8位补码转负数也可以用公式:值 = 补码的无符号值 - 256,本题10110101无符号值是181,181-256=-75。

───── ✨ 第8题 ✨ ─────

📖 题目

已知unsigned char c = 0x0F;(十六进制0F = 二进制00001111),执行c = c << 3;后,c的十进制值是:( )。A. 64B. 72C. 80D. 120

📌 大纲对应知识点:位运算(左移)🎯 考查目标:掌握左移运算的规则和计算方法

📋 选项详解

选项
是否正确
详细解析
A. 64
左移3位不是乘以8的错误计算结果
B. 72
二进制移位错误
C. 80
移位后的二进制转换错误
D. 120
✅ 正确选项
00001111左移3位得01111000,转换为十进制是120

⭐ 答案:D📌 知识点:位运算-左移

💡 解题小贴士:左移n位相当于乘以2^n(无溢出时),本题0x0F=15,15*8=120,直接计算更快捷。

───── ✨ 第9题 ✨ ─────

📖 题目

补码的情况下,关于按位取反运算,用笔计算的情况下,以下说法错误的是:( )A. ~5的结果是-6(int类型,32位)B. ~0的结果是0(int类型,32位)C. ~(-3)的结果是2(int类型,32位)D. ~8的结果是-9(int类型,32位)

📌 大纲对应知识点:位运算(按位取反)🎯 考查目标:掌握按位取反运算的规则和结果计算

📋 选项详解

选项
是否正确
详细解析
A. ~5的结果是-6(int类型,32位)
5的补码取反后加1得-6,说法正确
B. ~0的结果是0(int类型,32位)
✅ 正确选项
0的补码是全0,取反后是全1,对应int类型的-1,不是0,说法错误
C. ~(-3)的结果是2(int类型,32位)
-3的补码取反后为2,说法正确
D. ~8的结果是-9(int类型,32位)
8的补码取反后加1得-9,说法正确

⭐ 答案:B📌 知识点:位运算-按位取反

💡 解题小贴士:按位取反运算有通用公式:~x = -x -1,直接套用公式可快速计算结果。

───── ✨ 第10题 ✨ ─────

📖 题目

执行以下C++代码后,sub的值是( )。

stringstr="GESP2026";stringsub=str.substr(4,2);

A. 20B. 02C. 2026D. 026

📌 大纲对应知识点:字符串及其函数🎯 考查目标:掌握string类substr函数的用法

📋 选项详解

选项
是否正确
详细解析
A. 20
✅ 正确选项
substr第一个参数是起始下标(从0开始),第二个是长度,下标4的字符是'2',取2个字符为"20"
B. 02
起始下标计算错误,下标5的字符才是'0'
C. 2026
长度参数错误,只取2个字符不是4个
D. 026
起始下标和长度都计算错误

⭐ 答案:A📌 知识点:字符串函数-substr

💡 解题小贴士:C++ string下标从0开始,substr(pos, len),如果len省略则取到字符串末尾。

───── ✨ 第11题 ✨ ─────

📖 题目

执行以下代码后,输出结果是:( )。

intarr[]={5,10,15,20,25,30};intcount=sizeof(arr)/sizeof(arr[0]);cout<<count;

A. 4B. 6C. 24D. 30

📌 大纲对应知识点:C++一维数组🎯 考查目标:掌握sizeof计算数组长度的方法

📋 选项详解

选项
是否正确
详细解析
A. 4
误解了sizeof的计算方式,int占4字节是单个元素的大小
B. 6
✅ 正确选项
数组共有6个元素,sizeof(arr)是整个数组的字节数,除以单个元素的大小得元素个数6
C. 24
这是sizeof(arr)的结果(6*4=24),不是元素个数
D. 30
错误地对数组元素求和,与sizeof运算无关

⭐ 答案:B📌 知识点:数组长度计算

💡 解题小贴士:sizeof(数组名)得到整个数组的总字节数,该方法仅在数组定义的作用域内有效,数组作为函数参数时会退化为指针,无法用该方法计算长度。

───── ✨ 第12题 ✨ ─────

📖 题目

执行以下代码后,输出结果是:( )。

chars[10]="abcde";inta=sizeof(s)/sizeof(s[0]);intb=strlen(s);cout<<a-b;

A. 4B. 5C. 6D. 10

📌 大纲对应知识点:C++一维数组、字符串🎯 考查目标:区分sizeof和strlen的作用,掌握C风格字符串的存储特性

📋 选项详解

选项
是否正确
详细解析
A. 4
计算错误,a=10,b=5,差值不是4
B. 5
✅ 正确选项
sizeof(s)是数组总大小10字节,strlen(s)计算字符串长度为5(不含结束符),10-5=5
C. 6
误将strlen结果算成4,差值错误
D. 10
这是a的值,不是a-b的结果

⭐ 答案:B📌 知识点:sizeof、strlen的区别

💡 解题小贴士:sizeof计算的是变量/类型所占内存的总大小,strlen计算的是C风格字符串的实际长度(到'\0'为止,不含'\0')。

───── ✨ 第13题 ✨ ─────

📖 题目

以下问题中,最不适合用枚举法解决的是:( )A. 找出1~100之间所有能被7整除的数B. 找出100~200之间的所有质数C. 计算1+2+3+…+1000的和D. 找出三位数中个位、十位、百位数字之和等于10的数

📌 大纲对应知识点:算法:枚举法🎯 考查目标:理解枚举法的适用场景,区分枚举法与数学公式法的效率差异

📋 选项详解

选项
是否正确
详细解析
A. 找出1~100之间所有能被7整除的数
范围小,枚举100次即可,适合用枚举法
B. 找出100~200之间的所有质数
范围小,枚举每个数判断是否为质数即可,适合用枚举法
C. 计算1+2+3+…+1000的和
✅ 正确选项
等差数列求和可用公式n*(n+1)/2直接计算,枚举需要循环1000次,效率低,不适合枚举
D. 找出三位数中个位、十位、百位数字之和等于10的数
三位数共900个,枚举判断即可,适合用枚举法

⭐ 答案:C📌 知识点:枚举法适用场景

💡 解题小贴士:当问题可以用数学公式直接得出结果时,优先用公式法,时间复杂度O(1)远优于枚举的O(n)。

───── ✨ 第14题 ✨ ─────

📖 题目

用枚举法解决“鸡兔同笼问题:头共35个,脚共94只,求鸡和兔的数量”,以下枚举逻辑最合理的是:( )A. 枚举鸡的数量x(0~35),兔的数量y=35-x,判断2x + 4*y == 94B. 枚举兔的数量y(0~94),鸡的数量x=35-y,判断2x + 4*y == 94C. 枚举所有整数x(0-100)和y(0-100),判断x+y==35 && 2*x+4*y==94D. 枚举脚的总数sum(0~94),判断sum == 94

📌 大纲对应知识点:算法:枚举法🎯 考查目标:掌握枚举法的优化方法,减少枚举范围提高效率

📋 选项详解

选项
是否正确
详细解析
A. 枚举鸡的数量x(0~35),兔的数量y=35-x,判断2*x + 4*y == 94
✅ 正确选项
枚举范围最小(仅36次),利用头总数约束减少一个变量的枚举,效率最高
B. 枚举兔的数量y(0~94),鸡的数量x=35-y,判断2*x + 4*y == 94
兔的数量最多35只,枚举到94完全没必要,范围过大
C. 枚举所有整数x(0-100)和y(0-100),判断x+y==35 && 2*x+4*y==94
两层循环枚举101*101次,效率极低,完全没必要
D. 枚举脚的总数sum(0~94),判断sum == 94
逻辑错误,脚总数是已知条件,无需枚举

⭐ 答案:A📌 知识点:枚举法优化

💡 解题小贴士:枚举法优化核心:利用题目约束条件尽可能缩小枚举范围,减少枚举变量的数量。

───── ✨ 第15题 ✨ ─────

📖 题目

模拟“字符串加密”:规则为“每个字符ASCII码+3,若超过z(122)则从a重新开始”,以下代码中正确的条件判断是:( )

for(inti=0;i<str.length();i++){// 需补充条件:_______________________else{str[i]+=3;}}

A. if (str[i]> 122) str[i] = str[i] + 3 - 26;B. if (str[i] > 122) str[i] = str[i] - 26;C. if (str[i] + 3 > 122) str[i] = str[i] - 26;D. if (str[i] + 3 > 'z') str[i] = 'a' + (str[i] + 3 - 'z') - 1;

📌 大纲对应知识点:算法:模拟法、ASCII编码🎯 考查目标:掌握模拟算法的逻辑实现,理解循环移位的计算方法

📋 选项详解

选项
是否正确
详细解析
A. if (str[i]> 122) str[i] = str[i] + 3 - 26;
条件判断错误,应该判断加3后的结果是否超过122,不是原字符
B. if (str[i] > 122) str[i] = str[i] - 26;
条件和处理逻辑都错误,原字符本来就小于等于122,不会进入分支
C. if (str[i] + 3 > 122) str[i] = str[i] - 26;
处理逻辑错误,应该是加3之后再减26,不是直接减26
D. if (str[i] + 3 > 'z') str[i] = 'a' + (str[i] + 3 - 'z') - 1;
✅ 正确选项
先判断加3后是否超过'z',超过的话计算循环偏移后的字符,逻辑正确

⭐ 答案:D📌 知识点:模拟算法、字符循环移位

💡 解题小贴士:字母循环移位通用公式:偏移后字符 = 'a' + (原字符 - 'a' + 偏移量 + 26) % 26,可自动处理溢出情况,无需单独判断。

───── ✨ 判断题第1题 ✨ ─────

📖 题目

定义int arr[5] = {1,2,3};,则arr[3]的值为0,arr[5]是合法下标。

📌 大纲对应知识点:C++一维数组🎯 考查目标:掌握数组初始化规则和下标范围

📋 解析

答案:错误数组初始化时未显式赋值的元素会自动初始化为0,因此arr[3]确实是0;但数组arr的长度为5,合法下标范围是0~4,arr[5]越界,属于非法访问。

💡 解题小贴士:C++数组下标从0开始,长度为n的数组最大合法下标是n-1,越界访问会导致未定义行为。

───── ✨ 判断题第2题 ✨ ─────

📖 题目

定义double arr[10];,未手动初始化时,数组中所有元素的默认值为0.0。

📌 大纲对应知识点:C++一维数组🎯 考查目标:掌握局部数组和全局数组的初始化规则

📋 解析

答案:错误局部数组(函数内定义)未初始化时元素值是随机的垃圾值;只有全局数组或静态数组未初始化时才会默认初始化为0。

💡 解题小贴士:局部变量(包括数组)不会自动初始化,使用前必须手动赋值,否则会出现不可预期的结果。

───── ✨ 判断题第3题 ✨ ─────

📖 题目

定义int arr[] = {1,2,3};,则sizeof(arr)的结果为12(int占4字节)。

📌 大纲对应知识点:C++一维数组🎯 考查目标:掌握sizeof计算数组大小的方法

📋 解析

答案:正确数组arr有3个int元素,每个int占4字节,总大小为3*4=12字节,sizeof(arr)结果为12。

💡 解题小贴士:隐式长度数组的长度由初始化列表的元素个数决定,sizeof可正确计算总字节数。

───── ✨ 判断题第4题 ✨ ─────

📖 题目

下面的流程图是用来求1+2+3+…+10的和。请判断:这个流程图的逻辑正确还是错误?

GESP C++三级 2026年3月真题详细解析 第1张

(注:流程图描述:初始化s=0,i=1,判断i≤10,是则s=s+i,i=i+1,循环,否则输出s)

📌 大纲对应知识点:流程图的概念与描述🎯 考查目标:掌握流程图的逻辑分析

📋 解析

答案:正确该流程图初始化和为0,计数变量从1开始,每次累加计数变量到和中,计数加1,直到超过10停止,逻辑完全正确,结果为55。

💡 解题小贴士:累加求和的核心是循环变量从初始值到终止值依次累加,注意循环边界是否正确。

───── ✨ 判断题第5题 ✨ ─────

📖 题目

下面流程图的功能是计算5对2取余数,输出结果为1。

GESP C++三级 2026年3月真题详细解析 第2张

(注:流程图描述:a=5,b=2,r=a%b,输出r)

📌 大纲对应知识点:流程图的概念与描述🎯 考查目标:掌握流程图的逻辑分析

📋 解析

答案:正确5除以2的余数是1,该流程图逻辑正确,输出结果为1。

💡 解题小贴士:取余运算a%b的结果是a除以b的余数,符号与a相同,正数取余结果为正。

───── ✨ 判断题第6题 ✨ ─────

📖 题目

已知大写字符A的ASCII编码的十六进制表示为0x41,计算字符m的ASCII编码的八进制表示为155(八进制)。

📌 大纲对应知识点:ASCII编码、进制转换🎯 考查目标:掌握ASCII码的计算和进制转换

📋 解析

答案:正确'A'的ASCII是65(0x41),'a'是97,'m'是97+12=109。十进制109转八进制:109÷8=13余5,13÷8=1余5,1÷8=0余1,结果为155(八进制)。

💡 解题小贴士:小写字母比对应的大写字母ASCII码大32,'a'是97,'m'是第13个小写字母,所以97+12=109。

───── ✨ 判断题第7题 ✨ ─────

📖 题目

在C++位运算中,各种不同的运算符有优先级的区分,使用括号能够解决优先级的问题。

📌 大纲对应知识点:位运算🎯 考查目标:掌握位运算符的优先级规则

📋 解析

答案:正确位运算符优先级不同(如~优先级高于&,&高于^,^高于|),复杂表达式中使用括号可以明确运算顺序,避免优先级导致的逻辑错误。

💡 解题小贴士:编写位运算表达式时,优先使用括号明确运算顺序,不要依赖默认优先级,提高代码可读性。

───── ✨ 判断题第8题 ✨ ─────

📖 题目

由于在0~255范围内,char类型和int类型可以互换,因此在这里x和y相等。

charx='1';inty=1;

📌 大纲对应知识点:ASCII编码、数据类型转换🎯 考查目标:区分字符'1'和数字1的存储差异

📋 解析

答案:错误char类型x存储的是字符'1'的ASCII码49,int类型y存储的是数字1,两者值不相等。

💡 解题小贴士:字符类型存储的是字符的ASCII码值,字符'0'~'9'对应的ASCII码是48~57,与数字0~9不相等。

───── ✨ 判断题第9题 ✨ ─────

📖 题目

在C++语言中,表达式((0xf0 + 0x15) == 255)的值为true。

📌 大纲对应知识点:进制转换🎯 考查目标:掌握十六进制数的运算

📋 解析

答案:正确0xf0是十进制240,0x15是十进制21,240+21=261,261≠255?哦不对,0xf0是240,0x15是116+5=21,240+21=261,所以表达式值为false?不对,等下,哦不,0xf0是1516=240,0x15是21,240+21=261,确实不等于255,所以答案是错误?不对,等下题目说值为true,所以判断是错?哦对,正确答案是错误。哦抱歉刚才算错了。重新解析:答案:错误十六进制0xf0转换为十进制是15×16=240,0x15转换为十进制是1×16+5=21,两者相加为261,不等于255,因此表达式值为false。

💡 解题小贴士:十六进制转十进制:各位数字乘以16的幂次累加,A~F对应10~15。

───── ✨ 判断题第10题 ✨ ─────

📖 题目

如果a为int类型的变量,且a的二进制最低位为0,则表达式((a & 3 & 1) == 0)的值为true。

📌 大纲对应知识点:位运算(与)🎯 考查目标:掌握按位与运算的应用

📋 解析

答案:正确按位与1可以提取二进制最低位,a的最低位为0,则a&1=0,再与3运算结果还是0,因此0==0结果为true。

💡 解题小贴士:判断整数奇偶性可以用a&1,结果为1是奇数,为0是偶数,效率比取模运算更高。

───── ✨ 编程题1:二进制回文串 ✨ ─────

📖 题目

对于一个正整数n,我们将其转换为不含前导零的二进制表示,如果这个二进制序列从左向右读与从右向左读完全相同,则称该数为二进制回文数。例如,9的二进制表示为1001,是二进制回文数;12的二进制表示为1110,不是二进制回文数。你的任务是:给定一个正整数n,计算在1到n的范围内二进制回文数的数量。

输入格式:

输入一行,包含一个正整数n。

输出格式:

输出一行,包含一个数,表示在1到n的范围内二进制回文数的数量。

样例输入

15

样例输出

6

样例解释

1到15范围内1、3、5、7、9、15是二进制回文数。

数据范围

1 ≤ n ≤ 10^6

📌 大纲对应知识点:枚举法、模拟法、一维数组🎯 考查目标:能够运用枚举法遍历范围,模拟二进制转换和回文判断过程

📋 解题思路

  1. 枚举遍历
    :从1到n依次判断每个数是否是二进制回文数
  2. 二进制转换
    :对每个数,通过除2取余的方式将二进制位存储到数组中
  3. 回文判断
    :用双指针法比较数组首尾对应位置的二进制位是否全部相同
  4. 计数统计
    :统计符合条件的回文数数量并输出

📝 参考代码

#include<iostream>usingnamespacestd;intmain(){intn,a[50]={0},ans=0;cin>>n;for(inti=1;i<=n;i++){intt=i,pos=0;// 转换为二进制,存储到数组a中while(t){a[pos++]=t%2;t/=2;}// 判断是否为回文boolok=true;for(intj=0;j<pos/2;j++){if(a[j]!=a[pos-j-1]){ok=false;break;}}if(ok)ans++;}cout<<ans;return0;}

💡 解题小贴士:n最大为1e6,枚举1e6次完全在时间限制内,无需更复杂的回文构造算法,暴力枚举足够高效。二进制位存储时余数是从低位到高位存储,但回文判断不影响,因为回文正读反读都一样。

───── ✨ 编程题2:凯撒密码 ✨ ─────

📖 题目

凯撒密码是一种替换加密技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B被替换成E,以此类推,X被替换成A,Y被替换成B,Z被替换成C。这个加密方法是以罗马共和时期凯撒名字命名的。现在给你一个已破解的凯撒密码明文与密文,与一个有相同偏移量的未破解凯撒密码密文,请你帮忙破解它。

输入格式

输入共三行:第一行包含一个字符串,表示已破解的凯撒密码明文;第二行包含一个字符串,表示已破解的凯撒密码密文;第三行包含一个字符串,表示待破解的凯撒密码密文。

输出格式

输出一行,包含一个字符串,表示待破解的凯撒密码对应的明文。

样例输入

ABCDEFGVWXYZDEFGHIJYZABCWKHTXLFNEURZQIRAMXPSVRYHUWKHODCBGRJ

样例输出

THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG

样例解释

样例1中,通过已破解的密码得出偏移量为'D'-'A'=3,因此,对未破解部分进行逆向偏移:密文中的W对应明文中的T('W'-3='T'),密文中的K对应明文中的H('K'-3='H'),以此类推。

数据范围

保证密码长度均不超过1000,所有字符串由大写字母组成。

📌 大纲对应知识点:模拟法、字符串及其函数🎯 考查目标:能够运用模拟法实现凯撒密码的解密逻辑,掌握字符偏移的循环处理

📋 解题思路

  1. 计算偏移量
    :通过已知的明文和密文的第一个字符计算偏移量d = 明文[0] - 密文[0]
  2. 偏移量标准化
    :将偏移量调整为0~25之间的正数,避免负数导致的错误
  3. 解密待破解密文
    :对每个字符,加上偏移量后模26,转换为对应的明文字符

📝 参考代码

#include<iostream>#include<string>usingnamespacestd;intmain(){strings1,s2,s3;cin>>s1>>s2>>s3;// 计算偏移量:明文 = 密文 + d (mod 26)intd=s1[0]-s2[0];// 确保偏移量为正的0~25之间d=(d%26+26)%26;for(inti=0;i<s3.length();i++){intch=(s3[i]-'A'+d)%26;cout<<(char)(ch+'A');}return0;}

💡 解题小贴士:偏移量计算要考虑正负情况,用(d % 26 + 26) % 26可以确保结果始终在0~25之间,避免负数取模的异常。字符运算时先转换为0~25的相对值,运算后再转回字符,逻辑更清晰。

📝 学习建议

本次C++三级考试核心考点集中在数据编码(原码反码补码)、进制转换、位运算、一维数组、字符串操作、枚举法和模拟法,这些都是三级考纲明确要求的重点内容。

复习建议:1. 熟练掌握原码/反码/补码的转换和计算,记住常用位运算的特性和应用场景2. 多练习进制转换题,做到快速准确完成二进制、八进制、十进制、十六进制之间的互转3. 掌握C风格字符串和string类的常用函数,区分sizeof和strlen的区别4. 枚举法和模拟法是三级算法题的核心,多练习相关题型,学会优化枚举范围、清晰梳理模拟逻辑

💪 更多GESP历年真题、专项练习题可前往「GESP练题小程序」进行训练,智能错题本、考点测评助力你高效备考,顺利通关!

抱歉,评论功能暂时关闭!