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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值