1916 字
10 分钟
GESP 2026年C++三级编程题解析
2026/03/14
2026/06/28

202603-1 二进制回文串#

题目描述

对于一个正整数 nn,我们将其转换为不含前导零的二进制表示,如果这个二进制序列从左向右读与从右向左读完全相同,则称该数为二进制回文数。例如,99 的二进制表示为 (1001)2(1001)_2,是二进制回文数;1212 的二进制表示为 (1100)2(1100)_2,不是二进制回文数。

你的任务是:给定一个正整数 nn,计算在 11nn 的范围内二进制回文数的数量。 输入格式

输入一行,包含一个正整数 nn

输出格式

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

样例输入 1

15

样例输出 1

6

提示

【样例解释】

样例 1 中,111515 范围内 11335577991515 是二进制回文数。

【数据范围】

1n1051 \leq n \leq 10^5

代码解析

我们可以直接进行二进制的数位剥离,将数字的二进制表示从低到高逐位剥离出来,同时将这些位再重新组合,得到一个新的数 mm,如果 mm 与原数相等,那么这个数就是二进制回文数。

#include <bits/stdc++.h>
using namespace std;
int main() {
int n,cnt = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
int j = i, m = 0;
while (j) {
m = m *2 + j % 2;
j /= 2;
}
if (m == i) cnt++;
}
cout << cnt;
return 0;
}

202603-2 凯撒密码#

题目描述

凯撒密码是一种替换加密技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是 33 的时候,所有的字母 AA 将被替换成 DDBB 被替换成 EECC 被替换成 FF,以此类推,WW 被替换成 ZZXX 被替换成 AAYY 被替换成 BBZZ 被替换成 CC。这个加密方法是以罗马共和时期凯撒的名字命名的,据称当年凯撒曾用此方法与其将军们进行联系。

但是和所有的利用字母表进行替换的加密技术一样,凯撒密码非常容易被破解,而且在实际应用中也无法保证通信安全。

现在给你一个已破解的凯撒密码明文与密文,与一个有相同偏移量的未破解凯撒密码密文,请你帮忙破解它。

输入格式

输入共三行:

第一行包含一个字符串,表示已破解的凯撒密码明文;

第二行包含一个字符串,表示已破解的凯撒密码密文;

第三行包含一个字符串,表示待破解的凯撒密码密文。

输出格式

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

样例输入

ABCDEFGVWXYZ
DEFGHIJYZABC
WKHTXLFNEURZQIRAMXPSVRYHWUKHODCBGRJ

样例输出

THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG

代码解析

我们可以先计算出已破解的凯撒密码明文与密文之间的偏移量 nn,然后对待破解的凯撒密码密文进行解密,即将每个字符 ii 加上 nn,但是由于 nn 有可能大于零也有可能小于 0,所以加个判断,如果 ii 超过了 ZZ,则减去 2626,如果 ii 小于 AA,则加上 2626

#include <bits/stdc++.h>
using namespace std;
int main() {
string s1, s2, s;
cin >> s1 >> s2 >> s;
int n = s1[0] - s2[0];
for (char i: s) {
i += n;
if (i > 'Z') i -= 26;
else if (i < 'A') i += 26;
cout << i;
}
return 0;
}

202606-1 加密#

题目描述

小杨同学有一串数字,想把它们变成另一串数字,这个过程叫做加密

他有一本密码本,密码本告诉你:每个数字应该变成哪个数字。

数字一共有 1010 个:00112233445566778899

密码本会依次告诉你:

  • 00 要变成什么
  • 11 要变成什么
  • 22 要变成什么
  • ……
  • 99 要变成什么

请你按照密码本,把原来的每个数字都换成新的数字,然后输出。

输入格式

输入共有 33 行。

第一行:一个整数,表示有多少个数字需要加密;

第二行:这些需要加密的数字;

第三行:密码本,一共 1010 个数字。

1010 个数字的意思是:

  • 11 个数字:表示 00 加密后变成什么;
  • 22 个数字:表示 11 加密后变成什么;
  • 33 个数字:表示 22 加密后变成什么;
  • ……
  • 1010 个数字:表示 99 加密后变成什么。

输出格式

输出加密后的数字。

也就是:把输入第二行里的每个数字,都按照输入第三行的密码本换掉后输出。

样例输入 1

7
0 2 0 3 4 1 9
9 0 1 2 3 4 5 6 7 8

样例输出 1

9 1 9 2 3 0 8

提示

第二行要加密的数字是: 0 2 0 3 4 1 90 \ 2 \ 0 \ 3 \ 4 \ 1 \ 9

第三行密码本是: 9 0 1 2 3 4 5 6 7 89 \ 0 \ 1 \ 2 \ 3 \ 4 \ 5 \ 6 \ 7 \ 8

它的意思是:

  • 00 变成 99
  • 11 变成 00
  • 22 变成 11
  • 33 变成 22
  • 44 变成 33
  • 55 变成 44
  • 66 变成 55
  • 77 变成 66
  • 88 变成 77
  • 99 变成 88

所以:

  • 00 变成 99
  • 22 变成 11
  • 00 变成 99
  • 33 变成 22
  • 44 变成 33
  • 11 变成 00
  • 99 变成 88

最后得到: 9 1 9 2 3 0 89 \ 1 \ 9 \ 2 \ 3 \ 0 \ 8

【数据范围】

需要加密的数字个数不超过 2000020000 个,且均为 0099;密码本中的数字不重复,且均为 0099

代码解析

根据题目意思,需要遍历数组 s 的每一个元素 s[i] ,将 s[i] 作为数组 a 的下标,输出 a[s[i]]

#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int s[20005], a[10];
for (int i = 0; i < n; i++)
cin >> s[i];
for (int i = 0; i < 10; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
cout << a[s[i]] << ' ';
return 0;
}

202606-2 字符转换#

题目描述

小杨同学有一串字符,里面可能有:

  • 大写字母,比如 AABBCC
  • 小写字母,比如 aabbcc
  • 数字,比如 001122

现在小杨同学想把这串字符变一变,规则如下:

  1. 如果是大写字母,就变成对应的小写字母;
  2. 如果是小写字母,就变成对应的大写字母;
  3. 如果是数字,就变成 *

请你按照这个规则,帮小杨把整串字符转换好。

输入格式

输入一共有 22 行。

第一行:一个整数,表示这串字符一共有多少个字符。

第二行:一串连续的字符,中间没有空格。

输出格式

输出转换后的字符。

注意:输出时字符之间不要加空格。

样例输入 1

5
aBc98

样例输出 1

AbC**

提示

原来的字符是:

aBc98

从左到右一个一个看:

  1. aa 是小写字母,所以变成 AA
  2. BB 是大写字母,所以变成 bb
  3. cc 是小写字母,所以变成 CC
  4. 99 是数字,所以变成 *
  5. 88 是数字,所以变成 *

所以最后输出:

AbC**

【数据范围】

字符个数不会超过 10001000 个。

每个字符只会是大写字母、小写字母或数字。

代码解析

这道题考察的就是对于字符类型的判断和大小写转换,遍历每一个字符,如果是大写就转小写,如果是小写就转大写,数字字符直接替换为 *

#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
string s;
cin >> n >> s;
for (int i = 0; i < n; i++) {
// if ('a' <= s[i] && s[i] <= 'z')
if (islower(s[i]))
s[i] -= 32;
else if (isupper(s[i]))
s[i] += 32;
else if (isdigit(s[i]))
s[i] = '*';
}
cout << s;
return 0;
}
GESP 2026年C++三级编程题解析
https://yezi.press/posts/gesp/gesp-cpp3-2026/
作者
Yezi 叶子
发布于
2026/03/14
许可协议
CC BY-NC-SA 4.0