为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。
输入格式:
输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个整数offset。
输出格式:
输出加密后的结果字符串。
输入样例1:
Hello Hangzhou
2
输出样例1:
Jgnnq Jcpibjqw
输入样例2:
a=x+y
-1
输出样例2:
z=w+x
本题关键在于对a/A的大小写字母的循环替换
那么我们如何替换呢?首先,用当前字母减去其对应的大小写最前位,大写字母'A',小写-‘a',这样我们就得到了该字母的位置(位于第几个),然后让该字母加上偏移量x。注意当加上x时可能会超过26个字母,所以需要%26,这样后再加上他的最前位,结果就出来了。
细节:如果偏移量x为负数的话,那么我们通过简单的数字循环可以知道,-1等同于25,所以只要找到x对应在0-26的位置即可,所有让它一直加上26直到它为正数。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
string s;
int x;
getline(cin,s);
cin >> x;
while(x<0) x += 26;
if(x>26) x %= 26;
for(auto &c:s)
if(c>='a'&&c<='z') c=(c-'a'+x )%26+'a';
else if (c>='A'&&c<='Z') c=(c-'A'+x)%26+'A';
cout << s <<endl;
return 0;
}