zoj1006

来源:互联网 发布:photoshopcs4软件下载 编辑:程序博客网 时间:2024/06/16 09:37

这是一道有关加密解密的题目,一开始读题不是很仔细看成了单纯的加密题目,最后做出来发现样例都跑反了,再看一眼题目发现是给我们密文,要求写出明文,一开始还以为要用到逆元之类的东西,后面发现原来只要plaincode[k*i%str1.size()]=ciphercode[i]+i;
然后把plaincode保持在0-27之间的大小就可以了。

#include<iostream>#include<stdio.h>#include<math.h>#include<cstring>#include<map>using namespace std;map<char ,int > Map;map<char ,int >::iterator it;int  plaincode[100];int ciphercode[100];int main(){//  freopen("input.txt","r",stdin);    for(int i=0;i<=27;i++){        if(i==0) Map['_']=0;        else if(i==27) Map['.']=27;        else Map['a'+i-1]=i;    }    string str1,str2;    int k;    while(cin>>k&&k){        cin>>str1;        for(int i=0;i<str1.size();i++){            it=Map.find(str1[i]);                       ciphercode[i]=it->second;        }        for(int i=0;i<str1.size();i++){            plaincode[k*i%str1.size()]=ciphercode[i]+i;            while(plaincode[k*i%str1.size()]>=28) {                plaincode[k*i%str1.size()]-=28;            }    //      cout<<plaincode[i]<<endl;        }        int j=0;        for(int i=0;i<str1.size();i++)        {            for(it=Map.begin();it!=Map.end();it++){                if(it->second==plaincode[i]) {                    cout<<it->first;                    break;                }            }        }        cout<<endl;    }}
0 0
原创粉丝点击