本题的重点是理解清楚题意并能代码模拟。形式是二战德国密码机,和数据结构、算法几乎没有联系。
1 #include <stdio.h> 2 #include <string.h> 3 4 int main(){ 5 char rotor[30],cryp[1000]; 6 int i,j,blank=0,num=1,m,n,temp[26],tran[3][26]; 7 while(scanf("%d", &m)>=0&&m){ 8 if(blank) 9 printf("\n"); 10 else 11 blank=1; 12 printf("Enigma %d:\n",num++); 13 for(i=0;i<3;i++){ 14 scanf("%s",rotor); 15 for(j=0;j<m;j++){ 16 temp[j] = (int)(rotor[j]-‘A‘)-j; 17 tran[i][(j+temp[j])%m]=temp[j]; 18 } 19 } 20 scanf("%d", &n); 21 int lp0,lp1,lp2,t,len; 22 for(i=0;i<n;i++){ 23 lp0=lp1=lp2=0; 24 scanf("%s",cryp); 25 len=strlen(cryp); 26 for(j = 0; j < len; j++){ 27 t = cryp[j] - ‘A‘; 28 t -= tran[2][(t + lp2) % m]; 29 t = (t + m) % m; 30 t -= tran[1][(t + lp1) % m]; 31 t = (t + m) % m; 32 t -= tran[0][(t + lp0) % m]; 33 t = (t + m) % m; 34 printf("%c", t+‘a‘); 35 lp0 = (lp0 + m - 1) % m; 36 if((j+1) % m == 0) 37 lp1 = (lp1 + m - 1) % m; 38 if((j+1) % (m*m) == 0) 39 lp2 = (lp2 + m - 1) % m; 40 } 41 printf("\n"); 42 } 43 } 44 return 0; 45 }
时间: 2024-10-18 03:19:24