题目描述
有一行电文,已按如下规律译成密码:
A–>Z a–>z
B–>Y b–>y
C–>X c–>x
… …
即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。
输入
输入一行密文
输出
解密后的原文,单独占一行。
样例输入
ZYX123zyx
样例输出
ABC123abc
#include<stdio.h>
int main()
{
char a[100];
scanf("%s",a);
for(int i=0;i<100;i++)
{
if(a[i]<='z'&&a[i]>='a')
a[i]='a'+'z'-a[i];
if(a[i]<='Z'&&a[i]>='A')
a[i]='A'+'Z'-a[i];
}
printf("%s",a);
return 0;
}
解题思路
根据ASCII码表中字母序号的大小关系进行思考,设想:
任何一个字母必处于a和z之间;
字母a码值=x+1(1即第一位字母);
字母z码值=x+26(26即第二十六位字母);
第i位字母码值=x+i;
所求转换后字母码值=x+26-i+1=x+27-i;
因此可得 a[i]='a'+'z'-a[i]
同理可得大写也是如此