GESP认证C++编程真题解析 | 202603 三级
编程题
B4499 二进制回文串
【题目来源】
洛谷:[B4499 GESP202603 三级] 二进制回文串 - 洛谷
【题目描述】
对于一个正整数 \(n\),我们将其转换为不含前导零的二进制表示,如果这个二进制序列从左向右读与从右向左读完全相同,则称该数为二进制回文数。例如,\(9\) 的二进制表示为 \((1001)_2\),是二进制回文数;\(12\) 的二进制表示为 \((1100)_2\),不是二进制回文数。
你的任务是:给定一个正整数 \(n\),计算在 \(1\) 到 \(n\) 的范围内二进制回文数的数量。
【输入】
输入一行,包含一个正整数 \(n\)。
【输出】
输出一行,包含一个数,表示在 \(1\) 到 \(n\) 的范围内二进制回文数的数量。
【输入样例】
15
【输出样例】
6
【算法标签】
《洛谷 B4499 二进制回文串》 #进制# #字符串(入门)# #GESP# #2026#
【代码详解】
#include <bits/stdc++.h> // 包含所有标准库头文件
using namespace std; // 使用标准命名空间
int n, cnt; // 定义全局变量:n(输入的数),cnt(计数器,记录符合条件的数的个数)
// 将十进制数n转换为m进制表示的字符串
string Dtom(int n, int m)
{
// 定义字符集,支持最多16进制(0-9, A-F)
string d = "0123456789ABCDEF";
string ans = ""; // 初始化结果字符串为空
// 将十进制数n转换为m进制
while (n > 0)
{
// 获取n除以m的余数,即当前位的值
// 余数作为索引在d中查找对应的字符
// 注意:这里将新得到的位添加到字符串的前面
ans = d[n % m] + ans;
// n除以m,为处理下一位做准备
n /= m;
}
return ans; // 返回转换后的m进制字符串
}
int main() // 主函数入口
{
cin >> n; // 输入整数n
// 遍历1到n的所有整数
for (int i = 1; i <= n; i++)
{
// 将整数i转换为二进制字符串
string t = Dtom(i, 2);
// 保存原始字符串
string s = t;
// 将字符串t反转
reverse(t.begin(), t.end());
// 判断反转后的字符串是否与原字符串相同
// 即判断二进制表示是否是回文数
if (t == s)
{
cnt++; // 如果是回文数,计数器加1
}
}
cout << cnt << endl; // 输出满足条件的数的个数
return 0; // 程序正常结束
}
【运行结果】
15
6
B4500 凯撒密码
【题目来源】
洛谷:[B4500 GESP202603 三级] 凯撒密码 - 洛谷
【题目描述】
凯撒密码是一种替换加密技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是 \(3\) 的时候,所有的字母 \(A\) 将被替换成 \(D\),\(B\) 被替换成 \(E\),\(C\) 被替换成 \(F\),以此类推,\(W\) 被替换成 \(Z\),\(X\) 被替换成 \(A\),\(Y\) 被替换成 \(B\),\(Z\) 被替换成 \(C\)。这个加密方法是以罗马共和时期凯撒的名字命名的,据称当年凯撒曾用此方法与其将军们进行联系。
但是和所有的利用字母表进行替换的加密技术一样,凯撒密码非常容易被破解,而且在实际应用中也无法保证通信安全。
现在给你一个已破解的凯撒密码明文与密文,与一个有相同偏移量的未破解凯撒密码密文,请你帮忙破解它。
【输入】
输入共三行:
第一行包含一个字符串,表示已破解的凯撒密码明文;
第二行包含一个字符串,表示已破解的凯撒密码密文;
第三行包含一个字符串,表示待破解的凯撒密码密文。
【输出】
输出一行,包含一个字符串,表示待破解的凯撒密码对应的明文。
【输入样例】
ABCDEFGVWXYZ
DEFGHIJYZABC
WKHTXLFNEURZQIRAMXPSVRYHUWKHODCBGRJ
【输出样例】
THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG
【算法标签】
《洛谷 B4500 凯撒密码》 #字符串(入门)# #GESP# #2026#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
string a, b, c; // 定义三个字符串:a(明文1), b(密文1), c(要解密的字符串)
int main() // 主函数入口
{
// 输入:a是已知明文,b是已知密文,c是要解密的密文
cin >> a >> b >> c;
// 计算加密位移量:b[0]和a[0]的ASCII码差值
int delta = b[0] - a[0];
// 遍历要解密的字符串c的每个字符
for (int i = 0; i < c.size(); i++)
{
int num = c[i] - 'A'; // 将字符转换为0-25的数字
// 进行解密计算:减去位移量,然后取模26确保在0-25范围内
num = (num - delta + 26) % 26;
c[i] = 'A' + num; // 将数字转换回字符
}
// 输出解密后的字符串
cout << c << endl;
return 0; // 程序正常结束
}
【运行结果】
ABCDEFGVWXYZ
DEFGHIJYZABC
WKHTXLFNEURZQIRAMXPSVRYHUWKHODCBGRJ
THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG
浙公网安备 33010602011771号