考試時間為4小時。
所填寫的代碼不超過一條語句(即不能出現分號)。
考生的程序只有能運行出正確結果的時候才有機會得分。
選手的程序必須是通用的,不能只對試卷中給定的數據有效。
不能使用c++特性
1. 代碼填空 (滿分3分)
神秘的三位數
有這樣一個3位數,組成它的3個數字階乘之和正好等於它本身。即:abc = a! + b! + c!下面的程序用於搜索這樣的3位數。請補全缺失的代碼。
1 /* 2 參考答案: 3 x > 0 4 5 或者 0<x 6 或者 x 7 */ 8 9 10 #include "stdafx.h" 11 12 int main(int argc, char* argv[]) 13 {//這個程序主要就是把0到9的階乘存在了數組里 14 int JC[] = {1,1,2,6,24,120,720,5040,40320,362880}; 15 int i; 16 for(i=100; i<1000; i++) 17 { 18 int sum = 0; 19 int x = i; 20 while(x>0) // 填空 21 { 22 sum += JC[x%10]; 23 x /= 10; 24 } 25 if(i==sum) printf("%d\n", i); 26 } 27 28 return 0; 29 }
2. 代碼填空 (滿分4分)
歌賽新規則
歌手大賽的評分規則一般是去掉一個最高分,去掉一個最低分,剩下的分數求平均。當評委較少的時候,如果我們只允許去掉一個分數,該如何設計規則呢? 有人提出:應該去掉與其余的分數(還是他自己的分數不是其他選手,從下面的代碼可以看出double t = x[i] - sum / (n-1),而且題目是針對某一個選手說的,原來理解錯了)平均值相差最遠的那個分數。即“最離群”的分數。 以下的程序用於實現這個功能。其中x存放所有評分,n表示數組中元素的個數。函數返回最“離群”的那個分數值。
1 /* 2 答案:j != i 3 4 注意邏輯等價形式 5 i != j 6 i-j != 0 7 i-j (比較變態) 8 */ 9 10 #include "stdafx.h" 11 12 double score(double x[], int n) 13 { 14 int i,j; 15 double dif = -1; 16 double bad; 17 for(i=0; i<n; i++) 18 { 19 double sum = 0; 20 for(j=0; j<n; j++)//想想這個求和為什么每次都要執行呢,就是因為是其余數的平均數 21 { 22 if( j != i ) sum += x[j];//填空 23 } 24 double t = x[i] - sum / (n-1); 25 if(t<0) t = -t; 26 if(t>dif) 27 { 28 dif = t; 29 bad = x[i]; 30 printf("%d, %f\n", i, x[i]); 31 } 32 } 33 34 return bad; 35 } 36 37 38 39 int main(int argc, char* argv[]) 40 { 41 double x[] = {40,20,30,10,60}; 42 printf("%f\n", score(x,5)); 43 44 return 0; 45 }
3. 代碼填空 (滿分4分)
反轉串
我們把“cba”稱為“abc”的反轉串。 下面的代碼可以把buf中的字符反轉。其中n表示buf中待反轉的串的長度。請補充缺少的代碼。
1 /* 2 答案:reverse_str(buf+1,n-2) 3 4 注意數組與指針的語法等價性: 5 buf + 1 等價 &buf[1] 6 7 reverse_str(++buf,n-2) (比較變態) 8 */ 9 10 11 #include "stdafx.h" 12 13 void reverse_str(char* buf, int n) 14 { 15 if(n<2) return; 16 char tmp = buf[0]; 17 buf[0] = buf[n-1]; 18 buf[n-1] = tmp; 19 /* 20 這個空,題目上說的是“其中n表示buf中待反轉的串的長度”,直覺告訴我應該填如下的答案,可是一會覺得reverse_str(buf+1,n-1) 21 才合適 ,轉念再一想buf表示的是數組的首地址,自增后 數組等於說是從第二個位置開始啦,原來第一個元素的內存地址找不到了 ,這時必需要知道的是數組的長度 ,(n-1) 22 並不是數組的最后一個位置,因為數組的首地址已經變啦,若是想用起始地址來表示,則 reverse_str(buf,start+1,end-1) 23 */ 24 reverse_str(buf+1,n-2); // 填空,第二次做的時候第二個空又填寫成了n-1,沒運行,看來每道題必須都要運行 25 } 26 27 28 int main(int argc, char* argv[]) 29 { 30 char x[] = "1234567"; 31 reverse_str(x, 7); 32 printf("%s\n", x); 33 while(1); 34 35 return 0; 36 }
4. 代碼填空 (滿分5分)
n進制小數
將任意十進制正小數分別轉換成2,3,4,5,6,7,8,9進制正小數,小數點后保留8位,並輸出。例如:若十進制小數為0.795,則輸出: 十進制正小數 0.795000 轉換成 2 進制數為: 0.11001011 十進制正小數 0.795000 轉換成 3 進制數為: 0.21011011 十進制正小數 0.795000 轉換成 4 進制數為: 0.30232011 十進制正小數 0.795000 轉換成 5 進制數為: 0.34414141 十進制正小數 0.795000 轉換成 6 進制數為: 0.44341530 十進制正小數 0.795000 轉換成 7 進制數為: 0.53645364 十進制正小數 0.795000 轉換成 8 進制數為: 0.62702436 十進制正小數 0.795000 轉換成 9 進制數為: 0.71348853 以下代碼提供了這個功能。其中,dTestNo表示待轉的十進制小數。iBase表示進制數。
1 /* 2 答案: 3 空1: (int)dTestNo (2分) 4 空2: dTestNo>=1.0 (3分) 5 6 注意等價形式,如不能判定,代入程序進行運行試驗 7 */ 8 9 #include "stdafx.h" 10 11 void fun(double dTestNo, int iBase) 12 { 13 int iT[8]; 14 int iNo; 15 16 printf("十進制正小數 %f 轉換成 %d 進制數為: ",dTestNo, iBase); 17 18 for(iNo=0;iNo<8;iNo++) 19 { 20 dTestNo *= iBase; 21 iT[iNo] = (int)dTestNo; // 填空1,這個填對了,不過當時還有些小懷疑 ,第二次做的時候,第二個空我知道意思,就是看是否有整數部分,寫成了dTestNo!=0,未注意是double 22 if(dTestNo>=1.0) dTestNo -= iT[iNo]; // 填空2,這個判斷是否有整數部分,我寫的是 (dTestNo> iT[iNo],帶入了也可以,后邊的自動轉為double) 23 } 24 25 printf("0."); 26 for(iNo=0; iNo<8; iNo++) printf("%d", iT[iNo]);//小數部分:成基數取整正排列 27 printf("\n"); 28 } 29 30 int main (int argc, char* argv[]) 31 { 32 double dTestNo= 0.795; 33 int iBase; 34 35 for(iBase=2;iBase<=9;iBase++) 36 fun(dTestNo,iBase); 37 while(1); 38 printf("\n"); 39 40 return 0; 41 }
5. 代碼填空 (滿分6分)
輪換
串“abcd”每個字符都向右移位,最右的移動到第一個字符的位置,就變為“dabc”。這稱為對串進行位移=1的輪換。同理,“abcd”變為:“cdab”則稱為位移=2的輪換。 下面的代碼實現了對串s進行位移為n的輪換。請補全缺失的代碼。
1 /* 2 答案: 3 空1: len+1 (2分) 4 空2: 0 (4分) 5 6 注意: 7 空2 等價形式,可以是: 8 '\0' 9 (char)0 10 NULL 11 12 如不能斷定,需要代入測試 13 比如: 14 空2:s[len] 就比較變態,但可行。 15 */ 16 17 #include "stdafx.h" 18 #include "string.h" 19 #include "stdlib.h" 20 21 //以前做過這道題,不過用的是分治,兩部分先分別倒轉,最后再倒轉 22 void shift(char* s, int n) 23 { 24 char* p; 25 char* q; 26 int len = strlen(s); 27 if(len==0) return; 28 if(n<=0 || n>=len) return; 29 30 char* s2 = (char*)malloc(len+1); // 填空1,不太明白,而且感覺設置這個空沒什么意義,一般要超越10% ,因為長度不包括'\0' 31 p = s; 32 q = s2 + n % len;//從q的定義看出,貌似功能是從q開始把前半段存入,從下面while的功能看出我的猜測是對的,哈哈……。 33 while(*p) 34 { 35 *q++ = *p++;//*和++優先級相同且結合方向均是自右向左,所以 *q++等價於*(q++) 36 if(q-s2>=len)//q到底;兩個指向數組的指針相減后是個實數 37 { 38 //注意該語句塊內沒有break,執行if時q到頭了,而p並沒有到頭 39 *q = 0;// 填空2,'\0' , (char)0 , NULL 40 q = s2;//p並沒有到頭,所以下次繼續執行while 41 //p不變 42 } 43 } 44 strcpy(s,s2); 45 free(s2); 46 } 47 48 int main(int argc, char* argv[]) 49 { 50 char x[] = "abcdefg"; 51 shift(x,2); 52 printf("%s\n", x);// 原來是x,最后輸出的還是x,說明對x傳址調用。 53 while(1); 54 return 0; 55 }
6. 代碼填空 (滿分9分)
中獎計算
某抽獎活動的規則是:每位參與者在紙上寫下一個8位數的號碼。最后通過搖獎的辦法隨機產生一個8位數字。參與者寫下的數字中最多有多少個連續位與開獎號碼中的相同,則稱為中了幾個號。 例如:小張寫的數字是:12345678,而開獎號碼是:42347856。則稱小張中了3個號,因為其中最長的相同連續位是:“234”(不僅要相同,而且要位置相同)。如果小張寫的是:87654321,則他只中了一個號。 下面的代碼根據傳入的參數,返回中了幾個號。其中:a表示被評價的號碼,b表示搖號產生的數字。
1 /* 2 參考答案: 3 空1:sa[i+j] (4分) 4 空2:n = j (5分) 5 6 注意,指針與數組形式的等價性。 7 *(sa+i+j) 是一樣的 8 */ 9 10 11 #include <cstdio> 12 #include <string.h> 13 using namespace std; 14 15 int g(int a, int b) 16 { 17 char sa[]="00000000"; 18 char sb[]="00000000"; 19 int n = 0; 20 int i,j; 21 22 sprintf(sa,"%8d",a);//在stdio頭文件里 23 sprintf(sb,"%8d",b); 24 for(i=0; i<8; i++)//后面的是中獎號碼 25 { 26 for(j=1; j<=8-i; j++)//j表示以i開頭共幾個相同數字(包括位置相同) 27 { 28 char t = sa[i+j]; // 填空1,以前沒看懂,現在知道了,sa[i+j]就是設置字符串結束標志,理解了這個就好辦了 29 sa[i+j] = 0; 30 if(strstr(sb, sa+i))//sb表示中獎號碼, 31 { 32 if(j>n) n = j; // 填空2,返回的是n,而其他地方都沒有n相關,所以該式子必是n = ? 33 } 34 sa[i+j] = t; 35 } 36 } 37 38 return n; 39 } 40 41 42 int main(int argc, char* argv[]) 43 { 44 printf("%d\n", g(12345678,42234566));//后面的是中獎號碼 45 printf("%d\n", g(12345678,12345678)); 46 while(1); 47 return 0; 48 }
7. 代碼填空 (滿分10分)
概率問題
某個袋子中有紅球m個,白球n個。現在要從中取出x個球。那么紅球數目多於白球的概率是多少呢? 下面的代碼解決了這個問題。其中的y表示紅球至少出現的次數。 這與前文的問題是等價的。因為如果取30個球,要求紅球數大於白球數,則等價於至少取出16((30+1)/2,不管奇偶這個 都是較大者)個紅球。請根據僅存的線索,判斷程序邏輯,並補全缺少的代碼。
1 /* 2 這個題是要考數學的,確實沒做出來 ,說實話我連遞歸剛開始都沒想起來 ,認為 3 空處是xy的某個公式,反正必和xy有關;后來想想應該是遞歸,因為那幾個return要么是0 要 4 么是1而實際上概率取二者之間的值,所以是遞歸。 5 */ 6 /* 7 參考答案: 8 空1:pro(m-1,n,x-1,y-1) (5分) 9 空2:pro(m,n-1,x-1,y) (5分) 10 11 未知答案代入試驗一下(多試驗幾個樣例) 12 */ 13 14 #include "stdafx.h" 15 16 /* 17 m: 袋中紅球的數目 18 n: 袋中白球的數目 19 x: 需要取出的數目 20 y: 紅球至少出現的次數 21 */ 22 double pro(int m, int n, int x, int y) 23 { 24 if(y>x) return 0; 25 if(y==0) return 1;//由於y==0說明下面有y自減 26 if(y>m) return 0; 27 if(x-n>y) return 1; 28 double p1 = pro(m-1,n,x-1,y-1); // 填空1 29 double p2 = pro(m,n-1,x-1,y); // 填空2,從下面的語句里可看出p2是要取出一個白球,且是無重復,所以mn需要變化 30 return (double)m/(m+n) * p1 + (double)n/(m+n) * p2; 31 } 32 33 34 int main(int argc, char* argv[]) 35 { 36 printf("%f\n",pro(5,5,3,1)); 37 while(1); 38 return 0; 39 }
下面的題目都是編程題,沒有標准答案,只有測試用例。
8. 程序設計(滿分15分)
方陣的主對角線之上稱為“上三角”。 請你設計一個用於填充n階方陣的上三角區域的程序。填充的規則是:使用1,2,3….的自然數列,從左上角開始,按照順時針方向螺旋填充。
例如:當n=3時,
輸出:
1 2 3
6 4
5
當n=4時,
輸出:
1 2 3 4
9 10 5
8 6
7 當n=5時,輸出: 1 2 3 4 5 12 13 14 6 11 15 7 10 8 9 程序運行時,要求用戶輸入整數n(3~20) 程序輸出:方陣的上三角部分。 要求格式:每個數據寬度為4,右對齊
數據寬度不是4,扣3分(不重復扣分) 沒有右對齊,扣2分(不重復扣分) 本題分數扣完為止
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 //正螺旋陣 7 void solve_square(int str[][30],int n)//不可int *str[]編譯錯誤,要么這樣,要么全局 8 { 9 int i,j,k,t; 10 int x = 0;//圈數 11 int num = 1; 12 for(x=0; x<(n+1)/2; x++)//用i表示易出現理解錯誤 13 { 14 //正橫向 15 for(i=x; i<n-x; i++) 16 str[x][i] = num++; 17 //正豎向 18 for(j=x+1; j<n-x; j++) 19 str[j][n-1-x]= num++; 20 //逆橫向 21 for(k=n-x-2; k>=x; k--) 22 str[n-1-x][k] = num++; 23 for(t=n-x-2; t>=x+1; t--) 24 str[t][x] = num++; 25 } 26 } 27 28 void solve_tri(int str[][30],int n) 29 { 30 int i,j,k,t; 31 int x = 0;//圈數 32 int num = 1; 33 //用i表示易出現理解錯誤 ,n = 1 2 3,x = 1,推出來的 34 for(x=0; x<(n+2)/3; x++) 35 { 36 for(i=x; i<=n-1-2*x; i++) 37 str[x][i] = num++; 38 for(j=x+1; j<n-2*x; j++) 39 str[j][n-1-x-j]= num++;//下標相加為(n-1-x-j) 40 for(k=n-2-2*x; k>x; k--) 41 str[k][x] = num++; 42 } 43 } 44 45 void show_tri(int arr[][30], int n) 46 { 47 int i,j; 48 for(i=0; i<n; i++) 49 { 50 for(j=0; j<n-i; j++) 51 printf("%4d",arr[i][j]); 52 cout<<endl; 53 } 54 } 55 56 void show_square(int arr[][30],int n) 57 { 58 int i,j; 59 for(i=0; i<n; i++) 60 { 61 for(j=0; j<n; j++) 62 printf("%4d",arr[i][j]); 63 cout<<endl; 64 } 65 } 66 67 int main() 68 { 69 int i,j,k; 70 int n; 71 int arr[30][30]; 72 cout<<"Input a Integer:"<<endl; 73 while(cin>>n&&n) 74 { 75 memset(arr,0,sizeof(arr)); 76 cout<<"----正螺旋----"<<endl; 77 solve_square(arr,n); 78 show_square(arr,n); 79 cout<<"----上三角螺旋----"<<endl; 80 solve_tri(arr,n); 81 show_tri(arr,n); 82 cout<<"Input a Integer:"<<endl; 83 } 84 return 0; 85 }
1 //不知道為什么錯 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <cstdlib>//包含malloc,但報錯說dev沒有 malloc頭文件 6 using namespace std; 7 8 void free_ptr(int **ptr, int N) 9 { 10 int i,j,k; 11 for(i=0; i<N; i++) 12 { 13 free(ptr[i]); 14 ptr[i] = NULL; 15 } 16 free(ptr); 17 ptr = NULL; 18 } 19 20 void fun(int *pointer[],int from,int to,int num,int n) 21 { 22 int i,j,k; 23 if(n<=0) 24 return ; 25 for(j=0; j<n-1; j++) 26 { 27 if(pointer[0][j]) 28 return ; 29 pointer[0][j] = num++; 30 31 } 32 j = n - 1, i = 0; 33 for(; i<n&&j>=0; i++,j--) 34 { 35 if(pointer[i][j]) 36 return ; 37 if(i+j==n-1) 38 pointer[i][j] = num++; 39 } 40 for(i=n-2; i>=1; i--) 41 { 42 if(pointer[i][0]) 43 return ; 44 pointer[i][0] = num++; 45 } 46 fun((int **)(pointer+(from+1)*n+to+1),from+1,to+1,num,n-3); 47 //fun(((int **)(pointer+from+1)+to+1),from+1,to+1,num,n-3); 48 } 49 50 int main() 51 { 52 int i,j,k,t; 53 int **ptr; 54 int N; 55 cout<<"Input a Integer:"<<endl; 56 while(cin>>N) 57 { 58 ptr = (int **)malloc(sizeof(int *)*(N+5)); 59 if(NULL==ptr) 60 return 1; 61 for(i=0; i<N; i++) 62 { 63 ptr[i] = (int *)malloc(sizeof(int)*(N+5)); 64 if(NULL==ptr[i]) 65 return 1; 66 } 67 for(i=0; i<N; i++) 68 for(j=0; j<N; j++) 69 ptr[i][j] = 0; 70 fun(ptr,0,0,1,N); 71 for(i=0; i<N; i++) 72 { 73 for(j=0; j<N-i; j++)//若是j<N,則if(0==ptr[i][j]) continue; 74 { 75 printf("%4d",ptr[i][j]); //%4d后不可加空格啦 ,%-4d則是左對齊 76 } 77 cout<<endl; 78 } 79 free_ptr(ptr,N); 80 } 81 return 0; 82 }
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 int n; 6 int a[25][25]; 7 8 void solve() 9 { 10 int i,j,k; 11 int cnt = 1; 12 memset(a,0,sizeof(a)); 13 /* 14 這是第二次做的,做了好久發現了錯誤三個內層for循環的i都要乘以2,比如若是n=5,則第二次第一個內層for填的13,若不乘2 15 14也填了。 16 第二種方法,加上 if(!a[i][j])if(!a[k][j])if(!a[j][i])而不用乘2,不是全部加上 if(!a[i][j]) 17 */ 18 for(i=0; i<(n+2)/3; i++) 19 { 20 for(j=i; j<n-2*i-1; j++) 21 a[i][j] = cnt++; 22 k = i;//斜着填 23 for(j=n-i*2-1; j>i; j--) 24 a[k++][j] = cnt++; 25 for(j=n-i*2-1;j>i; j--) 26 a[j][i] = cnt++; 27 28 } 29 30 31 } 32 33 void print() 34 { 35 int i,j,k; 36 for(i=0; i<n; i++) 37 { 38 for(j=0; j<n-i; j++) 39 { 40 printf("%4d",a[i][j]); 41 } 42 printf("\n"); 43 } 44 45 } 46 47 int main() 48 { 49 int i,j,k; 50 scanf("%d",&n); 51 solve(); 52 print(); 53 system("pause"); 54 return 0; 55 }
9. 程序設計(滿分16分)
公司發了某商店的購物券1000元,限定只能購買店中的m種商品。每種商品的價格分別為m1,m2,…,要求程序列出所有的正好能消費完該購物券的不同購物方法。 程序輸入: 第一行是一個整數m,代表可購買的商品的種類數。 接下來是m個整數,每個1行,分別代表這m種商品的單價。 程序輸出: 第一行是一個整數,表示共有多少種方案 第二行開始,每種方案占1行,表示對每種商品購買的數量,中間用空格分隔。 例如: 輸入: 2 200 300 則應輸出: 2 2 2 5 0 輸入: 2 500 800 則應輸出: 1 2 0 。
注意: 多行間的順序可以不同(不扣分) 同樣的內容重復出現,則扣2分(此項錯誤不重復扣分) 多給出一個答案,則扣除2分 開始不輸出答案行數的,扣除2分(多個用例不重復扣) 不是用空格分隔的,扣除2分(多個用例不重復扣) 本題分數扣完為止
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 int cost; 6 int m;//物品個數 7 int *price = new int[m];//物品單價 8 int cnt[100];//物品數目 9 int total;//方案數目 10 int ans[100][100];//每種方案的商品分布 11 12 void output() 13 { 14 int i,j,k; 15 cout<<total<<endl; 16 for(i=0; i<total; i++) 17 { 18 cout<<ans[i][0];//不多輸出空格 19 for(j=1; j<m; j++) 20 cout<<" "<<ans[i][j]; 21 cout<<endl; 22 } 23 } 24 25 //回溯,第cur種物品分為買或者 不買 26 void fun(int cur) 27 { 28 if(cost >1000||cur >= m)//因為cur從0開始因此需要加上等號 29 return ; 30 if(1000 == cost) 31 { 32 for(int i=0; i<m; i++) 33 ans[total][i] = cnt[i]; 34 total++; 35 return ; 36 } 37 //選 擇第cur種物品 38 ++cnt[cur]; 39 cost += price[cur]; 40 fun(cur); 41 //不選擇第cur種物品 42 --cnt[cur]; 43 cost -= price[cur]; 44 fun(cur+1); 45 } 46 47 int main() 48 { 49 int i,j,k; 50 cin>>m; 51 for(i=0; i<m; i++) 52 cin>>price[i]; 53 fun(0); 54 output(); 55 delete price; 56 while(1); 57 return 0; 58 } 59
10. 程序設計(滿分28分)
一種Playfair密碼變種加密方法如下:首先選擇一個密鑰單詞(稱為pair)(字母不重復
,且都為小寫字母),然后與字母表中其他字母一起填入至一個5x5的方陣中,填入方法如
下: 1.首先按行填入密鑰串。 2.緊接其后,按字母序按行填入不在密鑰串中的字母。 3.由於方陣中只有25個位置,最后剩下的那個字母則不需變換。 如果密鑰為youandme,則該方陣如下: y o u a n d m e b c f g h i j k l p q r s t v w x 在加密一對字母時,如am,在方陣中找到以這兩個字母為頂點的矩形(紅色字體): y o u a n d m e b c f g h i j k l p q r s t v w x
這對字母的加密字母為該矩形的另一對頂點,如本例中為ob。 請設計程序,使用上述方法對輸入串進行加密,並輸出加密后的串。 另外有如下規定: 1、一對一對取字母,如果最后只剩下一個字母,則不變換,直接放入加密串中; 2、如果一對字母中的兩個字母相同,則不變換,直接放入加密串中; 3、如果一對字母中有一個字母不在正方形中,則不變換,直接放入加密串中; 4、如果字母對出現在方陣中的同一行或同一列,如df或hi,則只需簡單對調這兩個字母,
即變換為fd或ih; 5、如果在正方形中能夠找到以字母對為頂點的矩形,假如字母對為am,則該矩形的另一對
頂點字母中,與a同行的字母應在前面,在上例中應是ob;同樣若待變換的字母對為ta,則
變換后的字母對應為wo; 6、本程序中輸入串均為小寫字母,並不含標點、空格或其它字符。 解密方法與加密相同,即對加密后的字符串再加密,將得到原始串。 要求輸入形式如下: 從控制台輸入兩行字符串,第一行為密鑰單詞(長度小於等於25),第二行為待加密字符
串(長度小於等於50),兩行字符串末尾都有一個回車換行符,並且兩行字符串均為小寫
字母,不含其它字符。 在標准輸出上輸出加密后的字符串。 例如,若輸入: youandme welcometohangzhou 則表示輸入的密鑰單詞為youandme,形成的正方形如上所示;待加密字符串為
welcometohangzhou。在正方形中可以找到以第一對字母we為頂點的矩形,對應另一對頂點
字母為vb,因此加密后為vb,同理可找到與字母對lc,et,oh,ho對應的頂點字母對。而字母
對om位於上述正方形中的同一列,所以直接以顛倒這兩個字母來加密,即為mo,字母對an
同理。字母對gz中的z不在上述正方形中,因此原樣放到加密串中。最后剩一個字母u也原
樣輸出。 因此輸出的結果為: vbrmmomvugnagzguu
