本文主要是介绍P1079 Vigenère 密码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目地址
注意点:
- 写完一段代码后应当先进行一次静态查错.
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN=2e3;
bool isCapital(char val){//是否大写 if(val>='A'&&val<='Z')return 1;else return 0;
}
char toUpperCase(char val){//转换为大写 if(isCapital(val))return val;return (val-32);
}
char toLowwerCase(char val){if(!isCapital(val))return val;return (val+32);
}
char vigenere[52][52];//密码表(key 密文)
void init(){//初始化密码表 for(int i='A';i<='Z';i++){//列 int nowI=i-'A';for(int j='A';j<='Z';j++){//行 int nowJ=j-'A';vigenere[nowI][nowJ]='A'+nowI+nowJ;if(vigenere[nowI][nowJ]>'Z')vigenere[nowI][nowJ]-=26;}}
}
char getClearText(char key,char nowCipherChar){//通过密钥和密文获取明文 bool isCap=isCapital(nowCipherChar);//密文是否为大写 char cipher=toUpperCase(nowCipherChar);key=toUpperCase(key);char nowVal;for(int j='A'-'A';j<='Z'-'A';j++){nowVal=vigenere[key-'A'][j];if(nowVal==cipher){nowVal=j+'A';break;}}if(isCap)return nowVal;else return toLowwerCase(nowVal);
}
char keyText[MAXN],cipherText[MAXN],clearText[MAXN];
int main(){init();cin>>keyText>>cipherText;int keyUseCnt=0;//密码使用次数 for(int i=0;i<strlen(cipherText);i++){int nowVal=cipherText[i];keyUseCnt%=strlen(keyText);int nowKey=keyText[keyUseCnt];cout<<getClearText(nowKey,nowVal);keyUseCnt++;}cout<<endl;return 0;
}
这篇关于P1079 Vigenère 密码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!