1. 程式人生 > 實用技巧 >有一行電文,以按下面規律譯成密碼: A--->Z a--->z B--->Y b--->Y C--->X c--->x …… 即第1個字母程式設計第26個字母,第i個字母程式設計第(26-i+1)個字母,非字母字元不變,要求程式設計序將密碼譯回原文,並輸出密碼和原文。

有一行電文,以按下面規律譯成密碼: A--->Z a--->z B--->Y b--->Y C--->X c--->x …… 即第1個字母程式設計第26個字母,第i個字母程式設計第(26-i+1)個字母,非字母字元不變,要求程式設計序將密碼譯回原文,並輸出密碼和原文。

有一行電文,以按下面規律譯成密碼:

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'

假設如果當前拿到的是小寫字母,轉換方式如下:

  1. 先用s[i] - 'a'計算出s[i]是26個字母中從前往後數的第幾個
  2. 再用26 - (s[i]- 'a') - 1 轉換為26個字母中從後往前數的第幾個
  3. 在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;
}

【結果截圖】