• 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;
    }
  • 相关阅读:
    PHP的五大运行模式
    PHP设计模式-工厂模式
    php+redis实现消息队列
    面试题一
    Linux常用命令
    实现session在多台服务器上共享
    Memcache和redis的区别
    PHP设计模式-建造者模式
    FASTCgi和PHP-fpm关系
    安装vm虚拟机
  • 原文地址:https://www.cnblogs.com/zbsy-wwx/p/11680513.html
Copyright © 2020-2023  润新知