Mã hoá theo khóa (Đề thi Tin học trẻ)

Bài toán – Mã hoá theo khoá (Dành cho học sinh THCS và THPT)

Cho trước khoá là một hoán vị của n số (1, 2, …, n). Khi đó để mã hoá một xâu kí tự ta có thể chia xâu thànhtừng nhóm n kí tự (riêng nếu nhóm cuối cùng không đủ n kí tự thì ta coa thể thêm các dấu cách vào sau cho đủ) rồi hoán vị các kí tự trong từng nhóm. Sau đó, ghép lại theo thứ tự các nhóm ta được một xâu đã mã hoá.

Chẳng hạn: với khoá 3241 (n=4) thì ta có thể mã hoá xâu ‘english’ thành ‘gnlehs i’.

Hãy viết chương trình mã hoá một xâu kí tự cho trước.

Cài đặt bài toán mã hóa theo khóa với Python

def encode_string(s, key):
    # Chia xâu s thành các nhóm có độ dài key
    s_groups = [s[i:i+key] for i in range(0, len(s), key)]
    
    # Đếm số lượng kí tự cần thêm vào cuối các nhóm không đủ key kí tự
    num_padding = key - len(s_groups[-1])
    
    # Thêm dấu cách vào cuối các nhóm không đủ key kí tự
    s_groups[-1] += ' ' * num_padding
    
    # Mã hoá từng nhóm bằng hoán vị theo khoá
    encoded_groups = []
    for group in s_groups:
        encoded_group = ''.join([group[int(k)-1] for k in key])
        encoded_groups.append(encoded_group)
    
    # Ghép lại các nhóm đã mã hoá
    encoded_string = ''.join(encoded_groups)
    
    return encoded_string

# Test
s = 'english'
key = '3241'
encoded_string = encode_string(s, key)
print(encoded_string)

Cài đặt bài toán mã hóa theo khóa với C++

#include <iostream>
#include <string>

using namespace std;

string maHoaXau(string s, string key) {
    int n = key.length();
    int len = s.length();
    string result = "";
    
    // Chia xâu thành các nhóm n kí tự
    int numOfGroups = len / n;
    if (len % n != 0) {
        numOfGroups++;
    }
    string* groups = new string[numOfGroups];
    
    for (int i = 0; i < numOfGroups; i++) {
        groups[i] = "";
    }
    
    int groupIndex = 0;
    for (int i = 0; i < len; i++) {
        groups[groupIndex].push_back(s[i]);
        groupIndex = (groupIndex + 1) % numOfGroups;
    }
    
    // Hoán vị các kí tự trong từng nhóm theo khoá
    for (int i = 0; i < numOfGroups; i++) {
        string group = groups[i];
        int groupLen = group.length();
        string temp = "";
        
        for (int j = 0; j < groupLen; j++) {
            int index = key[j % n] - '0' - 1;
            temp.push_back(group[index]);
        }
        
        groups[i] = temp;
    }
    
    // Ghép lại các nhóm đã hoán vị để tạo xâu đã mã hoá
    for (int i = 0; i < numOfGroups; i++) {
        result += groups[i];
    }
    
    delete[] groups;
    return result;
}

int main() {
    string s, key;
    cout << "Nhap vao xau can ma hoa: ";
    cin >> s;
    cout << "Nhap vao khoa: ";
    cin >> key;
    
    string result = maHoaXau(s, key);
    cout << "Xau da ma hoa: " << result << endl;
    
    return 0;
}

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *