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 }
浙公网安备 33010602011771号