900 字
5 分钟
GESP 2026年C++三级编程题解析

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;
}
GESP 2026年C++三级编程题解析
https://yezi.press/posts/gesp/gesp-cpp3-2026/
作者
Yezi 叶子
发布于
2026/03/14
许可协议
CC BY-NC-SA 4.0