题目: 先输入字母映射的密文, 再将输入的加密后的句子中的字母, 得其所对应密文中相同字母的位置, 将其位置的位数所对应字母表中的字母输出。(解密)
Decrypting Mapping Cipher
Recall the Mapping Cipher laboratory work.
Y
ou are given an alphabetic mapping
table to create cipher text.
The table is defined by a string using 26 lower-
case
alphabets, such as
incpfvztsmbexowhlgkqjyrdau
In the string all characters are dif
ferent. Using this table to generate cipher text, it
performs the following mapping scheme:
a
-> i, A
->I
b -
> n, B-
>N
c -
> c, C-
>C
d -
> p, D-
>P
. . . . . . .
y -
> a, Y-
>A
z -
> u, Z-
>U
Any non-alphabetic character are kept unchanged.
Apply the scheme to plain text:
There are 2 dogs and 3 cats.
It rains dogs & cats!
Obtain the following cipher text:
Qtfgf igf 2 pwzk iop 3 ciqk.
Sq gisok pwzk & ciqk!
Now
, you are asked to do
its inverse task.
Y
ou are given the same mapping string, but
you will receive cipher text.
Y
our mission is to decrypt the cipher text to a plain one.
Input
There are several test cases. Each test case starts with a line of mapping string used to
create cipher text. Following are cipher text enclosed by two lines of string
"***".
Y
our task is to output the plain text before encryption. There is a blank line after each
case. Finally
, you will reach a line of string
"###" which signals the end of test.
Each line in test cases is no more than 1000 characters.
Output
The cipher text of each test case is prefixed with a plain text number as shown in the
sample output. Place a blank line between cases.
Sample Input
incpfvztsmbexowhlgkqjyrdau
***
Qtfgf igf 2 pwzk iop 3 ciqk.
Sq gisok pwzk & ciqk!
***
xowhlgkqjyrdauincpfvztsmbe
***
Vqlpl xpl 2 hikf xuh 3 wxvf.
Jv pxjuf hikf & wxvf!
***
###
Sample Output
Plain
1:
There are 2 dogs and 3 cats.
It rains dogs & cats!
Plain
2:
There are 2 dogs and 3 cats.
It rains dogs & cats!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int flag=1, test=1;
while(1)
{
char arr[26]={0}; //存取字母映射的密文
char z[10]={0}; //存取密文后的***
char str[1001]={0}; //存取输入的加密后的句子
gets(arr);
if(arr[0]=='#' && arr[1]=='#' && arr[2]=='#') break;
gets(z);
if(flag) flag=0;
else printf("\n");
printf("Plain %d:\n",test++);
while(gets(str))
{
if(str[0]=='*' && str[1]=='*' && str[2]=='*') break;
for(int i=0; i<strlen(str); i++)
{
if(str[i]>='a' && str[i]<='z' || str[i]>='A' && str[i]<='Z')
{
for(int j=0; j<26; j++)
{
if(str[i]==arr[j])
{
printf("%c",j+'a');
break;
}
else if(str[i]+'a'-'A'==arr[j])
{
printf("%c",j+'A');
break;
}
}
}
else printf("%c",str[i]);
}
printf("\n");
}
scanf("\n");
}
return 0;
}