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
Đăng nhận xét