计蒜客 T1112 加密的病历单 字符串处理

1. 题目描述

1.1. Limit

Time Limit: 1000 ms

Memory Limit: 65536 kB

1.2. Problem Description

小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会。

在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概论中取得过好成绩后,主任又额外交给她一项任务,解密抗战时期被加密过的一些伤员的名单。

经过研究,小英发现了如下加密规律(括号中是一个 “原文 \to 密文” 的例子)

  1. 原文中所有的字符都在字母表中被循环右移了三个位置( abz -> dec )
  2. 逆序存储 (abcd -> dcba )
  3. 大小写反转 (abXY -> ABxy)

1.3. Input

原文。(长度小于 50 且只包含大小写字母)


1.4. Output

输出加密后的字符串。

输出时每行末尾的多余空格,不影响答案正确性


1.5. Sample Input

GSOOWFASOq

1.6. Sample Output

Trvdizrrvj

1.7. Source

计蒜客 T1112 加密的病历单


2. 解读

字符串处理,考虑大小写字母对应的ASCII

A Z : 65 90 A - Z: 65 - 90

a z : 97 122 a - z: 97 - 122

要对字母进行大小写反转,只需要将大写字母的ASCII码加上32,小写字母的ASCII码减去32即可。

此处还需要注意的一个问题是,题目要求字符循环右移,所以需要判断移位后会超出范围的字母,将其超出范围的值加上 aA ,即可得到其循环右移的结果。

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());
    }
}

联系邮箱:[email protected]

Github:https://github.com/CurrenWong

欢迎转载/Star/Fork,有问题欢迎通过邮箱交流。

猜你喜欢

转载自blog.csdn.net/qq_41729780/article/details/105866410