
编程题B4499 二进制回文串【题目来源】洛谷[B4499 GESP202603 三级] 二进制回文串 - 洛谷【题目描述】对于一个正整数n nn我们将其转换为不含前导零的二进制表示如果这个二进制序列从左向右读与从右向左读完全相同则称该数为二进制回文数。例如9 99的二进制表示为( 1001 ) 2 (1001)_2(1001)2是二进制回文数12 1212的二进制表示为( 1100 ) 2 (1100)_2(1100)2不是二进制回文数。你的任务是给定一个正整数n nn计算在1 11到n nn的范围内二进制回文数的数量。【输入】输入一行包含一个正整数n nn。【输出】输出一行包含一个数表示在1 11到n nn的范围内二进制回文数的数量。【输入样例】15【输出样例】6【算法标签】《洛谷 B4499 二进制回文串》 #进制# #字符串入门# #GESP# #2026#【代码详解】#includebits/stdc.h// 包含所有标准库头文件usingnamespacestd;// 使用标准命名空间intn,cnt;// 定义全局变量n(输入的数)cnt(计数器记录符合条件的数的个数)// 将十进制数n转换为m进制表示的字符串stringDtom(intn,intm){// 定义字符集支持最多16进制0-9, A-Fstring d0123456789ABCDEF;string ans;// 初始化结果字符串为空// 将十进制数n转换为m进制while(n0){// 获取n除以m的余数即当前位的值// 余数作为索引在d中查找对应的字符// 注意这里将新得到的位添加到字符串的前面ansd[n%m]ans;// n除以m为处理下一位做准备n/m;}returnans;// 返回转换后的m进制字符串}intmain()// 主函数入口{cinn;// 输入整数n// 遍历1到n的所有整数for(inti1;in;i){// 将整数i转换为二进制字符串string tDtom(i,2);// 保存原始字符串string st;// 将字符串t反转reverse(t.begin(),t.end());// 判断反转后的字符串是否与原字符串相同// 即判断二进制表示是否是回文数if(ts){cnt;// 如果是回文数计数器加1}}coutcntendl;// 输出满足条件的数的个数return0;// 程序正常结束}【运行结果】15 6B4500 凯撒密码【题目来源】洛谷[B4500 GESP202603 三级] 凯撒密码 - 洛谷【题目描述】凯撒密码是一种替换加密技术明文中的所有字母都在字母表上向后或向前按照一个固定数目进行偏移后被替换成密文。例如当偏移量是3 33的时候所有的字母A AA将被替换成D DDB BB被替换成E EEC CC被替换成F FF以此类推W WW被替换成Z ZZX XX被替换成A AAY YY被替换成B BBZ ZZ被替换成C CC。这个加密方法是以罗马共和时期凯撒的名字命名的据称当年凯撒曾用此方法与其将军们进行联系。但是和所有的利用字母表进行替换的加密技术一样凯撒密码非常容易被破解而且在实际应用中也无法保证通信安全。现在给你一个已破解的凯撒密码明文与密文与一个有相同偏移量的未破解凯撒密码密文请你帮忙破解它。【输入】输入共三行第一行包含一个字符串表示已破解的凯撒密码明文第二行包含一个字符串表示已破解的凯撒密码密文第三行包含一个字符串表示待破解的凯撒密码密文。【输出】输出一行包含一个字符串表示待破解的凯撒密码对应的明文。【输入样例】ABCDEFGVWXYZ DEFGHIJYZABC WKHTXLFNEURZQIRAMXPSVRYHUWKHODCBGRJ【输出样例】THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG【算法标签】《洛谷 B4500 凯撒密码》 #字符串入门# #GESP# #2026#【代码详解】#includebits/stdc.h// 包含所有标准库头文件usingnamespacestd;// 使用标准命名空间string a,b,c;// 定义三个字符串a(明文1), b(密文1), c(要解密的字符串)intmain()// 主函数入口{// 输入a是已知明文b是已知密文c是要解密的密文cinabc;// 计算加密位移量b[0]和a[0]的ASCII码差值intdeltab[0]-a[0];// 调试输出可以取消注释查看delta的值// cout delta delta endl;// 遍历要解密的字符串c的每个字符for(inti0;ic.size();i){intnum;// 用于存储字符在字母表中的位置0-25// 处理小写字母if(islower(c[i])){// 计算小写字母在字母表中的位置a对应0numc[i]-a;}else// 处理大写字母{// 计算大写字母在字母表中的位置A对应0numc[i]-A;}// 进行解密计算减去位移量然后取模26确保在0-25范围内num(num-delta26)%26;// 调试输出可以取消注释查看解密后的位置// cout num num endl;// 将解密后的位置转换回字符if(islower(c[i])){// 还原为小写字母c[i]anum;}else{// 还原为大写字母c[i]Anum;}}// 输出解密后的字符串coutcendl;return0;// 程序正常结束}【运行结果】ABCDEFGVWXYZ DEFGHIJYZABC WKHTXLFNEURZQIRAMXPSVRYHUWKHODCBGRJ THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG