首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

HDU 1048 幻影凶間:凱薩密碼解密完整解析與 C 語言實作

     編輯:關於C語言

HDU 1048 幻影凶間:凱薩密碼解密完整解析與 C 語言實作

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

非字母字元保持不變,所有字母均為大寫。

輸入格式詳解

  • 最多 100 組測資,每組包含三行:START、密文訊息(1~200 字元)、END
  • 最後一行為 ENDOFINPUT 結束標記
  • 測資之間無空行

演算法邏輯

  1. 讀取首行,若為 ENDOFINPUT 則結束
  2. 讀取密文行(需處理換行符)
  3. 讀取結尾 END 行
  4. 遍歷密文每字元:
    • 若為 'A'~'E':對應 'V'~'Z'(公式:'Z' - (5 - ch + 'A') + 1)
    • 若為 'F'~'Z':直接減 5
    • 非字母:保持原樣
  5. 輸出解密後的明文

C 語言標準解法(已優化輸入處理)

#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() 清緩衝)
  • 字元轉換:利用 ASCII 碼特性,避免建立對照表
  • 邊界條件:'A'~'E' 需環繞到 'V'~'Z',公式推導需謹慎

測試樣例驗證

輸入:
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 混用技巧與字元運算即可輕鬆通過。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved