题解那栏显示网络错误交不上去,发个讨论试试)
先上代码
# include <bits/stdc++.h>
using namespace std;
int main()
{
string k,s;
cin>>k>>s;
string K="";
string ans="";
int SSRK[2000] = {0};
int lens = s.length(); //明文长
int lenk = k.length(); //密钥长
for(int i=0;i<lens;i++){ //新的密钥,一对一匹配
K += k[i%lenk];
}
for(int i=0;i<lens;i++){ //全部把密钥改成数字
if(K[i]>'Z') SSRK[i]=K[i] - 'a';
else SSRK[i] = K[i] - 'A';
}
for(int i=0;i<lens;i++){
int j=0;
if(s[i]>'Z'){ //如果是小写字母
j = (s[i]-'a'-SSRK[i]+26)%26;
cout<<char(j+'a');
}
else {//大写字母
j=(s[i]-'A'-SSRK[i]+26)%26;
cout<<char(j+'A');
}
}
return 0;
}
k:密钥 s:明文 lenk:密钥长 lens:明文长 K:长度相等的密钥 SSRK:最终数字版密钥
先将密钥的长度对其明文的长度
for(int i=0;i<lens;i++) K += k[i%lenk];
然后将所有的密钥改成数字形式,大小写分开讨论:
for(int i=0;i<lens;i++){ //全部把密钥改成数字
if(K[i]>'Z') SSRK[i]=K[i] - 'a';
else SSRK[i] = K[i] - 'A';
}
最后对于每一个明文字符,先进行数字运算,将明文变成数字
s[i]-'a' //如果是小写字母
从上一步得到的偏移量(数字)中减去对应的密钥字符(已经被转换成数字形式)的值。这个操作实际上是在执行解密过程,即反向移动字母的位置。
- SSR[i]
为了确保即使在减法后结果变成负数,也可以通过模运算得到正确的正数索引。
+ 26)%26
将数字形式重现字母,输出
cout<<char(j+'a')