計蒜客 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

AZ:6590 A - Z: 65 - 90

az:97122 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,有問題歡迎通過郵箱交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章