蓝桥杯 密码问题

Vigenère 密码问题
原题链接https://nanti.jisuanke.com/t/T2007
代码:#include
#include
#include
using namespace std;
void turn(char &x);
int main()
{
char key[1000],secret[1000];
int len1,len2;
int i,j;

gets(key);//输入密钥
gets(secret);//输入密文
len1=strlen(key);//求密钥长度
len2=strlen(secret);//求密文长度

for(i=0;i<len1;i++)//将密钥转换为大写字母
	turn(key[i]);

for(i=0,j=0;i<len2;i++)//从头开始解密
{
	if(secret[i]<='Z')//大写的情况

{
secret[i]=secret[i]-(key[j]-‘A’);//按规则解密
j++;
if(secret[i]<‘A’)//若明文小于A
secret[i]=‘Z’-(‘A’-secret[i])+1;//从字母表倒序转换
}
else//小写的情况
{
secret[i]=secret[i]-(key[j]-‘A’);//按规则解密
j++;
if(secret[i]<‘a’)//若明文小于a
secret[i]=‘z’-(‘a’-secret[i])+1;//从字母表倒序转换
}
if(j>len1-1)//若明文长度大于密钥长度,重复使用密钥
j=0;
}
cout<<secret<<endl;
return 0;
}
void turn(char &x)
{
if((x>=‘a’)&&(x<=‘z’))
x-=32;
}
思路:注:密文长度等于密钥长度
题中包含三个变量,密码,密钥,明文。
首先,将秘钥转化为大写字母(方便运算);
然后进入循环,逐位计算。循环中分两种情况计算:密文大写或密文小写。在两种情况里明文=密文-密钥+A;
而在密文大写的情况里,如果密文小于大写字母A,则明文=Z-A+密文+1(从字母倒序排列);在密文小写情况里,如果密文小于小写字母a,明文=z-a+密文+1;
在循环的最后,如果明文长度大于密钥长度,重复使用密钥。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值