1 #include <iostream>
 2 #include <cmath>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <ctime>
 8 #include <cstdlib>
 9 using namespace std;
10 //------------------------------------------------------------------------------
11 char c[1020], k[120], m[1020]; //c[]表示密文 k[]表示密钥 m[]表示明文
12 int c1[1020], k1[120], m1[1020]; // 转换过来后;
13 int len[3];     //注意数组是左闭右开的,所以取len[2]只能用len[0],len[1]表示,而不是len[1],len[2];
14 string str1,str2;
15 //-----------------------------------------------------------------------------
16 void convert()
17 {
18 for (int i=0; i<len[2]; i++)
19 {
20 if(c[i]>='a' && c[i]<='z') c1[i]=c[i]-'a'; //c1[]存储差值
21 if(c[i]>='A' && c[i]<='Z') c1[i]=c[i]-'A';
22 if(i<=len[1])
23 {
24 if(k[i]>='a' && k[i]<='z') k1[i]=k[i]-'a';
25 if(k[i]>='A' && k[i]<='Z') k1[i]=k[i]-'A';
26 }
27 }
28 }
29 
30 void vigenere()
31 {
32 for (int i=0; i<len[2]; i++)
33 m1[i]=(c1[i]-k1[i%len[1]]+26)%26;
34 }
35 
36 void unconvert()
37 {
38 for (int i=0; i<len[2]; i++)
39 {
40 if(c[i]>='a' && c[i]<='z') m[i]=m1[i]+'a';
41 if(c[i]>='A' && c[i]<='Z') m[i]=m1[i]+'A';
42 }
43 }
44 int main()
45 {
46 //freopen("vigenere.in","r",stdin);
47 //freopen("vigenere.out","w",stdout);
48 cin>>str1;
49 cin>>str2;
50 len[1]=str1.size();
51 len[2]=str2.size();
52 for(int i=0;i<len[1];i++)
53 k[i]=str1[i];
54 for(int i=0;i<len[2];i++)
55 c[i]=str2[i];
56 convert();
57 vigenere();
58 unconvert();
59 for (int i=0; i<len[2]; i++)
60 cout<<m[i];
61 return 0;
62 }

 

posted on 2012-12-26 20:05  回眸只为搏笑  阅读(260)  评论(0)    收藏  举报