题解:P1079 [NOIP2012 提高组] Vigenère 密码
P1079 题解
本蒟蒻的第一篇题解。
大体思路:
先定义一个密钥
定义指针变量
-
如果
k_q 为大写,则遍历k_q - \texttt A 次; -
反之,遍历
k_q - \texttt a 次。
在每一次遍历中,
-
如果
M_i 为大写且M_i < \texttt A 时,M_i \gets \texttt Z ; -
如果
M_i 为小写且M_i < \texttt a 时,M_i \gets \texttt z 。
遍历完之后,变量
这样就可以把密文转化为明文。
示范代码:
#include<bits/stdc++.h>
using namespace std;
string k,s;//定义密钥字符串k和密文字符串s
int main() {
cin>>k>>s;//输入k和s
int q=0;//定义指针变量q
for(int i=0;i<s.size();i++){//遍历密文字符串
if(s[i]>='A'&&s[i]<='Z'){//判断密文大小写
int h=k[q]>='A'&&k[q]<='Z'?k[q]-'A':k[q]-'a';//判断密钥大小写,并求出遍历次数
for(int j=0;j<h;j++){//遍历还原
s[i]--;
if(s[i]<'A'){//特判,使变化符合规则
s[i]='Z';
}
}
}
if(s[i]>='a'&&s[i]<='z'){//与上面思路相同
int h=k[q]>='A'&&k[q]<='Z'?k[q]-'A':k[q]-'a';
for(int j=0;j<h;j++){
s[i]--;
if(s[i]<'a'){
s[i]='z';
}
}
}
q++;//指针指向下一位
if(q==k.size()){//特判,使指针回到开头
q=0;
}
}
cout<<s;//输出
return 0;
}