HDU 1048 是一道經典的字串處理題目,背景設定在凱薩大帝時代。題目要求實作一個位移 5 位的凱薩密碼解密器,將密文還原為明文。本文詳細拆解題目邏輯、輸入輸出格式,並提供優化後的 C 語言標準解法。
加密規則:明文每字母向右位移 5 位(A→F)。解密則反向操作:
密文: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 明文: V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
非字母字元保持不變,所有字母均為大寫。
START、密文訊息(1~200 字元)、ENDENDOFINPUT 結束標記ENDOFINPUT 則結束END 行'Z' - (5 - ch + 'A') + 1)#include <stdio.h>
#include <string.h>
int main(void) {
char flag[10], msg[1000], end[10];
int len, i;
while (scanf("%s", flag) != EOF && strcmp(flag, "ENDOFINPUT") != 0) {
getchar(); // 吸收換行符
fgets(msg, sizeof(msg), stdin); // 讀取整行密文(含空格)
msg[strcspn(msg, "\n")] = '\0'; // 移除尾端換行
scanf("%s", end); // 讀取 END
len = strlen(msg);
for (i = 0; i < len; i++) {
if (msg[i] < 'A' || msg[i] > 'Z') continue;
if (msg[i] > 'E') msg[i] -= 5;
else msg[i] = 'Z' - (5 - (msg[i] - 'A')) + 1;
}
puts(msg);
}
return 0;
}
scanf("%s") 遇空白停止,密文含空格需用 fgets 或 gets(配合 getchar() 清緩衝)輸入: START NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX END START N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ END START IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ END ENDOFINPUT 輸出: IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE
此題屬於入門級字串操作,掌握 scanf/fgets 混用技巧與字元運算即可輕鬆通過。