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
posted @ 2026-03-18 15:01  团爸讲算法  阅读(68)  评论(0)    收藏  举报