有一行電文,以按下面規律譯成密碼:A--->Z a--->z B--->Y b--->Y C--->X c--->x
阿新 • • 發佈:2020-07-17
有一行電文,以按下面規律譯成密碼:
A--->Z a--->z
B--->Y b--->Y
C--->X c--->x
……
即第1個字母程式設計第26個字母,第i個字母程式設計第(26-i+1)個字母,非字母字元不變,要求程式設計序將密碼譯回原文,並輸出密碼和原文。
【答案解析】
從題目給的例項中可以看到,編碼規則非常簡單,就是將從前往後數的第i個字母轉化為從後往前數的第i個字母。
那解壓時直接反過來轉換即可:
即'Z'--->'A' 'z'--->'a'
'Y'--->'B' 'y'--->'b'
'X'--->'C' 'x'--->'c'
假設如果當前拿到的是小寫字母,轉換方式如下:
- 先用s[i] - 'a'計算出s[i]是26個字母中從前往後數的第幾個
- 再用26 - (s[i]- 'a') - 1 轉換為26個字母中從後往前數的第幾個
- 在2的結果上加上'a',即轉換為對應從後往前的第幾個字母
大寫字母轉換方式與上述相同,將上述每條中的'a'換為‘A’即可。
【程式碼實現】
#include<stdio.h> int main() { char s[1024] = {0}; scanf("%s", s); int len = strlen(s); // 轉換 for (int i = 0; i < len; ++i) { // 如果是小寫字母(大寫字母出來類似): // 1. 先用s[i] - 'a'計算出s[i]是26個字母中從前往後數的第幾個 // 2. 再用26 - (s[i]- 'a') - 1 轉換為26個字母中從後往前數的第幾個 // 3. 在2的結果上加上'a',即轉換為對應從後往前的第幾個字母 if (s[i] >= 'a' && s[i] <= 'z') s[i] = 'a' + 26 - (s[i]-'a')-1; else if (s[i] >= 'A' && s[i] <= 'Z') s[i] = 'A' + 26 - (s[i] - 'A')-1; } printf("%s", s); return 0; }
【結果截圖】
有一行電文,以按下面規律譯成密碼:AZ az B>Y bY C>X c>x