这个题的思路并不算太难,主要是®运算的转化
®运算可以转化成一张由字母的ASCII码与A的ASCII码的差值组成的表格
我们会发现,密钥的ASCII码和A的ASCII码的差值(简称ki好了)(同理明文的叫mi,密文的叫ci),这个东西,它符合一个规律:ci=ki+mi,所以想得到mi,只需ci-ki,而明文就是ci-ki+A的ASCII码,也就是密文的ASCII码-密钥的ASCII码+A的ASCII码(大家都能化简的,相信我~~看我真诚的大眼睛~~)
后面的你们都能看懂了
```cpp
#include<bits/stdc++.h>
using namespace std;
void turn(char &x);
int main()
{
char k[1000],C[1000];//定义密钥k和密文C
int len1,len2;
int i,j;
gets(k);//读入密钥
gets(C);//读入密文
len1=strlen(k);
len2=strlen(C);
for(i=0;i<len1;i++)
turn(k[i]);//将密钥转化为大写,方便运算
for(i=0,j=0;i<len2;i++)
{
if(C[i]<='Z')//判断原字母大小写
{
C[i]=C[i]-(k[j]-'A');//进行运算,得到原明文
j++;//这是一个指针,记录现在是密钥的第几位
if(C[i]<'A')
C[i]='Z'-('A'-C[i])+1;//转换回原大小写
}
else
{
C[i]=C[i]-(k[j]-'A');
j++;
if(C[i]<'a')
C[i]='z'-('a'-C[i])+1;
}
if(j>len1-1)//如果到了最后一位,重新开始
j=0;
}
cout<<C<<endl;//输出明文
return 0;
}
void turn(char &x)//大小写转换
{
if((x>='a')&&(x<='z'))
x-=32;
}
```