题目描述
有一位法国外交家发明了一种神奇的算法明文是M,密钥是k,密文是C。加密规则如下:
c[i]=m[i]@k[i]
加密注意点;
1、加密时忽略明文和密钥的大小写,并在密文中保持明文的大小写
2、当明文M的长度大于密钥K的长度时,K可以被循环使用。
例如,明文 M=Helloworld,密钥 k=abc 时,密文 C=Hfnlpyosnd
输入格式
输入共2行。
第一行为一个字符串,表示密钥k,长度不超过100,其中仅包含大小写字母。第二行为一个字符串,表示经加密后的密文,长度不超过1000,其中仅包含大小写字母。
输出格式
输出共1行,一个字符串,表示输入密钥和密文所对应的明文。
输入样例 复制
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
输出样例 复制
Wherethereisawillthereisaway
完整代码
加密方式是对应右移x为,这个x就是对应秘钥字母到‘a’的距离。解密自然就是左移了。
#include<bits/stdc++.h>
using namespace std;
int main(){
//freopen("/config/workspace/test/test","r",stdin);
string k;
cin>>k;
string m;
cin>>m;
for(int i=0;i<k.length();i++){
if(k[i]>='A'&&k[i]<='Z'){
k[i]=k[i]-('A'-'a');
}
}
//cout<<k<<endl;
int index=0;
char res[1000];
for(int i=0;i<m.length();i++){
if(m[i]>='a'&&m[i]<='z'){
res[i]='a'+(26+(m[i]-'a')-(k[(index++)%k.length()]-'a'))%26;
//cout<<('a'+((m[i]-'a')-(k[(index++)%k.length()]-'a'))%26)<<endl;
}else{
res[i]='A'+(26+(m[i]-'A')-(k[(index++)%k.length()]-'a'))%26;
//cout<<('A'+((m[i]-'A')-(k[(index++)%k.length()]-'a'))%26)<<endl;
}
}
for(int i=0;i<m.length();i++){
cout<<res[i];
}
return 0;
}