注意點:
- 寫完一段代碼後應當先進行一次靜態查錯.
#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;
}