背景(我由于不知道如何在洛谷上交题解,就跑这来了,好啦,废话不多说了)
题目描述
小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会。
在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概论中取得过好成绩后,主任又额外交给她一项任务,解密抗战时期被加密过的一些伤员的名单。
经过研究,小英发现了如下加密规律(括号中是一个“原文 → 密文”的例子)
-
原文中所有的字符都在字母表中被循环左移了三个位置(bcd→yzabcd→yza)
-
逆序存储(abcd→dcbaabcd→dcba)
-
大小写反转(abXY→ABxyabXY→ABxy)
现在给出一个加密的字符串,请你将其解密。
输入格式
一个加密的字符串。(长度小于 5050 且只包含大小写字母)
输出格式
输出解密后的字符串。
输入输出样例
输入 #1
GSOOWFASOq
输出 #1
Trvdizrrvj
解题思路:记得看清题目要求,输入时是加完密的,输出时 要求是解密的,那么第一个步骤就是把加完密的字符串都向后移三个,第二个是反转字符串,你可以再定义一个字符串来存上一个字符串的倒序,第三个就是将小写字母转化为大写字母,他们之间相差32哦(五颜六色,好看的很)
提醒,在第二个步骤中再创一个字符串,需要用到这个s1.resize(s.length());,这行代码的意思就是开创一个字符串s1,它的大小与s一样大,对了我用的是string,别的就无需多言了,上代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s,s1;
int k=0;
cin>>s;
s1.resize(s.length());
for (int i = 0; i < s.size(); i++) //第一个for循环是用来使所有字符都向后移三个
{
if(s[i]>='a'&&s[i]<='w')
s[i]=s[i]+3;
else if(s[i]=='x')
s[i]='a';
else if(s[i]=='y')
s[i]='b';
else if(s[i]=='z')
s[i]='c';
else if(s[i]>='A'&&s[i]<='W')
s[i]=s[i]+3;
else if(s[i]=='X')
s[i]='A';
else if(s[i]=='Y')
s[i]='B';
else if(s[i]=='Z')
s[i]='C';
}
for(int i=s.size()-1;i>=0;i--)//第二个for循环是 实现翻转功能
s1[k++]=s[i];
for(int i=0;i<k;i++)//第三个for循环是实现大小写转化
{
if(s1[i]>='a'&&s1[i]<='z')
s1[i]-=32;
else if(s1[i]>='A'&&s1[i]<='Z')
s1[i]+=32;
}
cout << s1 << endl;
return 0;
}