PAT 凯撒密码 (20 分)

为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于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;
}
上一篇:phpcms前端页面上传文件


下一篇:从0开始刷PAT乙级-1.卡拉兹(Callatz)猜想