Phục hồi chữ Hán từ mã nhị phân để giải bài toán ẩn

Bài toán yêu cầu xử lý dữ liệu biểu diễn hình dạng chữ Hán theo định dạng 16x16 điểm ảnh. Mỗi chữ được lưu bằng 32 byte, mỗi byte tương ứng 8 bit, trong đó bit 1 thể hiện điểm mực và bit 0 là nền.

Dữ liệu đầu vào gồm 10 chữ Hán, mỗi chữ biểu diễn bằng 32 số nguyên có dấu. Cần chuyển đổi từng số thành chuỗi nhị phân độ dài 8 bit (bổ sung bit dấu cho số âm theo cách biểu diễn bù hai), sau đó in ra theo từng hàng gồm 2 byte (tức 16 cột).

Sau khi hiển thị toàn bộ hình ảnh chữ Hán, nội dung ẩn sẽ hiện ra: "9 mũ 9 bằng bao nhiêu?". Kết quả cần nộp là giá trị của \(9^9\).

Chuyển đổi số nguyên sang nhị phân

Có thể dùng thư viện bitset hoặc thao tác bit thủ công. Lưu ý rằng số âm trong C++ được biểu diễn dưới dạng bù hai, nên việc ép kiểu sang unsigned char trước khi xử lý sẽ đảm bảo đúng 8 bit.

#include <iostream>
#include <bitset>

int main() {
    int data[320] = {
        4,0,4,0,4,0,4,32,-1,-16,4,32,4,32,4,32,4,32,4,32,8,32,8,32,16,34,16,34,32,30,-64,0,
        16,64,16,64,34,68,127,126,66,-124,67,4,66,4,66,-124,126,100,66,36,66,4,66,4,66,4,126,4,66,40,0,16,
        4,0,4,0,4,0,4,32,-1,-16,4,32,4,32,4,32,4,32,4,32,8,32,8,32,16,34,16,34,32,30,-64,0,
        0,-128,64,-128,48,-128,17,8,1,-4,2,8,8,80,16,64,32,64,-32,64,32,-96,32,-96,33,16,34,8,36,14,40,4,
        4,0,3,0,1,0,0,4,-1,-2,4,0,4,16,7,-8,4,16,4,16,4,16,8,16,8,16,16,16,32,-96,64,64,
        16,64,20,72,62,-4,73,32,5,16,1,0,63,-8,1,0,-1,-2,0,64,0,80,63,-8,8,64,4,64,1,64,0,-128,
        0,16,63,-8,1,0,1,0,1,0,1,4,-1,-2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,5,0,2,0,
        2,0,2,0,7,-16,8,32,24,64,37,-128,2,-128,12,-128,113,-4,2,8,12,16,18,32,33,-64,1,0,14,0,112,0,
        1,0,1,0,1,0,9,32,9,16,17,12,17,4,33,16,65,16,1,32,1,64,0,-128,1,0,2,0,12,0,112,0,
        0,0,0,0,7,-16,24,24,48,12,56,12,0,56,0,-32,0,-64,0,-128,0,0,0,0,1,-128,3,-64,1,-128,0,0
    };

    for (int i = 0; i < 320; i += 2) {
        std::bitset<8> left(static_cast<unsigned char>(data[i]));
        std::bitset<8> right(static_cast<unsigned char>(data[i + 1]));
        std::cout << left << right << '\n';
    }
    return 0;
}

Khi chạy chương trình và thay thế các ký tự '0' bằng khoảng trắng, '1' bằng dấu '*' (hoặc giữ nguyên để quan sát), sẽ thấy dòng chữ: "九的九次方等于多少?".

Tính kết quả

Ta cần tính \(9^9\):

#include <iostream>

int main() {
    long long result = 1;
    for (int i = 0; i < 9; ++i)
        result *= 9;
    std::cout << result;
    return 0;
}

Kết quả là 387420489.

Thẻ: C++ bitwise-operation bitset

Đăng vào ngày 7 tháng 7 lúc 20:35