1、根据 ASCII 码中大小写字母相差 32,如:
if(s[i]>='A'&&s[i]<='Z')s[i]+=32;
else s[i]-=32;
2、将字母循环右移三位,我们可以直接将其对应的 ASCII 码 +3,但是要注意边界的处理,这里我们采用对 26取模实现(26个字母)
题目描述
小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会。
在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概论中取得过好成绩后,主任又额外交给她一项任务,解密抗战时期被加密过的一些伤员的名单。
经过研究,小英发现了如下加密规律(括号中是一个“原文 → 密文”的例子)
-
原文中所有的字符都在字母表中被循环左移了三个位置(bcd→yzabcd→yza)
-
逆序存储(abcd→dcbaabcd→dcba)
-
大小写反转(abXY→ABxyabXY→ABxy)
现在给出一个加密的字符串,请你将其解密。
输入格式
一个加密的字符串。(长度小于 5050 且只包含大小写字母)
输出格式
输出解密后的字符串。
输入输出样例
输入 #1复制
GSOOWFASOq
输出 #1复制
Trvdizrrvj
int main(void)
{
char str[100];
int dex;
for(dex=0;((str[dex]=getchar())!='\n')&&(dex<100);dex++);
for(int i=0;i<dex;i++)
{
printf("%c",str[i]);
}
printf("\r\n");
for(int i=dex-1;i>=0;i--)
{
if(str[i]>='A'&&str[i]<='Z')
{
printf("%c",str[i]);
str[i]=(str[i]+23+3)%26;//这样计算出来的结果不是想要的结果,循环移位的时候出现了错误(不是从0-26循环移位,是一个数的中间的26个位置循环移位)
//printf("%c",str[i]);
}
else
{
str[i]=(str[i]-23+3)%26;
// printf("%c",str[i]);
}
}
return 0;
}
注意循环右移这样子是错误的
正确的做法(注意:strlen函数头文件是string.h):
#include <string.h>
int n;
char s[100];//注意数组要开得比数据范围稍大
char Shift(char c){//将字符循环移位,我这里为了方便使用了函数(注意移位是这样子移位的)
if(c>='A'&&c<='Z')return ((c-'A'+3)+26)%26+'A';
else return ((c-'a'+3)+26)%26+'a';
}
int main(){
scanf("%s",s),n=strlen(s);//n 是字符串的长度
for(int i=0;i<n;i++){
if(s[i]>='A'&&s[i]<='Z')s[i]+=32;
else s[i]-=32;
}
//reverse(s,s+n);
for(int i=0;i<n;i++)s[i]=Shift(s[i]);
for(int i=n-1;i>=0;i--)
{
printf("%c",s[i]);
}
//printf("%s",s);
return 0;
}