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

ACM 題目:簡單密碼破解/加密演算法實作 (手機按鍵映射與字母位移)

     編輯:關於C

本題目描述一種雙重加密規則:將明文密碼轉換為密文。規則如下:

  • 小寫字母依手機九宮格對應數字:abc→2, def→3, ghi→4, jkl→5, mno→6, pqrs→7, tuv→8, wxyz→9。
  • 大寫字母先轉小寫,再往後循環位移一位(Z→a)。
  • 數字與符號保持不變。

輸入多行明文(長度 ≤ 100),輸出對應密文,直到 EOF。

演算法邏輯

  1. 逐字元讀取輸入字串(使用 gets() 或 fgets())。
  2. 對每個字元判斷類別並轉換:
    • 'A'~'Y':ch + 32 + 1(轉小寫+位移)
    • 'Z':直接變 'a'
    • 'a'~'z':用 switch 對應手機按鍵數字
    • 其他:不變
  3. 輸出轉換後字串。

完整程式碼

#include <stdio.h>
#include <string.h>

int main() {
    int n, i;
    char t, a[101];

    while (gets(a) != NULL) {
        n = strlen(a);
        for (i = 0; i < n; i++) {
            if (a[i] >= 'A' && a[i] <= 'Y') {
                a[i] = a[i] + 32 + 1; // 大寫轉小寫並後移一位
            } else if (a[i] == 'Z') {
                a[i] = 'a'; // Z 循環到 a
            } else if (a[i] >= 'a' && a[i] <= 'z') {
                t = a[i];
                switch (t) {
                    case 'a': case 'b': case 'c': a[i] = '2'; break;
                    case 'd': case 'e': case 'f': a[i] = '3'; break;
                    case 'g': case 'h': case 'i': a[i] = '4'; break;
                    case 'j': case 'k': case 'l': a[i] = '5'; break;
                    case 'm': case 'n': case 'o': a[i] = '6'; break;
                    case 'p': case 'q': case 'r': case 's': a[i] = '7'; break;
                    case 't': case 'u': case 'v': a[i] = '8'; break;
                    case 'w': case 'x': case 'y': case 'z': a[i] = '9'; break;
                }
            }
        }
        puts(a);
    }
    return 0;
}

程式執行示例

範例

輸入:YUANzi1987 → 輸出:zvbo941987(符合題目說明)。

安全性提醒

gets() 有緩衝區溢位風險,實際開發建議改用 fgets(a, sizeof(a), stdin)。

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