题解 | #[NOIP2012]Vigenère 密码#

题解那栏显示网络错误交不上去,发个讨论试试)

先上代码

# 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')
全部评论
点赞 回复 分享
发布于 2024-10-20 17:09 海南

相关推荐

猫头夜鹰:图书管理系统能有面试就怪了,放十年前都不行
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
3
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务