2011年選拔賽C本科


考試時間為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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM