【每日一题(5)】密码(凯撒密码) FZU - 1489 (福州大学第四届程序设计竞赛题)

密码(凯撒密码) FZU - 1489

密码的使用最早可以追溯到古罗马时期,《高卢战记》有描述恺撒曾经使用密码来传递信息,即所谓的“恺撒密码”,它是一种替代密码,通过将字母按顺序推后3位起到加密作用,如将字母A换作字母D,将字母B换作字母E。据说恺撒是率先使用加密的古代将领之一,因此这种加密方法被称为恺撒密码。显然从1到25个位置的移位我们都可以使用, 因此,为了使密码有更高的安全性,我们可以使用单字母替换密码。 如:

明码表 ABCDEFGHIJKLMNOPQRSTUVWXYZ

密码表 QWERTYUIOPASDFGHJKLZXCVBNM

明文 Welcome to fzupc2007!

密文 Vtsegdt zg Ymxhe2007!

明文中的字母按明码表和密码表被替换成相应的密文字母。
请编写一个程序在已知密码表(明码表不变)和明文的情况下加密后的密文。加密只针对英文字母,所有其他的符号都保持不变。

Input

本题有多组输入数据,你必须处理到EOF为止

每组输入数据有2行,第一行为密码表共有26个英文大写字符,第二行为密文,密文不超过100个字符。输入数据由字母、空格、数字以及各种标点组成。

Output

输出只有一行为加密后的明文(大小写字母加密方式相同,且替换后大小写方式不变)。

Sample Input

QWERTYUIOPASDFGHJKLZXCVBNM
Welcome to Fzupc2007!

Sample Output

Vtsegdt zg Ymxhe2007!

题意

显然,要使密码和明文配对,只需要密码字母相同的个数和明文字母相同的个数完全一样就可以了,例如
只换字母不换顺序:hello (1H 1E 2L 1O) → nlbbq (1N 1L 2B 1Q) 可见,密码交换后,字母个数还是1,1,2,1
既换字母也换顺序:hello (1H 1E 2L 1O) → blbqn (1N 1L 2B 1Q) 可见,密码交换后,字母个数还是1,1,2,1
显然可以看出,不管换字母还是换顺序,字母个数都是一一对应

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include<string.h>
int main(void)
{
char a[30],b[200];
int i;
while(scanf("%s",a) != EOF){
getchar();
gets(b);
int x = strlen(b);
for(i = 0;i < x; i++){
if(b[i] >= 'a' && b[i] <= 'z')
b[i] = a[b[i] - 'a'] + 32;
if(b[i] >= 'A' && b[i] <= 'Z')
b[i] = a[b[i] - 'A'];
}
puts(b);
}

return 0;
}