Professional Documents
Culture Documents
KTLT 2017
KTLT 2017
MỤC LỤC
A - Danh sách.....................................................................................................11
Bài 1.................................................................................................................11
Bài 2.................................................................................................................14
Bài 3.................................................................................................................21
Bài 4.................................................................................................................27
Bài 5.................................................................................................................29
B- Sắp xếp...........................................................................................................32
C. Giải thuật sinh và quay lui..............................................................................36
Dạng dễ............................................................................................................36
Bài 6.................................................................................................................36
Bài 8.................................................................................................................38
Dạng trung bình...............................................................................................39
Bài 2.................................................................................................................39
Bài 3.................................................................................................................41
Bài 4.................................................................................................................43
Bài 5.................................................................................................................45
Bài 9.................................................................................................................47
Dạng bài khó....................................................................................................48
Bài 1.................................................................................................................48
Bài 10...............................................................................................................50
Bài 11...............................................................................................................52
Dạng bài rất khó...............................................................................................54
Bài 7.................................................................................................................54
1
Photo Huyền Trang
A. Danh sách.
1- Xây dựng các thao tác sau với danh sách cài đặt bằng mảng có cấu trúc:
struct CanBo { long MaSo; char HoTen[8]; };
struct DanhSach { CanBo DSCB[100]; int TongSoCB; };
1. Khởi tạo danh sách
2. Kiểm tra danh sách rỗng. đầy
3. Thêm một phần tử vào đầu danh sách.
4. Thêm một phần tử vào cuối danh sách.
5. Thêm một phần tử vào sau vị trí thứ k.
6. Thêm một phần tử vào trước vị trí thứ k
7. Xoá phần tử đầu danh sách.
8. Xoá phần tử cuối danh sách.
9. Xoá phần tử thứ k.
10.Xoá toàn bộ danh sách.
11.Xem danh sách trên màn hình
12.Tìm một phần tử theo MaSo cán bộ
2- Xây dựng các thao tác sau với danh sách liên kết đơn có cấu trúc:
struct CanBo { long MaSo; char HoTen[8]; };
struct Node { CanBo Info; Node *Next; };
struct DanhSach { Node *PFirst, *PLast; };
1. Khởi tạo danh sách
2. Kiểm tra danh sách rỗng
3. Thêm một phần tử vào đầu danh sách.
4. Thêm một phần tử vào cuối danh sách.
5. Thêm một phần tử vào sau vị trí thứ k.
6. Thêm một phần tử vào trước vị trí thứ k
7. Xoá phần tử đầu danh sách.
8. Xoá phần tử cuối danh sách.
9. Xoá phần tử thứ k.
10.Xoá toàn bộ danh sách.
11.Xem danh sách trên màn hình
12.Tìm một phần tử theo MaSo cán bộ
3- Xây dựng các thao tác sau với danh sách liên kết kép có cấu trúc:
struct CanBo { long MaSo; char HoTen[8]; };
struct Node { CanBo Info; Node *Next, *Pre; };
struct DanhSach { Node *PFirst, *PLast; };
1. Khởi tạo danh sách
2. Kiểm tra danh sách rỗng
3. Thêm một phần tử vào đầu danh sách.
4. Thêm một phần tử vào cuối danh sách.
2
Photo Huyền Trang
5. Thêm một phần tử vào sau vị trí thứ k.
6. Thêm một phần tử vào trước vị trí thứ k
7. Xoá phần tử đầu danh sách.
8. Xoá phần tử cuối danh sách.
9. Xoá phần tử thứ k.
10.Xoá toàn bộ danh sách.
11.Xem danh sách trên màn hình
12.Tìm một phần tử theo MaSo cán bộ
4- Xây dựng các thao tác sau với ngăn xếp bằng danh sách liên kết đơn có cấu
trúc:
struct CanBo { long MaSo; char HoTen[8]; };
struct Node { CanBo Info; Node *Next; };
struct NganXep { Node *PHead; };
1. Khởi tạo ngăn xếp
2. Kiểm tra ngăn xếp rỗng
3. Thêm một phần tử vào ngăn xếp.
4. Lấy ra một phần tử từ ngăn xếp .
5- Xây dựng các thao tác sau với hàng đợi bằng danh sách liên kết đơn có cấu
trúc:
struct CanBo { long MaSo; char HoTen[8]; };
struct Node { CanBo Info; Node *Next; };
struct HangDoi { Node *PFirst, *PLast; };
1. Khởi tạo hàng đợi
2. Kiểm tra hàng đợi rỗng
3. Thêm một phần tử vào hàng đợi.
4. Lấy ra một phần tử từ hàng đợi .
B. Sắp xếp.
Sắp xếp dãy số thực a[] tăng dần ( hoặc giảm dần) bằng các giải thuật:
1. Sắp xếp chọn: void SelectionSort(float a[], int n);
2. Sắp xếp chèn: void InsertionSort(float a[], int n);
3. Sắp xếp nổi bọt: void BubbleSort(float a[], int n);
4. Sắp xếp nhanh: void QuickSort(float a[], int n);
5. Sắp xếp trộn: void MergeSort(float a[], int n);
6. Sắp xếp vun đống void HeapSort(float a[], int n);
8. Một xâu nhị phân độ dài n được gọi là thuận nghịch hay đối xứng nếu đảo
ngược xâu nhị phân đó ta vẫn nhận được chính nó. Cho số tự nhiên n (n nhập từ
bàn phím). Hãy viết chương trình liệt kê tất cả các xâu nhị phân thuận nghịch có
độ dài n. Các xâu nhị phân tìm được ghi lại trong file ketqua.out theo khôn dạng:
Dòng đầu tiên ghi lại số K là số các xâu thuận nghịch có độ dài n tìm
được;
K dòng kế tiếp ghi lại mỗi dòng một xâu nhị phân thuận nghịch có độ dài
n. Hai phần tử khác nhau của xâu thuận nghịch được ghi cách nhau một
vài khoảng trống.
Ví dụ với n = 4 ta tìm được 4 xâu nhị phân thuận nghịch như dưới đây.
ketqua.out
4
5
Photo Huyền Trang
0 0 0 0
0 1 1 0
1 0 0 1
1 1 1 1
9. Cho một hình chữ nhật gồm m n hình vuông đơn vị (n, m được nhập từ bàn
phím). Hãy liệt kê tất cả các đường đi từ đỉnh cuối của ô vuông cuối cùng phía
bên trái đến đỉnh đầu của ô vuông trên cùng phía bên phải. Biết mỗi bước đi chỉ
đuợc phép dịch chuyển sang bên phải (ký hiệu là bước 1) hoặc lên trên (ký hiệu
là bước 0) theo các cạnh của hình vuông đơn vị. Các đường đi tìm được ghi lại
trong file ketqua.out theo khuôn dạng sau:
Dòng đầu tiên ghi lại một số tự nhiên là số các đường đi tìm được;
Những dòng kế tiếp mỗi dòng ghi lại một đường đi, bước dịch phải (1) và
bước lên trên (0) của mỗi đường đi, hai bước khác nhau được ghi cách
nhau bởi một vài ký tự trống.
Ví dụ với m = 2, n = 3 như hình vuông dưới đây sẽ cho ta file ketqua.out tương
ứng.
Ketqua.Out
10
0 0 1 1 1
0 1 0 1 1
0 1 1 0 1
0 1 1 1 0
1 0 0 1 1
1 0 1 0 1
1 0 1 1 0
1 1 0 0 1
1 1 0 1 0
1 1 1 0 0
10. Cho dãy gồm n số tự nhiên phân biệt a1, a2, .., an và số tự nhiên B. Hãy viết
chương trình liệt kê tất cả các phần tử của tập
n
D x1 , x 2 , , x n : ai xi B, xi 0,1 , i 1,2,..., n ;
i 1
Dữ liệu vào cho bởi file data.in theo khuôn dạng như sau:
Dòng đầu tiên ghi lại hai số tự nhiên n và B. Hai số được viết cách nhau
bởi một vài khoảng trống.
6
Photo Huyền Trang
Dòng kế tiếp ghi lại n số nguyên dương a1, a2,..,an. Hai số khác nhau
được viết cách nhau bởi một vài kí tự trống.
Kết quả ra ghi lại trong file ketqua.out theo khuôn dạng sau:
Dòng đầu tiên ghi lại số tự nhiên k là số phần tử của tập D.
k dòng tiếp theo mỗi dòng ghi lại một vector nhị phân x = (x1, x2 ,.., xn) là
phần tử của D. Hai thành phần khác nhau của vector x được viết cách
nhau bởi một vài khoảng trống.
Ví dụ với n =7, B = 25, { a1, a2, a3, a4, a5, a6, a7} = {5, 10, 15, 20, 25, 30, 35}
trong file data.in sẽ cho ta 3 phần tử của tập D tương ứng với 3 vector nhị phân
độ dài n trong file ketqua.out dưới đây:
Data.in Ketqua.Out
7 25 3
5 10 15 20 25 30 35 0 0 0 0 1 0 0
1 0 0 1 0 0 0
0 1 1 0 0 0 0
11. Cho dãy A[] gồm N số tự nhiên khác nhau và số tự nhiên K. Hãy viết
chương trình liệt kê tất cả các dãy con của dãy số A[] sao cho tổng các phần tử
trong dãy con đó đúng bằng K. Dữ liệu vào cho bởi file dayso.in theo khuôn
dạng sau:
Dòng đầu tiên ghi lại số tự nhiên N và K; hai số được viết cách nhau bởi
một vài khoảng trống;
Dòng kế tiếp ghi lại N số của dãy số A[], hai số được viết cách nhau một
vài khoảng trống.
Các dãy con thoả mãn điều kiện tìm được ghi lại trong file ketqua.out theo
khuôn dạng sau:
Dòng đầu tiên ghi lại số các dãy con có tổng các phần tử đúng bằng K tìm
được;
Những dòng kế tiếp mỗi dòng ghi lại một dãy con. Hai phần tử khác nhau
của dãy con được viết cách nhau bởi một vài khoảng trống.
Ví dụ dưới đây sẽ minh hoạ cho file dayso.in và ketqua.out của bài toán.
Dayso.in Ketqua.out
5 50 3
5 10 15 20 25 10 15 25
5 20 25
5 10 15 20
7
Photo Huyền Trang
12. Cho dãy A[] gồm N số tự nhiên khác nhau, số tự nhiên K và số tự nhiên B.
Hãy viết chương trình liệt kê tất cả các dãy con K phần tử của dãy số A[] sao
cho tổng các phần tử trong dãy con đó đúng bằng B. Dữ liệu vào cho bởi file
dayso.in theo khuôn dạng sau:
Dòng đầu tiên ghi lại ba số tự nhiên N, K, B; Ba số được viết cách nhau
bởi một vài khoảng trống;
Dòng kế tiếp ghi lại N số của dãy số A[], hai số được viết cách nhau một
vài khoảng trống.
Các dãy con K phần tử thoả mãn điều kiện tìm được ghi lại trong file ketqua.out
theo khuôn dạng sau:
Dòng đầu tiên ghi lại số các dãy con K phần tử có tổng các phần tử đúng
bằng tìm được;
Những dòng kế tiếp mỗi dòng ghi lại một dãy con. Hai phần tử khác nhau
của dãy con được viết cách nhau bởi một vài khoảng trống.
Ví dụ dưới đây sẽ minh hoạ cho file dayso.in và ketqua.out của bài toán.
Dayso.in Ketqua.out
5 3 50 2
5 10 15 20 25 10 15 25
5 20 25
13. Cho dãy gồm N số nguyên phân biệt A[] = {a1, a2, .., aN } và số tự nhiên K (
KN100). Hãy viết chương trình liệt kê tất cả các dãy con K phần tử tăng dần
của dãy số A[]. Dữ liệu vào cho bởi file dayso.in theo khuôn dạng sau:
i. Dòng đầu tiên ghi lại hai số tự nhiên N, K. Hai số được viết
cách nhau một vài khoảng trống;
ii. Những dòng kế tiếp ghi lại N số nguyên của dãy số A[], hai
số khác nhau được viết cách nhau một vài khoảng trống.
Các dãy con K phần tử tăng dần của dãy số A[] tìm được ghi lại trong file
ketqua.out theo khuôn dạng:
Dòng đầu tiên ghi lại số tự nhiên M là số các dãy con K phần tử tăng dần
của dãy số A[] tìm được;
M dòng kế tiếp, mỗi dòng ghi lại một dãy con. Hai phần tử khác nhau của
dãy con được viết cách nhau bởi một vài khoảng trống.
Ví dụ với file dayso.in dưới đây sẽ cho ta file ketqua.out tương ứng.
dayso.in ketqua.out
5 3 7
2 5 15 10 20 2 5 15
2 5 10
8
Photo Huyền Trang
2 5 20
2 15 20
2 10 20
5 15 20
5 10 20
14. Cho ma trận vuông C i,j cấp N (1 i, j N100) gồm N2 số tự nhiên và số tự
nhiên K(Các số không nhất thiết phải khác nhau) ghi lại trong file matran.in
theo khuôn dạng sau:
Dòng đầu tiên ghi lại số tự nhiên N và K. Hai số được viết cách nhau
một vài khoảng trống;
N dòng kế tiếp ghi lại ma trận vuông Ci,j; Hai phần tử khác nhau của
ma trận được ghi cách nhau bởi một vài khoảng trống.
Hãy viết chương trình lấy mỗi hàng, mỗi cột duy nhất một phần tử sao cho
tổng các phần tử này đúng bằng K. Kết quả tìm được ghi lại trong file
ketqua.out theo khuôn dạng:
Dòng đầu tiên ghi lại số các nghiệm tìm được của bài toán.
Những dòng kế tiếp, mỗi dòng ghi lại N số là một phương án của bài
toán, số thứ i ghi lại giá trị j tương ứng với chỉ số cột của phần tử
được lựa chọn. Các số được viết cách nhau một vài khoảng trống.
Ví dụ về file matran.in và ketqua.out:
matran.in ketqua.out
6 180 6
10 64 57 29 18 15 2 1 4 6 3 5
34 20 19 30 16 12 3 6 1 5 4 2
57 49 40 16 11 19 3 6 2 4 5 1
29 21 46 26 21 18 4 3 2 6 1 5
28 16 11 21 21 37 5 3 2 6 1 4
15 12 15 48 37 30 6 3 2 5 1 4
15. Cho ma trận vuông C = (cij) cấp N (1 i, j N100) gồm N2 số tự nhiên (các
số không nhất thiết phải khác nhau) ghi lại trong file matran.in theo khuôn dạng
sau :
Dòng đầu tiên ghi lại số tự nhiên N là cấp của ma trận vuông C;
N dòng kế tiếp ghi lại ma trận vuông C = (cij); Hai phần tử khác nhau
của ma trận được ghi cách nhau bởi một vài khoảng trống.
Hãy viết chương trình lấy trên mỗi hàng, mỗi cột duy nhất một phần tử sao
cho tổng các phần tử này là lớn nhất. Kết quả tìm được ghi lại trong file
ketqua.out theo khuôn dạng:
Dòng đầu tiên ghi lại tổng giá trị lớn nhất của N phần tử tìm được;
9
Photo Huyền Trang
N dòng kế tiếp, mỗi dòng ghi lại ba số i, j, cij tương ứng với chỉ số
hàng, chỉ số cột và giá trị phần tử tương ứng của ma trận. Ba số được
viết cách nhau một vài khoảng trống.
Ví dụ về file viec.in và ketqua.out:
matran.in ketqua.out
6 238
10 14 27 29 18 27 1 6 27
34 20 19 34 16 12 2 1 34
57 37 40 57 11 19 3 4 57
29 21 46 26 21 18 4 3 46
27 37 11 21 21 37 5 2 37
55 12 15 48 37 35 6 5 37
10
Photo Huyền Trang
Bài làm
A - Danh sách
Bài 1
#include<iostream>
using namespace std;
struct CanBo {long MaSo ; char HoTen[8];
};
struct DanhSach { CanBo DSCB[100]; int TongSoCB;
};
void KhoiTao(DanhSach &d)
{
{
cout<<"Nhap So Can Bo : ";
cin>>d.TongSoCB;
}
while (d.TongSoCB>100);
for (int i=0;i<d.TongSoCB;i++)
{
cout<<"Nhap MaSo HoTen : ";
cin>>d.DSCB[i].MaSo>>d.DSCB[i].HoTen;
}
}
void Xem(DanhSach d)
{
for (int i=0;i<d.TongSoCB;i++)
cout<<d.DSCB[i].MaSo<<"\t"<<d.DSCB[i].HoTen<<"\n";
}
int KTRong(DanhSach d)
{
return (d.TongSoCB==0);
}
int KTDay(DanhSach d)
{
return (d.TongSoCB==100);
}
void ThemDau(DanhSach &d)
{
CanBo tmp;
cout<<"Nhap MaSo HoTen : ";
cin>>tmp.MaSo>>tmp.HoTen;
d.TongSoCB=d.TongSoCB+1;
11
Photo Huyền Trang
for(int i=d.TongSoCB;i>0;i--) d.DSCB[i]=d.DSCB[i-1];
d.DSCB[0]=tmp;
}
void ThemCuoi(DanhSach &d)
{
cout<<"Nhap MaSo HoTen : ";
int n=d.TongSoCB;
cin>>d.DSCB[n].MaSo>>d.DSCB[n].HoTen;
d.TongSoCB++;
}
void ThemTruocK(DanhSach &d,int &k)
{
cout<<"Nhap k : ";
cin>>k;
for (int i=d.TongSoCB;i>k;i--) d.DSCB[i]=d.DSCB[i-1];
cout<<"Nhap MaSo HoTen : ";
cin>>d.DSCB[k].MaSo>>d.DSCB[k].HoTen;
d.TongSoCB++;
}
void ThemSauK (DanhSach &d,int &k)
{
cout<<"Nhap k : ";
cin>>k;
for (int i=d.TongSoCB;i>k+1;i--) d.DSCB[i]=d.DSCB[i-1];
cout<<"Nhap MaSo HoTen : ";
cin>>d.DSCB[k+1].MaSo>>d.DSCB[k+1].HoTen;
d.TongSoCB++;
}
void XoaDau(DanhSach &d)
{
for (int i=0;i<d.TongSoCB-1;i++) d.DSCB[i]=d.DSCB[i+1];
d.TongSoCB--;
}
void XoaCuoi(DanhSach &d)
{
d.TongSoCB--;
}
void XoaK(DanhSach &d,int k)
{
cout<<"Nhap K : ";
cin>>k;
12
Photo Huyền Trang
for (int i=k;i<d.TongSoCB-1;i++) d.DSCB[i]=d.DSCB[i+1];
d.TongSoCB--;
}
void XoaToanBo(DanhSach &d)
{
d.TongSoCB=0;
}
void TimTheoMS(DanhSach d)
{
long MS;
cout<<"Nhap MaSo : ";
cin>>MS;
for (int i=0;i<d.TongSoCB;i++)
if (MS==d.DSCB[i].MaSo)
cout<<d.DSCB[i].MaSo<<"\t"<<d.DSCB[i].HoTen<<"\n";
}
int main()
{
int t=1; DanhSach d; int k; char c;
while(t)
{
cout<<"0. Thoat\n";
cout<<"1. Khoi Tao\n";
cout<<"2. Xem\n";
cout<<"3. Them Dau\n";
cout<<"4. Them Cuoi\n";
cout<<"5. Them Truoc Vi Tri K\n";
cout<<"6. Them Sau Vi Tri K\n";
cout<<"7. Xoa Dau\n";
cout<<"8. Xoa Cuoi\n";
cout<<"9. Xoa Vi Tri K\n";
cout<<"X. Xoa Toan Bo Danh Sach\n";
cout<<"S. Tim Can Bo Theo Ma So\n";
cin>>c;
switch(c)
{
case '0' :
t=0;
break;
case '1' :
KhoiTao(d);
13
Photo Huyền Trang
break;
case '2' :
Xem(d);
break;
case '3' :
if (!KTDay(d)) ThemDau(d); else cout<<"Danh Sach Day\n";
break;
case '4' :
if (!KTDay(d)) ThemCuoi(d); else cout<<"Danh Sach Day\n";
break;
case '5' :
if (!KTDay(d)) ThemTruocK(d,k); else cout<<"Danh Sach Day\n";
break;
case '6' :
if (!KTDay(d)) ThemSauK(d,k); else cout<<"Danh Sach Day\n";
break;
case '7' :
if (KTRong(d)) cout<<"Danh Sach Rong\n"; else XoaDau(d);
break;
case '8' :
if (KTRong(d)) cout<<"Danh Sach Rong\n"; else XoaCuoi(d);
break;
case '9' :
if (KTRong(d)) cout<<"Danh Sach Rong\n"; else XoaK(d,k);
case 'x' :
if (KTRong(d)) cout<<"Danh Sach Rong\n"; else XoaToanBo(d);
break;
case 's' :
if (KTRong(d)) cout<<"Danh Sach Rong\n"; else TimTheoMS(d);
break;
}
}
}
Bài 2
#include<iostream>
using namespace std;
struct CanBo
{
long MaSo;
14
Photo Huyền Trang
char HoTen[8];
};
struct Node
{
CanBo Info;
Node *Next;
};
struct DanhSach
{
Node *PFirst, *PLast;
};
void KhoiTao(DanhSach &d)
{
d.PFirst=d.PLast=NULL;
}
int KTRong(DanhSach d)
{
return(d.PFirst==NULL);
}
void Nhap(CanBo &x)
{
cout<<"Nhap MaSo HoTen : ";
cin>>x.MaSo>>x.HoTen;
}
void NhapK(int &k)
{
cout<<"Nhap k : ";
cin>>k;
}
Node *MakeNode(CanBo x)
{
Node *p = new Node;
p->Info=x;
return p;
}
void ThemDau(DanhSach &d,CanBo x)
{
Node *p = MakeNode(x);
p->Next=d.PFirst;
if (KTRong(d))
{
15
Photo Huyền Trang
d.PFirst=d.PLast=p;
return;
}
d.PFirst=p;
}
void Xem(DanhSach d)
{
Node *p=d.PFirst;
while(p!=NULL)
{
cout<<p->Info.MaSo<<"\t"<<p->Info.HoTen<<"\n";
p=p->Next;
}
}
void ThemCuoi(DanhSach &d,CanBo x)
{
Node *p= MakeNode(x);
p->Next=NULL;
if (KTRong(d))
{
d.PFirst=d.PLast=p;
return;
}
d.PLast->Next=p;
d.PLast=p;
}
int DemCB(DanhSach d)
{
Node *p=d.PFirst;
int i=0;
while (p!=NULL)
{
p=p->Next;
i++;
}
return i;
}
void ThemSauK(DanhSach &d,int k)
{
if (k<0||k>DemCB(d)) return;
CanBo x;
16
Photo Huyền Trang
Nhap(x);
if (k==0)
{
ThemDau(d,x);
return;
}
Node *q=d.PFirst;
for (int i=1;i<k;i++) q=q->Next;
if (q->Next==NULL)
{
ThemCuoi(d,x);
return;
}
Node *p=MakeNode(x);
p->Next=q->Next; q->Next=p;
}
void XoaDau(DanhSach &d)
{
if (KTRong(d)) return;
Node *p=d.PFirst;
d.PFirst=p->Next;
delete p;
if (d.PFirst==NULL) d.PLast=NULL;
}
void XoaCuoi(DanhSach &d)
{
if (KTRong(d)) return;
Node *p=d.PFirst;
if (p->Next==NULL)
{
delete p;
KhoiTao(d);
return;
}
Node *q= new Node;
while (p->Next!=NULL)
{
q=p;
p=p->Next;
}
q->Next=NULL;
17
Photo Huyền Trang
d.PLast=q;
delete p;
}
void XoaK(DanhSach &d,int k)
{
if (k<=0||k>DemCB(d)) return;
if(k==1)
{
XoaDau(d);
return;
}
Node *p=d.PFirst,*q;
for (int i=1;i<k;i++)
{
q=p;
p=p->Next;
}
if (p->Next==NULL)
{
XoaCuoi(d);
return;
}
q->Next=p->Next;
delete p;
}
void XoaDS(DanhSach &d)
{
if (KTRong(d)) return;
Node *p=d.PFirst;
while (d.PFirst!=NULL)
{
p=p->Next;
delete d.PFirst;
d.PFirst=p;
}
d.PLast=NULL;
}
void TimTheoMS(DanhSach d)
{
long MS;
cout<<"Nhap MaSo : ";
18
Photo Huyền Trang
cin>>MS;
Node *p=d.PFirst;
while(p!=NULL)
{
if (p->Info.MaSo==MS) cout<<p->Info.MaSo<<"\t"<<p-
>Info.HoTen<<"\n";
p=p->Next;
}
}
int main()
{
DanhSach d; int t=1; char c; CanBo x; int k;
while (t)
{
cout<<"0. Thoat\n";
cout<<"1. Khoi Tao\n";
cout<<"2. Them Dau\n";
cout<<"3. Xem\n";
cout<<"4. Them Cuoi\n";
cout<<"5. Them Sau Vi Tri K\n";
cout<<"6. Them Truoc Vi Tri K\n";
cout<<"7. Xoa Dau\n";
cout<<"8. Xoa Cuoi\n";
cout<<"9. Xoa Vi Tri K\n";
cout<<"X. Xoa Danh Sach\n";
cout<<"S. Tim Can Bo Theo Ma So\n";
cin>>c;
switch(c)
{
case '0' :
t=0;
break;
case '1' :
KhoiTao(d);
break;
case '2' :
Nhap(x);
ThemDau(d,x);
break;
case '3' :
Xem(d);
19
Photo Huyền Trang
break;
case '4' :
Nhap(x);
ThemCuoi(d,x);
break;
case '5' :
NhapK(k);
ThemSauK(d,k);
break;
case '6' :
NhapK(k);
ThemSauK(d,k-1);
break;
case '7' :
XoaDau(d);
break;
case '8' :
XoaCuoi(d);
break;
case '9' :
NhapK(k);
XoaK(d,k);
break;
case 'x' :
XoaDS(d);
break;
case 's' :
TimTheoMS(d);
break;
}
}
}
Bài 3
#include<iostream>
using namespace std;
struct CanBo
{
long MaSo; char HoTen[8];
};
struct Node
20
Photo Huyền Trang
{
CanBo Info; Node *Next, *Pre;
};
struct DanhSach
{
Node *PFirst,*PLast;
};
void KhoiTao(DanhSach &d)
{
d.PFirst=d.PLast=NULL;
}
int KTRong(DanhSach d)
{
return (d.PFirst==NULL);
}
void Nhap(CanBo &x)
{
cout<<"Nhap MaSo HoTen : ";
cin>>x.MaSo>>x.HoTen;
}
void NhapK(int &k)
{
cout<<"Nhap k : ";
cin>>k;
}
Node *MakeNode(CanBo x)
{
Node *p = new Node;
p->Info=x;
return p;
}
void ThemDau(DanhSach &d,CanBo x)
{
Node *p = MakeNode(x);
p->Next=d.PFirst; p->Pre=NULL;
if (KTRong(d))
{
d.PFirst=d.PLast=p;
return;
}
d.PFirst->Pre=p;
21
Photo Huyền Trang
d.PFirst=p;
}
void Xem(DanhSach d)
{
if (KTRong(d)) return;
Node *p=d.PFirst;
while(p!=NULL)
{
cout<<p->Info.MaSo<<"\t"<<p->Info.HoTen<<"\n";
p=p->Next;
}
}
void ThemCuoi(DanhSach &d,CanBo x)
{
Node *p = MakeNode(x); p->Pre=d.PLast; p->Next=NULL;
if (KTRong(d))
{
d.PFirst=d.PLast=p;
return;
}
d.PLast->Next=p;
d.PLast=p;
}
int DemCB(DanhSach d)
{
int dem=0;
Node *p=d.PFirst;
while(p!=NULL)
{
p=p->Next;
dem++;
}
return dem;
}
void ThemSauK(DanhSach &d,int k)
{
if (k<0||k>DemCB(d)) return;
CanBo x;
Nhap(x);
if (k==0)
{
22
Photo Huyền Trang
ThemDau(d,x);
return;
}
Node *q=d.PFirst;
for (int i=1;i<k;i++) q=q->Next;
if (q->Next==NULL)
{
ThemCuoi(d,x);
return;
}
Node *p=MakeNode(x);
p->Next=q->Next; p->Pre=q;
q->Next->Pre=p; q->Next=p;
}
void XoaDau(DanhSach &d)
{
if(KTRong(d)) return;
Node *p=d.PFirst;
if (p->Next==NULL)
{
delete p;
d.PFirst=d.PLast=NULL;
return;
}
p->Next->Pre=NULL;
d.PFirst=p->Next;
delete p;
}
void XoaCuoi(DanhSach &d)
{
if (KTRong(d)) return;
Node *p=d.PLast;
if (p->Pre==NULL)
{
delete p;
d.PFirst=d.PLast=NULL;
return;
}
p->Pre->Next=NULL;
d.PLast=p->Pre;
delete p;
23
Photo Huyền Trang
}
void XoaK(DanhSach &d,int k)
{
if (k<=0||k>DemCB(d)) return;
if(k==1)
{
XoaDau(d);
return;
}
Node *p=d.PFirst;
for (int i=1;i<k;i++) p=p->Next;
if (p->Next==NULL)
{
XoaCuoi(d);
return;
}
p->Pre->Next=p->Next;
p->Next->Pre=p->Pre;
delete p;
}
void XoaDS(DanhSach &d)
{
if (KTRong(d)) return;
Node *p=d.PFirst,*q;
while(p!=NULL)
{
q=p;
p=p->Next;
delete q;
}
d.PFirst=d.PLast=NULL;
}
void TimTheoMS(DanhSach d)
{
long MS;
cout<<"Nhap MaSo : ";
cin>>MS;
Node *p=d.PFirst;
while(p!=NULL)
{
24
Photo Huyền Trang
if (p->Info.MaSo==MS) cout<<p->Info.MaSo<<"\t"<<p-
>Info.HoTen<<"\n";
p=p->Next;
}
}
int main()
{
DanhSach d; int t=1; char c; CanBo x; int k;
while (t)
{
cout<<"0. Thoat\n";
cout<<"1. Khoi Tao\n";
cout<<"2. Them Dau\n";
cout<<"3. Xem\n";
cout<<"4. Them Cuoi\n";
cout<<"5. Them Sau Vi Tri K\n";
cout<<"6. Them Truoc Vi Tri K\n";
cout<<"7. Xoa Dau\n";
cout<<"8. Xoa Cuoi\n";
cout<<"9. Xoa Vi Tri K\n";
cout<<"X. Xoa Danh Sach\n";
cout<<"S. Tim Can Bo Theo Ma So\n";
cin>>c;
switch(c)
{
case '0' :
t=0;
break;
case '1' :
KhoiTao(d);
break;
case '2' :
Nhap(x);
ThemDau(d,x);
break;
case '3' :
Xem(d);
break;
case '4' :
Nhap(x);
ThemCuoi(d,x);
25
Photo Huyền Trang
break;
case '5' :
NhapK(k);
ThemSauK(d,k);
break;
case '6' :
NhapK(k);
ThemSauK(d,k-1);
break;
case '7' :
XoaDau(d);
break;
case '8' :
XoaCuoi(d);
break;
case '9' :
NhapK(k);
XoaK(d,k);
break;
case 'x' :
XoaDS(d);
break;
case 's' :
TimTheoMS(d);
break;
}
}
}
Bài 4
#include<iostream>
using namespace std;
struct CanBo
{
long MaSo;
char HoTen[8];
};
struct Node
{
CanBo Info;
Node *Next;
26
Photo Huyền Trang
};
struct NganXep
{
Node *PHead;
};
void KhoiTao(NganXep &d)
{
d.PHead=NULL;
}
int KTRong(NganXep d)
{
return(d.PHead==NULL);
}
void Nhap(CanBo &x)
{
cout<<"Nhap MaSo HoTen : ";
cin>>x.MaSo>>x.HoTen;
}
void Them(NganXep &d, CanBo x)
{
Node *p= new Node;
p->Info=x;
if (KTRong(d))
{
p->Next=NULL;
d.PHead=p;
return;
}
p->Next=d.PHead;
d.PHead=p;
}
void Xem (NganXep d)
{
if (KTRong(d)) return;
Node *p=d.PHead;
while(p!=NULL)
{
cout<<p->Info.MaSo<<"\t"<<p->Info.HoTen<<"\n";
p=p->Next;
}
}
27
Photo Huyền Trang
void LayRa (NganXep &d)
{
if (KTRong(d)) return;
Node *p=d.PHead;
cout<<p->Info.MaSo<<"\t"<<p->Info.HoTen<<"\n";
d.PHead=p->Next;
delete p;
}
int main()
{
NganXep d; int t=1; char c; CanBo x;
while(t)
{
cout<<"0. Thoat\n";
cout<<"1. Khoi Tao\n";
cout<<"2. Them\n";
cout<<"3. Xem\n";
cout<<"4. Lay Ra\n";
cin>>c;
switch(c)
{
case '0' :
t=0;
break;
case '1' :
KhoiTao(d);
break;
case '2' :
Nhap(x);
Them(d,x);
break;
case '3' :
Xem(d);
break;
case '4' :
LayRa(d);
break;
}
}
}
28
Photo Huyền Trang
Bài 5
#include<iostream>
using namespace std;
struct CanBo
{
long MaSo;
char HoTen[8];
};
struct Node
{
CanBo Info;
Node *Next;
};
struct HangDoi
{
Node *PFirst,*PLast;
};
void KhoiTao(HangDoi &d)
{
d.PFirst=d.PLast=NULL;
}
int KTRong(HangDoi d)
{
return(d.PFirst==NULL);
}
void Nhap(CanBo &x)
{
cout<<"Nhap MaSo HoTen : ";
cin>>x.MaSo>>x.HoTen;
}
void Them(HangDoi &d,CanBo x)
{
Node *p = new Node;
p->Info=x;p->Next=d.PFirst;
if (KTRong(d))
{
d.PFirst=d.PLast=p;
return;
}
d.PFirst=p;
}
29
Photo Huyền Trang
void Xem(HangDoi d)
{
if (KTRong(d)) return;
Node *p=d.PFirst;
while(p!=NULL)
{
cout<<p->Info.MaSo<<"\t"<<p->Info.HoTen<<"\n";
p=p->Next;
}
}
void LayRa(HangDoi &d)
{
if (KTRong(d)) return;
Node *p=d.PFirst,*q;
if(p->Next==NULL)
{
cout<<p->Info.MaSo<<"\t"<<p->Info.HoTen<<"\n";
delete p;
d.PFirst=d.PLast=NULL;
return;
}
while (p->Next!=NULL)
{
q=p;
p=p->Next;
}
q->Next=NULL;
d.PLast=q;
cout<<p->Info.MaSo<<"\t"<<p->Info.HoTen<<"\n";
delete p;
}
int main()
{
HangDoi d; int t=1; char c; CanBo x;
while (t)
{
cout<<"0. Thoat\n";
cout<<"1. Khoi Tao\n";
cout<<"2. Them\n";
cout<<"3. Xem\n";
cout<<"4. Lay Ra\n";
30
Photo Huyền Trang
cin>>c;
switch(c)
{
case '0' :
t=0;
break;
case '1' :
KhoiTao(d);
break;
case '2' :
Nhap(x);
Them(d,x);
break;
case '3' :
Xem(d);
break;
case '4' :
LayRa(d);
break;
}
}
}
B- Sắp xếp
while(low1+size<N)
{low2=low1+size;
up1=low2-1;
up2=(low2+size-1<N)? low2+size-1 : N-1;
Bài 8
#include<iostream>
using namespace std;
int B[100]; int n;
int MangThNghich(int *M,int n)
{
int r=1,s=n;
while(r<s)
{
if (M[r]!=M[s]) return 0;
r++;s--;
}
return 1;
}
void KhoiDau()
{
37
Photo Huyền Trang
for(int i=1;i<=n;i++) B[i]=0;
}
void XuatKetQua()
{
for(int i=1;i<=n;i++) cout<<B[i]<<" ";
cout<<"\n";
}
int stop = 0;
void SinhTiep()
{
int i=n;
while (i>0 && B[i]==1)
{
B[i]=0;
i--;
}
if (i==0) stop=1;
else B[i]=1;
}
void SinhLienTuc()
{
while (!stop)
{
if (MangThNghich(B,n)) XuatKetQua();
SinhTiep();
}
}
int main()
{
cout<<"Nhap n : ";
cin>>n;
KhoiDau();
SinhLienTuc();
38
Photo Huyền Trang
Dạng trung bình
Bài 2
#include<iostream>
#include<math.h>
using namespace std;
int B[100];
long GiaTriDaoNguoc(int *M,int n)
{
long s=0,t=1;
for (int i=1;i<=n;i++)
{
s=s+M[i]*t;
t=t*10;
}
return s;
}
int TongChuSo()
{
int s=0;
for (int i=1;i<=5;i++) s=s+B[i];
return s;
}
int NamChuSo()
{
if (B[1]==0) return 0;
return 1;
}
int SoNgTo(int a)
{
if (a<2) return 0;
if (a==2) return 1;
for(int i=2;i<=sqrt(a);i++)
if (a%i==0) return 0;
return 1;
}
int ChuSoNgTo()
{
for (int i=1;i<=5;i++)
if (!SoNgTo(B[i])) return 0;
return 1;
39
Photo Huyền Trang
}
void KhoiDau()
{
for(int i=1;i<=5;i++) B[i]=0;
}
void XuatKetQua()
{
for (int i=1;i<=5;i++) cout<<B[i]<<" ";
cout<<"\n";
}
int stop = 0;
void SinhTiep()
{
int i=5;
while(i>0&&B[i]==9)
{
B[i]=0;
i--;
}
if (i==0) stop=1;
else B[i]++;
}
void SinhLienTiep()
{
long a;
int b;
while(!stop)
{
a=GiaTriDaoNguoc(B,5);
b=TongChuSo();
if
(NamChuSo()&&SoNgTo(a)&&SoNgTo(b)&&ChuSoNgTo())
XuatKetQua();
SinhTiep();
}
}
int main()
{
KhoiDau();
SinhLienTiep();
}
40
Photo Huyền Trang
Bài 3
#include<iostream>
#include<math.h>
using namespace std;
int B[100];
int NamChuSo()
{
if (B[1]==0) return 0;
return 1;
}
int TongChuSo()
{
int s=0;
for (int i=1;i<=5;i++) s=s+B[i];
return s;
}
long TichChuSo()
{
long t=1;
for (int i=1;i<=5;i++) t=t*B[i];
return t;
}
int MangThNghich(int *M,int n)
{
int r=1,s=n;
while(r<s)
{
if (M[r]!=M[s]) return 0;
r++;s--;
}
return 1;
}
int A[30], n;
int DoiCoSo(int a,int k)
{
int i=1; A[1]=0;
while (a!=0)
{
A[i]=a%k;
a=a/k;
41
Photo Huyền Trang
i++;
}
return i-1;
}
int SoThNghich(long a)
{
n = DoiCoSo(a,10);
if (MangThNghich(A,n)) return 1;
return 0;
}
void KhoiDau()
{
for(int i=1;i<=5;i++) B[i]=0;
}
void XuatKetQua()
{
for (int i=1;i<=5;i++) cout<<B[i]<<" ";
cout<<"\n";
}
int stop = 0;
void SinhTiep()
{
int i=5;
while(i>0&&B[i]==9)
{
B[i]=0;
i--;
}
if (i==0) stop=1;
else B[i]++;
}
void SinhLienTiep()
{
while(!stop)
{
int s=TongChuSo();
long t=TichChuSo();
if
(NamChuSo()&&(SoThNghich(s)&&(n==2))&&(SoThNghich(t)&&(n==3)))
XuatKetQua();
SinhTiep();
42
Photo Huyền Trang
}
}
int main()
{
KhoiDau();
SinhLienTiep();
}
Bài 4
#include<iostream>
#include<math.h>
using namespace std;
int B[100];
int NamChuSo()
{
if (B[1]==0) return 0;
return 1;
}
int TongChuSo()
{
int s=0;
for (int i=1;i<=5;i++) s=s+B[i];
return s;
}
long TichChuSo()
{
long t=1;
for (int i=1;i<=5;i++) t=t*B[i];
return t;
}
int ChiaHet(long a, int k)
{
if (a%k==0) return 1;
return 0;
}
int KhongChuaR(int r)
{
for (int i=1;i<=5;i++)
if (B[i]==r) return 0;
return 1;
}
43
Photo Huyền Trang
void KhoiDau()
{
for(int i=1;i<=5;i++) B[i]=0;
}
void XuatKetQua()
{
for (int i=1;i<=5;i++) cout<<B[i]<<" ";
cout<<"\n";
}
int stop = 0;
void SinhTiep()
{
int i=5;
while(i>0&&B[i]==9)
{
B[i]=0;
i--;
}
if (i==0) stop=1;
else B[i]++;
}
void SinhLienTiep()
{
int p,q,r;
cout<<"Nhap P Q R = ";
cin>>p>>q>>r;
while(!stop)
{
int s=TongChuSo();
long t=TichChuSo();
if
(NamChuSo()&&ChiaHet(s,p)&&ChiaHet(t,q)&&KhongChuaR(r))
XuatKetQua();
SinhTiep();
}
}
int main()
{
KhoiDau();
SinhLienTiep();
}
44
Photo Huyền Trang
Bài 5
#include<iostream>
using namespace std;
int B[100];
void KhoiDau(int n)
{
for (int i=1;i<=n;i++) B[i]=0;
}
void XuatKetQua(int n)
{
for (int i=1;i<=n;i++) cout<<B[i]<<" ";
cout<<"\n";
}
int stop=0;
void SinhTiep(int n)
{
int i=n;
while(i>0&&B[i]==9)
{
B[i]=0;
i--;
}
if (i>0) B[i]=B[i]+1;
else stop=1;
}
int SoTuNhien()
{
if (B[1]==0) return 0;
return 1;
}
int MangThNghich(int *M,int n)
{
int r=1,s=n;
while(r<s)
{
if (M[r]!=M[s]) return 0;
r++;s--;
}
return 1;
45
Photo Huyền Trang
}
void SinhLienTiep()
{
for (int n=5;n<=9;n=n+2)
{
KhoiDau(n);
stop=0;
while(!stop)
{
if (SoTuNhien()&&MangThNghich(B,n)) XuatKetQua(n);
SinhTiep(n);
}
}
}
int main()
{
SinhLienTiep();
}
Bài 9
#include<iostream>
using namespace std;
int B[100]; int n;
int MangThNghich(int *M,int n)
{
int r=1,s=n;
while(r<s)
{
if (M[r]!=M[s]) return 0;
r++;s--;
}
return 1;
}
void KhoiDau()
{
for(int i=1;i<=n;i++) B[i]=0;
}
void XuatKetQua()
{
for(int i=1;i<=n;i++) cout<<B[i]<<" ";
cout<<"\n";
46
Photo Huyền Trang
}
int stop = 0;
void SinhTiep()
{
int i=n;
while (i>0 && B[i]==1)
{
B[i]=0;
i--;
}
if (i==0) stop=1;
else B[i]=1;
}
void SinhLienTuc()
{
while (!stop)
{
if (MangThNghich(B,n)) XuatKetQua();
SinhTiep();
}
}
int main()
{
cout<<"Nhap n : ";
cin>>n;
KhoiDau();
SinhLienTuc();
49
Photo Huyền Trang
Bài 10
#include<iostream>
#include<fstream>
using namespace std;
int D[100], A[100]; int C[100][100]; int n, b, dem=0;
void LayDuLieu()
{
ifstream file;
file.open("Data.in");
file>>n>>b;
for (int i=1;i<=n;i++) file>>A[i];
file.close();
}
void KhoiDau()
{
for(int i=1;i<=n;i++) D[i]=0;
}
void InKetQua()
{
cout<<dem<<"\n";
for (int i=1;i<=dem;i++)
{
for(int j=1;j<=n;j++)cout<<C[i][j]<<"\t";
cout<<"\n";
}
}
int TongBangB()
{
int s=0;
for (int i=1;i<=n;i++) s=s+A[i]*D[i];
if (s==b) return 1;
return 0;
}
int stop = 0;
void SinhTiep()
{
int i=n;
while (i>0 && D[i]==1)
{
D[i]=0;
i--;
50
Photo Huyền Trang
}
if (i==0) stop=1;
else D[i]=1;
}
void SinhLienTuc()
{
while (!stop)
{
if (TongBangB())
{
dem++;
for (int j=1;j<=n;j++) C[dem][j]=D[j];
}
SinhTiep();
}
}
int main()
{
LayDuLieu();
KhoiDau();
SinhLienTuc();
InKetQua();
}
Bài 11
#include<iostream>
#include<fstream>
using namespace std;
int B[100], A[100]; int D[100][100]; int n, k, dem=0;
void LayDuLieu()
{
ifstream file;
file.open("Dayso.in");
file>>n>>k;
for (int i=1;i<=n;i++) file>>A[i];
file.close();
}
void KhoiDau()
{
51
Photo Huyền Trang
for(int i=1;i<=n;i++) B[i]=0;
}
void InKetQua()
{
cout<<dem<<"\n";
for (int i=1;i<=dem;i++)
{
for(int j=1;j<=n;j++)
if(D[i][j]==1) cout<<A[j]<<"\t";
cout<<"\n";
}
}
int TongBangK()
{
int s=0;
for (int i=1;i<=n;i++) s=s+A[i]*B[i];
if (s==k) return 1;
return 0;
}
int stop = 0;
void SinhTiep()
{
int i=n;
while (i>0 && B[i]==1)
{
B[i]=0;
i--;
}
if (i==0) stop=1;
else B[i]=1;
}
void SinhLienTuc()
{
while (!stop)
{
if (TongBangK())
{
dem++;
for (int j=1;j<=n;j++) D[dem][j]=B[j];
}
SinhTiep();
52
Photo Huyền Trang
}
}
int main()
{
LayDuLieu();
KhoiDau();
SinhLienTuc();
InKetQua();
}
53
Photo Huyền Trang
int LoaiII()
{
if (LoaiI()&&TongChuSo()%10==0) return 1;
return 0;
}
int LoaiIII()
{
if (LoaiII()&&KhongChuaR(0)) return 1;
return 0;
}
void KhoiDau()
{
for(int i=1;i<=6;i++) B[i]=0;
}
ofstream file1, file2, file3;
void GhiFile1()
{
for (int k=2;k<=8;k++)
{
file1<<"091"<<k;
for(int i=1;i<=6;i++) file1<<B[i];
file1<<"\t";
}
file1<<"\n";
}
void GhiFile2()
{
for (int k=2;k<=8;k++)
{
file2<<"091"<<k;
for(int i=1;i<=6;i++) file2<<B[i];
file2<<"\t";
}
file2<<"\n";
}
void GhiFile3()
{
for (int k=2;k<=8;k++)
{
file3<<"091"<<k;
for(int i=1;i<=6;i++) file3<<B[i];
file3<<"\t";
}
file3<<"\n";
54
Photo Huyền Trang
}
void XuatKetQua()
{
if (LoaiI()&&!LoaiII())GhiFile1();
if (LoaiII()&&!LoaiIII()) GhiFile2();
if (LoaiIII()) GhiFile3();
}
int stop = 0;
void SinhTiep()
{
int i=6;
while (i>0 && B[i]==9)
{
B[i]=0;
i--;
}
if (i==0) stop=1;
else B[i]=B[i]+1;
}
void SinhLienTuc()
{
while (!stop)
{
XuatKetQua();
SinhTiep();
}
}
int main()
{
file1.open("Loai1.out");
file2.open("Loai2.out");
file3.open("Loai3.out");
KhoiDau();
SinhLienTuc();
file1.close();
file2.close();
file3.close();
}
55
Photo Huyền Trang