在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用 C 表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为 k。 研究了一种简单的加密算法,用来处理只包含大小写英文字符的字符串: 将字符串中的字母替换为按字母表顺序向前移动 k 位之后的字母,如果超出字母表,则转回到最后一个字母。 例如,当 k = 4 时,字母 E 以字母 A 代替,字母 b 以字母 x 代替,字母 I 以字母 E 代替。因此单词 EbI 经过加密之后为 AxE。 现在,给定一个字符串 M,请你输出加密后的字符串 C。
我的代码
using namespace std;
char a[26] = {'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 'o' , 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' , 'x' , 'y' , 'z'};
char A[26] = {'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'Q' , 'R' , 'S' , 'T' , 'U' , 'V' , 'W' , 'X' , 'Y' , 'Z'};
int main(){
int k , g;
string m;
int h = k % 26;
cin >> m >> k;
for(int i = 0; i < m.size(); i++){
for(int j = 1; j <= 26; j++){
if(m[i] >= 'A' and m[i] <= 'Z'){
if(m[i] == A[j]){
g = j;
break;
}
} else {
if(m[i] == a[j]){
g = j;
break;
}
}
}
if(g - h >= 0){
if(m[i] >= 'A' and m[i] <= 'Z') m[i] = A[i - h];
else m[i] = a[i - h];
} else {
if(m[i] >= 'A' and m[i] <= 'Z') m[i] = A[26 - (h - g)];
else m[i] = a[26 - (h - g)];
}
}
cout << m << endl;
}