文章目錄
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());
}
}
聯繫郵箱:[email protected]
Github:https://github.com/CurrenWong
歡迎轉載/Star/Fork,有問題歡迎通過郵箱交流。