计蒜客 T1112 加密的病历单#
目录#
1. 题目描述#
1.1. Limit#
Time Limit: 1000 ms
Memory Limit: 65536 kB
1.2. Problem Description#
小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会。
在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概论中取得过好成绩后,主任又额外交给她一项任务,解密抗战时期被加密过的一些伤员的名单。
经过研究,小英发现了如下加密规律(括号中是一个 "原文 密文" 的例子)
- 原文中所有的字符都在字母表中被循环右移了三个位置( abz -> dec )
- 逆序存储 (abcd -> dcba )
- 大小写反转 (abXY -> ABxy)
1.3. Input#
原文。(长度小于 50 且只包含大小写字母)
1.4. Output#
输出加密后的字符串。
输出时每行末尾的多余空格,不影响答案正确性
1.5. Sample Input#
GSOOWFASOq
1.6. Sample Output#
Trvdizrrvj
1.7. Source#
2. 解读#
字符串处理,考虑大小写字母对应的ASCII
码
要对字母进行大小写反转,只需要将大写字母的ASCII码加上32
,小写字母的ASCII
码减去32
即可。
此处还需要注意的一个问题是,题目要求字符循环右移,所以需要判断移位后会超出范围的字母,将其超出范围的值加上 a
或 A
,即可得到其循环右移的结果。
3. 代码#
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
// 存储输入字符
string buffer;
// 输入
cin >> buffer;
// 存储长度
size_t bufferSize = buffer.size();
if (bufferSize > 0) {
// 大小写反转
for (size_t i = 0; i < bufferSize; i++) {
// 判断大小写
if (buffer[i] >= 'a') {
// 小写转大写
buffer[i] -= 32;
} else {
// 大写转小写
buffer[i] += 32;
}
}
// 逆序存储
string bufferRev;
bufferRev.resize(bufferSize);
// 逆序
for (size_t i = 0; i < bufferSize; i++) {
bufferRev[i] = buffer[bufferSize - i - 1];
}
// 所有字符右移三位
for (size_t i = 0; i < bufferSize; i++) {
// 判断大小写
if (bufferRev[i] >= 'a') {
// 小写
// 右移3位
bufferRev[i] += 3;
// 若超出范围
if (bufferRev[i] > 'z') {
bufferRev[i] %= 'z' + 1;
bufferRev[i] += 'a';
}
} else {
// 大写
// 右移3位
bufferRev[i] += 3;
// 若超出范围
if (bufferRev[i] > 'Z') {
bufferRev[i] %= 'Z' + 1;
bufferRev[i] += 'A';
}
}
}
// 输出
printf("%s\n", bufferRev.c_str());
}
}
联系邮箱:curren_wong@163.com
Github:https://github.com/CurrenWong
欢迎转载/Star/Fork,有问题欢迎通过邮箱交流。