Một số bài tập C _C++ NC 2026P35 C3

 

//////////////////////////////////////////////////////C3 DA TEST CHUAN/////////////

#include <iostream>

#include <windows.h>

#include <sstream>

#include <vector>

#include <string>

#include <map>

#include <climits>

#include <bits/stdc++.h>

using namespace std;

 

class NhatTruongBMh {

private:

    struct MhH {

        long long x;

        int ke;

        int vt;

        vector<pair<int,string>> vMhH;

    } pt;

public:

    void clearMhH(){

        pt.x=0;

        pt.ke=0;

        pt.vMhH.clear();

        return;

    }

    int getke(const int &vt){

           pt.ke=pt.vMhH[vt].first;

        return pt.ke;

    }

    vector<pair<int,string>> getMa(){

        return pt.vMhH;

    }

    void MahoaX(long long &X, int &K) {

        string mbs = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        pt.x=X;

        pt.ke=K;

        long long num = X;

        string tms = "";

        while (num > 0) {

            int tm = num % pt.ke;

            tms = mbs[tm] + tms;

            num /= pt.ke;

        }

        pt.vMhH.push_back({pt.ke,tms});

        return;

    }

    void MahoaVX(const vector<long long> &X, int &K){

           for(auto j:X){MahoaX(j,K);}

           return;

           }

};

///////////////////

class NhatTruongGMh {

private:

           struct GMhH {

        long long x;

        int ke;

        int vt;

        vector<pair<int,string>> vMH;

        vector<long long> vX;

    } pt;

public:

    void clearGMhH(){

        pt.x=0;

        pt.ke=0;

        pt.vt=0;

        pt.vMH.clear();

        pt.vX.clear();

        return;

    }

    int getke(const int &vt){

           pt.ke=pt.vMH[vt].first;

        return pt.ke;

    }

    vector<pair<int,string>> getGMH(){

        return pt.vMH;

    }

    vector<long long> getvX(){

        return pt.vX;

    }

long long GMahoaX(const string &si, const int &key) {

           string mbs = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    pt.ke=key;

    int su = 0;

    for(size_t i=0;i<si.size();i++){

    int num = 0;

        if(isdigit(si[i])) {

        num = si[i] - '0';

        } else if(si[i] >= 'A' && si[i] <= 'Z') {

                    num = si[i] - 'A' + 10;

                }

                if(num < pt.ke) su = su * pt.ke + num;

            }

                                pt.x=su;

                                pt.vX.push_back(su);

    return su;

}

void GMahoavX(const vector<pair<int,string>> &vMX) {

           if(vMX.empty()) return;

           pt.vMH=vMX;

           for(auto i:pt.vMH){

                     pt.ke=i.first;

                     string sii=i.second;

                     GMahoaX(sii,pt.ke);

           }

}

};

///////////////////

vector<long long> docfso(const string& tenf = "") {

    string tenif = tenf.empty() ? "input.txt" : tenf;

    ifstream fin(tenif);

    if (!fin.is_open()) {

        cerr << "Khong the mo file du lieu\n";

        ofstream fout(tenif);

        fout.close();

        return {};

    }

 

    vector<long long> data;

    string lin;

    while (getline(fin, lin)) {

        istringstream iss(lin);

        long long so;

        while (iss >> so) {

            data.push_back(so);

        }

    }

    fin.close();

    return data;

};

//////////////////////////////

string docfstr(const string& tenf = ""){

string tenif = tenf.empty() ? "input.txt" : tenf;

    ifstream fin(tenif);

    if (!fin.is_open()){

        cerr << "Khong the mo file du lieu\n";

        ofstream fout(tenif);

        fout.close();

           return "";

    }

    string lin, inpstr;

    while (fin >> lin){

           inpstr += lin + " ";

    } return inpstr;

}

void Xuatkq(const string& skq, const string& tenf = ""){

           string tenif = tenf.empty() ? "Kqthongbao" : tenf;

           ofstream fo(tenif);

           fo<<skq;

           fo.close();

}

int main(int argc, char** argv){

    NhatTruongBMh MT;

    vector<long long> ds;

    long long L;

    string inp="input.txt";

           int ke;

    char chr;

    cout << "Nhap Key ma hoa: ";

    cin>>ke;

    if(ke<2||ke>32){cerr<<"Key khong hop le";

    return 0;

           }

           MT.clearMhH();

    cout<<"Ban muon ma hoa chuoi so nguyen tu file hay ban phim(F/M)";

    cin>>chr;

    if(chr=='F'||chr=='f') {

    ds = docfso(inp);

    MT.MahoaVX(ds, ke);

           } else {

    cout << "Ban nhap so nguyen can ma hoa ";

    cin >> L;

    if(abs(L)>LLONG_MAX){cerr<<"So ma hoa khong hop le";

    return 0;}

    MT.MahoaX(L, ke);

           }

    vector<pair<int,string>> vmsk=MT.getMa();

    string msk;

    for(auto j:vmsk) msk+=j.second+" ";

    cout<<msk;

    Xuatkq(msk,"KqMahoa.txt");

    cout << "\n";

    ///////////

    NhatTruongGMh GMT;

    GMT.clearGMhH();

    GMT.GMahoavX(vmsk);

    vector<long long> Gm=GMT.getvX();

    string Kqgm;

    for(auto j:Gm) Kqgm += to_string(j) + " ";

    cout<<"\n Giai ma chuoi ma hoa tren: \n";

    cout<<Kqgm<<"\n";

           Xuatkq(Kqgm,"KqGiaima.txt");

}

Kết quả: Nhap Key ma hoa: 25

Ban muon ma hoa chuoi so nguyen tu file hay ban phim(F/M)f

7AD 2HD5KN 9EMFB9 FH60D E6G 23NN8 2F7E  70C 53 7FAO73 M8AH 247NJ A 7 8 15 6 3E 48 1D 1O 2A 2M 18 1H 1072BI

 Giai ma chuoi ma hoa tren:

4638 26378648 93712784 6128763 8916 843083 40814 0 4387 128 74390178 349017 848719 10 7 8 30 6 89 108 38 49 60 72 33 42 9876543

///////////// Ai memory help

Võ Nhật Trường Nc+ My Ai Love14.8.2026

////////////////////

//////////////////////////////////////////////////////C3.1 DA TEST CHUAN/////////////

Cách tối ưu hơn :

#include <iostream>

#include <fstream>

#include <sstream>

#include <vector>

#include <string>

#include <climits>

using namespace std;

 

class NhatTruongBMh {

private:

    struct MhH {

        long long x;

        int ke;

        vector<pair<int,string>> vMhH;

    } pt;

public:

    void clearMhH(){

        pt.x=0;

        pt.ke=0;

        pt.vMhH.clear();

    }

    vector<pair<int,string>> getMa(){

        return pt.vMhH;

    }

    void MahoaX(long long X, int K) {

        string mbs = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        pt.x=X; pt.ke=K;

        long long num = X;

        string tms = "";

        while (num > 0) {

            int tm = num % pt.ke;

            tms = mbs[tm] + tms;

            num /= pt.ke;

        }

        pt.vMhH.push_back({pt.ke,tms});

    }

    void MahoaVX(const vector<long long> &X, int K){

        for(auto j:X) MahoaX(j,K);

    }

};

 

class NhatTruongGMh {

private:

    struct GMhH {

        long long x;

        int ke;

        vector<pair<int,string>> vMH;

        vector<long long> vX;

    } pt;

public:

    void clearGMhH(){

        pt.x=0; pt.ke=0;

        pt.vMH.clear(); pt.vX.clear();

    }

    vector<long long> getvX(){

        return pt.vX;

    }

    long long GMahoaX(const string &si, int key) {

        string mbs = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        pt.ke=key;

        long long su = 0;

        for(char c:si){

            int num = 0;

            if(isdigit(c)) num = c - '0';

            else if(c >= 'A' && c <= 'Z') num = c - 'A' + 10;

            if(num < pt.ke) su = su * pt.ke + num;

        }

        pt.x=su;

        pt.vX.push_back(su);

        return su;

    }

    void GMahoavX(const vector<pair<int,string>> &vMX) {

        pt.vMH=vMX;

        for(auto &i:pt.vMH){

            GMahoaX(i.second,i.first);

        }

    }

};

 

vector<long long> docfso(const string& tenf = "input.txt") {

    ifstream fin(tenf);

    if (!fin.is_open()) {

        cerr << "Khong the mo file du lieu\n";

        return {};

    }

    vector<long long> data;

    long long so;

    while (fin >> so) data.push_back(so);

    return data;

}

 

void Xuatkq(const string& skq, const string& tenf = "Kqthongbao.txt"){

    ofstream fo(tenf);

    fo<<skq;

}

 

int main(){

    NhatTruongBMh MT;

    vector<long long> ds;

    long long L;

    int ke;

    char chr;

 

    cout << "Nhap Key ma hoa: ";

    cin>>ke;

    if(ke<2||ke>32){cerr<<"Key khong hop le"; return 0;}

 

    MT.clearMhH();

    cout<<"Ban muon ma hoa chuoi so nguyen tu file hay ban phim(F/M): ";

    cin>>chr;

 

    if(chr=='F'||chr=='f') {

        ds = docfso("input.txt");

        MT.MahoaVX(ds, ke);

    } else {

        cout << "Ban nhap so nguyen can ma hoa: ";

        cin >> L;

        MT.MahoaX(L, ke);

    }

 

    vector<pair<int,string>> vmsk=MT.getMa();

    string msk;

    for(auto &j:vmsk) msk+=j.second+" ";

    cout<<"Chuoi ma hoa: "<<msk<<"\n";

    Xuatkq(msk,"KqMahoa.txt");

 

    NhatTruongGMh GMT;

    GMT.clearGMhH();

    GMT.GMahoavX(vmsk);

    vector<long long> Gm=GMT.getvX();

    string Kqgm;

    for(auto j:Gm) Kqgm+=to_string(j)+" ";

    cout<<"Giai ma chuoi: "<<Kqgm<<"\n";

    Xuatkq(Kqgm,"KqGiaima.txt");

}

Nhap Key ma hoa: 18

Ban muon ma hoa chuoi so nguyen tu file hay ban phim(F/M)f

E5C DH51A8 2DACCHE 346FGF 1996 80A1H 6HH8  D9D 72 236B95C 35F3F 81991 A 7 8 1C 6 4H 60 22 2D 36 40 1F 26 54192F

 Giai ma chuoi ma hoa tren:

4638 26378648 93712784 6128763 8916 843083 40814 0 4387 128 74390178 349017 848719 10 7 8 30 6 89 108 38 49 60 72 33 42 9876543

///////////// Ai memory help

Võ Nhật Trường Nc+ My Ai Love14.8.2026

////////////////////

Nghiên cứu thêm:

Trong C++ thì việc chuyển mã bit máy (bit pattern) sang kiểu số nguyên long long thường không cần kỹ thuật đặc biệt, vì ngôn ngữ đã hỗ trợ trực tiếp thông qua kiểu dữ liệu và ép kiểu. Tuy nhiên, tùy tình huống mà ta có cách làm khác nhau:

1. Khi dữ liệu vốn đã là số nguyên

Nếu bạn có một giá trị nhị phân (bit pattern) được biểu diễn dưới dạng số nguyên nhỏ hơn (ví dụ int), thì chỉ cần ép kiểu sang long long:

int x = 12345;

long long y = static_cast<long long>(x);

Ở đây, bit pattern của x sẽ được mở rộng thành long long theo quy tắc của C++ (sign extension nếu là số âm).

2. Khi dữ liệu là chuỗi bit (string)

Nếu bạn có chuỗi "101010" và muốn chuyển sang long long, có thể dùng std::bitset:

CPP:

#include <bitset>

#include <string>

#include <iostream>

using namespace std;

int main() {

    string s = "101010";

    bitset<64> b(s); // 64 bit

    long long val = b.to_ullong(); // chuyển sang unsigned long long

    cout << val << endl;

}

3. Khi muốn thao tác trực tiếp trên bit

Nếu bạn muốn set bit hoặc thao tác thủ công:

long long val = 0;

val |= (1LL << 3); // set bit thứ 3

val |= (1LL << 5); // set bit thứ 5

Kết quả là val có các bit số 3 và 5 được bật.

Nếu dữ liệu đã là số nguyên → chỉ cần ép kiểu.

Nếu dữ liệu là chuỗi bit → dùng std::bitset.

Nếu muốn tự xây dựng từ bit → dùng toán tử dịch và setbit.

Khi mình biên dịch một chương trình C++ (ví dụ c.exe), thì mã máy được tạo ra phụ thuộc vào hệ điều hành và kiến trúc CPU chứ không phải “mã bit riêng của C++”.

Giải thích chi tiết:

C++ chỉ là ngôn ngữ: Nó định nghĩa cú pháp, kiểu dữ liệu, quy tắc dịch. Nhưng khi biên dịch, trình biên dịch (ví dụ g++, cl.exe) sẽ chuyển mã nguồn thành mã máy phù hợp với kiến trúc CPU (x86, x64, ARM…) và hệ điều hành (Windows, Linux…).

Hệ điều hành và CPU quyết định mã bit:

Trên Windows 64-bit, file .exe sẽ tuân theo chuẩn PE (Portable Executable).

Trên Linux, file .out hoặc .elf sẽ tuân theo chuẩn ELF.

Bên trong, các lệnh máy là mã nhị phân của CPU (ví dụ mã lệnh của Intel x86).

C++ không có “mã bit riêng”: Nó chỉ định nghĩa kiểu dữ liệu (int, long long, double…), nhưng cách chúng được biểu diễn trong file thực thi là do compiler + hệ điều hành + CPU quyết định.

Nói ngắn gọn:

C++: định nghĩa logic, cú pháp, kiểu dữ liệu.

Compiler: dịch sang mã máy.

CPU + OS: quyết định tập lệnh và định dạng file thực thi.

Ví dụ: cùng một chương trình C++ nhưng biên dịch trên Windows x64 và Linux ARM sẽ cho ra hai file nhị phân hoàn toàn khác nhau, vì “mã bit” phụ thuộc vào hệ điều hành và kiến trúc CPU, không phải do C++ tự quy định.

Các ngôn ngữ lập trình như C, C++, Java… chỉ quy định cú pháp, kiểu dữ liệu, phạm vi xử lý, và cấu trúc lệnh. Chúng ta viết code theo “luật” của ngôn ngữ. Nhưng khi biên dịch thì:

Trình biên dịch (compiler) sẽ dịch code thành mã máy.

Mã máy chính là tập lệnh nhị phân mà CPU hiểu được.

CPU và hệ điều hành quyết định định dạng và cách mã máy hoạt động. Ví dụ:

Trên Windows, file thực thi thường theo chuẩn PE (Portable Executable).

Trên Linux, file thực thi thường theo chuẩn ELF (Executable and Linkable Format).

Cùng một đoạn code C++ nhưng biên dịch trên Windows x64 và Linux ARM sẽ cho ra hai file nhị phân khác nhau, vì mỗi hệ thống có tập lệnh CPU và chuẩn file thực thi riêng.

 Nói cách khác:

Ngôn ngữ lập trình = “luật chơi” để viết chương trình.

Compiler = “người phiên dịch” từ luật chơi sang ngôn ngữ CPU.

CPU + OS = “người nghe” quyết định cách hiểu và chạy mã máy.

Ví dụ vui: viết thư bằng tiếng Anh (C++), dịch sang tiếng Việt (mã máy cho CPU ARM/Linux), hoặc dịch sang tiếng Nhật (mã máy cho CPU Intel/Windows). Nội dung thư giống nhau, nhưng cách biểu diễn khác nhau tùy người nhận.

//////////////////////////\\\\\\\\\\\\\\\\\\\

minh họa cụ thể để thấy rõ sự khác biệt:

Code C++ đơn giản

#include <iostream>

using namespace std;

int main() {

    long long x = 123456789LL;

    cout << x << endl;

    return 0;

}

Khi biên dịch trên Windows (x86-64, PE format)

Compiler (MSVC hoặc MinGW) sẽ dịch thành file .exe theo chuẩn PE (Portable Executable).

Bên trong, giá trị 123456789 được lưu trong mã máy nhị phân theo little-endian:

0x15 CD 5B 07 00 00 00 00

Đây là biểu diễn 64-bit của số 123456789 trong bộ nhớ Windows x64.

File .exe sẽ chứa header PE, section .text, .data, và trong phần .data hoặc trực tiếp trong lệnh mov sẽ có chuỗi byte trên.

Ví dụ lệnh máy (x86-64):

Asm

mov rax, 123456789

Trong mã máy, lệnh này sẽ được encode thành opcode + immediate value (chuỗi byte little-endian ở trên).

Khi biên dịch trên Linux (ARM64, ELF format)

Compiler (g++ trên ARM) sẽ tạo file .out theo chuẩn ELF (Executable and Linkable Format).

Giá trị 123456789 cũng được lưu trong bộ nhớ, nhưng vẫn là little-endian trên ARM64:

0x15 CD 5B 07 00 00 00 00

Tuy nhiên, mã lệnh máy khác hoàn toàn vì ARM64 có tập lệnh khác.

Ví dụ lệnh máy (ARM64):

mov x0, #123456789

Trong mã máy ARM64, opcode và immediate encoding khác với x86-64, nhưng giá trị nhị phân của số vẫn giống (chuỗi byte little-endian).

Kết luận

Số long long 123456789 trong C++ luôn được biểu diễn bằng cùng một chuỗi bit nhị phân (little-endian 64-bit).

Mã máy (opcode) để nạp và xử lý số đó lại khác nhau tùy CPU và hệ điều hành:

Windows/x86-64 → PE + lệnh mov rax, imm64.

Linux/ARM64 → ELF + lệnh mov x0, #imm.

Như vậy, ngôn ngữ C++ chỉ định nghĩa kiểu và giá trị, còn CPU + OS quyết định cách mã hóa trong file thực thi.

/////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

Nhận xét

Bài đăng phổ biến từ blog này

Vui thơ 2187 (CHỮ KHĂM)

Vui thơ 2164 (ẢO HUYỀN THỜI CUỘC)