Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 55

CÂU HỎI MÔN CÁC KỸ THUẬT LẬP TRÌNH

(Lập trình bằng ngôn ngữ C hoặc C++)

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);

C. Giải thuật sinh và quay lui


(Dữ liê ̣u có thể vào ra bàn phím màn hình hoă ̣c vào ra trên têp̣ )
1. Hãy viết chương trình liệt kê tất cả các số tự nhiên K thỏa mãn đồng thời
những điều kiện dưới đây:
(i) K là số có 5 chữ số;
3
Photo Huyền Trang
(ii) K là số nguyên tố;
(iii) K là số thuận nghịch (k là số thuận nghịch nếu đọc xuôi hay đọc ngược
các chữ số của k ta đều nhận được một số như nhau. Ví dụ số: 30303);
(iv) Biểu diễn của K ở hệ cơ số B ( B bất kỳ được nhập từ bàn phím cũng
là một số thuận nghịch. Ví dụ số k=30303 có biểu diễn ở hệ cơ số 8 là
73137 cũng là một số thuận nghịch;
2. Hãy viết chương trình liệt kê tất cả các số tự nhiên K thỏa mãn đồng thời
những điều kiện dưới đây:
(i) K là số có 5 chữ số;
(ii) K là số nguyên tố;
(iii) Đảo ngược các chữ số trong của K cũng là một số nguyên tố;
(iv) Tổng các chữ số của K cũng là một số nguyên tố;
(v) Mỗi chữ số trong K cũng là những số nguyên tố.
3. Hãy viết chương trình liệt kê tất cả các số tự nhiên K thỏa mãn đồng thời
những điều kiện dưới đây:
(i) K là số có 5 chữ số;
(ii) K là số nguyên tố;
(iii) Mỗi chữ số của K cũng là những số nguyên tố;
(iv) Tổng các chữ số của K là một số thuận nghịch hai chữ số;
(v) Tích các chữ số của K là một số thuận nghịch ba chữ số.
4. Hãy viết chương trình liệt kê tất cả các số tự nhiên K thỏa mãn đồng thời
những điều kiện dưới đây:
(i) K là số có 5 chữ số;
(ii) K là số nguyên tố;
(iii) Mỗi chữ số của K cũng là các số nguyên tố;
(iv) Tổng các chữ số của K là một số chia hết cho P (P được nhập từ bàn
phím);
(v) Tích các chữ số của K là một số chia hết cho Q (Q được nhập từ bàn
phím);
(vi) Các chữ số của K không chứa số R (được nhập từ bàn phím).
5. Hãy viết chương trình liệt kê tất cả các số tự nhiên K thỏa mãn đồng thời
những điều kiện dưới đây:
(i) K là số có 5, 7 hoặc 9 chữ số;
(ii) K là số thuận nghịch;
(iii) Tổng các chữ số của K là một số chia hết cho P (P được nhập từ bàn
phím);
(iv) Tích các chữ số của K là một số chia hết cho Q (Q được nhập từ bàn
phím);
(v) Các chữ số của K không chứa số R (được nhập từ bàn phím).
6. Cho số tự nhiên N, B được nhập từ bàn phím (N10000 ; B255). Hãy viết
chương trình thực hiện:
4
Photo Huyền Trang
(i) Tính tổng các chữ số của N ;
(ii) Phân tích N thành tích các thừa số nguyên tố ;
(iii) Biểu diễn N ở hệ cơ số B ;
(iv) Liệt kê các số hoàn hảo nhỏ hơn N ;
7. Số điện thoại di động của một hãng viễn thông được đánh số theo qui cách
091N. XXX.XXX. Trong đó, N là số từ 2 đến 8, X là một số từ 0 đến 9. Ta định
nghĩa các loại số điện thoại sau:
 Số điện thoại loại I (Loại I): Là những số có sáu số cuối cùng của nó tạo
thành một số thuận nghịch sáu chữ số. Ví dụ số: 0913.558855.
 Số điện thoại loại II (Loại II): Là những số điện thoại Loại I có tổng sáu
chữ số cuối cùng là một số chia hết cho 10 . Ví dụ số: 0913.104.401
(1+0+4+4+0+1=10).
 Số điện thoại loại III (Loại III): Là những số điện thoại Loại II có sáu
chữ số cuối cùng không chứa bất kỳ một số 0 nào. Ví dụ số: 0913.
122.221.
Hãy viết chương trình thực hiện:
 Liệt kê tất cả các số điện thoại Loại I không chứa các số điện thoại Loại
II. Ghi lại các số Loại I vào file Loai1.out theo từng dòng, mỗi dòng
không quá 8 số điện thoại.
 Liệt kê tất cả các số điện thoại Loại II không chứa các số điện thoại Loại
III. Ghi lại các số Loại II vào file Loai2.out theo từng dòng, mỗi dòng
không quá 8 số điện thoại.
 Liệt kê tất cả các số điện thoại Loại III. Ghi lại các số Loại III vào file
Loai3.out theo từng dòng, mỗi dòng không quá 8 số điện thoại.

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 (
KN100). 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  N100) 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  N100) 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

//Danh sach cai dat bang mang tinh.


#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
#define true 1
#define false 0
//==================================================
void swap(float &x,float &y)
{float tmp=x;x=y;y=tmp;
};
//==================================================
//Nhap danh sach.
void nhap(float a[],int &N)
{cout<<"\nSo phan tu can nhap N = ";cin>>N;
for(int i=0;i<N;i++)
31
Photo Huyền Trang
{ cout<<"a["<<i<<"]= "; cin>>a[i];}
}
void xem(float a[],int N)
{int i;
cout<<"\nCac phan tu danh sach:";
for(i=0;i<N;i++) cout<<a[i]<<" ";
}
void selectsort(float a[],int N)
{int i,j,k;float min;
for(i=0;i<N-1;i++)
{min=a[i];k=i;
for(j=i+1;j<N;j++)
if(a[j]<min) {k=j;min=a[j];}
if(k!=i) swap(a[i],a[k]);
xem(a,N);
}
}
void bubblesort(float a[],int N)
{int i,j,doicho;
do
{doicho=false;
for(j=0;j<N-1;j++)
if(a[j]>a[j+1])
{swap(a[j],a[j+1]);
doicho=true;}
xem(a,N);
}
while(doicho);
}
//==================================================
void insertsort(float a[],int N, int h=1)
{int i,j;int x;
for(i=h;i<N;i++) //Ban dau day chi co 1 phan tu a[0]
{x=a[i];//chen a[i] vao day da sx a[0],a[1],...,a[i-1]
j=i;
while(j>0 && x<a[j-h])
{a[j]=a[j-h];//Keo nut lon hon x len h vi tri
j=j-h;
};
/*Chen x vao vi tri hop le, j la vi tri dau tien ma x>=a[j-h]
do do gia tri j dung la vi tri can chen x */
32
Photo Huyền Trang
a[j]=x;
xem(a,N);
} //end of for(i=h;i<N;i++)
};
//==================================================
void partition(float a[],int low,int up,int& pivot)
{int pivotval=a[low];//Chon nut dau lam truc
int i=low;
int j=up;
while(i<j) //Bat dau quet
{while(a[i]<=pivotval && i<up) i++; //a[i]>pivotval
while(a[j]>pivotval) j--; //a[j]<=pivotval
if(i<j) swap(a[i],a[j]); //Doi cho cap nut sai vi tri
};
swap(a[low],a[j]);pivot=j;
}
//==================================================
void quicksort(float a[],int low,int up)
{int pivot;
if(low>=up) return;
partition(a,low,up,pivot);
quicksort(a,low,pivot-1);
quicksort(a,pivot+1,up);
}
//==================================================
void heapsort(float a[],int N)
{/*Chuyen danh sach thanh HEAP bang cach xem khoi dau heap gom nut
a[0], sau do lan luot chuyen cac nut a[1],a[2],...,
a[N-1] vao heap*/
int i,s,f;int x;
for(i=1;i<N;i++)
{x=a[i];//Nut can them vao HEAP, ban dau heap co mot nut a[0].
s=i; //s la nut con, hien tai tren heap chua co a[i]
//f=(s-1)/2 la nut cha
while(s>0 && x>a[(s-1)/2])
{a[s]=a[(s-1)/2]; //Keo nut < x xuong 1 muc
s=(s-1)/2;
};
a[s]=x; //Dien nut x vao vi tri phu hop
}; //end of for(int i=1;i<N;i++)
//Ket thuc chuyen danh sach thanh heap
33
Photo Huyền Trang
//Lan luot xoa nut a[0] tren HEAP, dua ve vi tri thich hop tren ds
for(i=N-1;i>0;i--)
{x=a[i];a[i]=a[0];

f=0; //f la nut cha, s la nut con lon hon


s=2*f+1; //Gan s la nut con ben trai
if(s+1<i && a[s]<a[s+1]) s=s+1;/*Neu co nut phai va
lon hon thi chon nut phai*/
while(s<i && x<a[s])
{a[f]=a[s];//Con lon thay the cha
f=s;//Chuyen den con lon tiep theo
s=2*f+1;
if(s+1<i && a[s]<a[s+1]) s=s+1;
};
a[f]=x; //Nut a[k] duoc chen dung cho
}; //end of for(i=N-1;i>0;i--)
};
//==================================================
/*Sap xep danh sach theo thu tu tang dan bang phuong phap
Merge Sort.
Input: Day a[0],a[1],...,a[N-1]
Tr.gian:Ltemp la danh sach tam dung khi tron, k la chi so cua danh sach nay
size la kich thuoc cua danh sach con, o buoc 1 size = 1,
buoc 2 size = 2, buoc 3 size = 4,...
low1,up1,low2,up2 la can duoi va can tren cua 2 danh sach dang tron
Output: Danh sach da duoc sap xep*/
void mergesort(float a[],int N)
{int i,j,k,low1,up1,low2,up2;//Can duoi va tren cua 2 ds con
int size;
int *Listtmp=new int[N];
size=1;//Buoc tron 1: gan size bang 1
while(size<N)
{low1=0;k=0;

while(low1+size<N)
{low2=low1+size;
up1=low2-1;
up2=(low2+size-1<N)? low2+size-1 : N-1;

for(i=low1,j=low2;i<=up1 && j<=up2;k++)


34
Photo Huyền Trang
if(a[i]<=a[j]) Listtmp[k]=a[i++];
else Listtmp[k]=a[j++];;

for(; i <= up1; k++) Listtmp[k] = a[i++];


for(; j <= up2; k++) Listtmp[k] = a[j++];
low1 = up2+1;
} //while(low1+size<N)

for(i = low1; k < N; i++) Listtmp[k++] = a[i];


for(i = 0; i < N; i++) a[i] = Listtmp[i];
size *= 2;//Tang co cua danh sach con len 2 lan.
}//end of while(size<N)
}
//==================================================
main()
{int step[3] = {5,3,1};
float a[50]; int N,i;int x;
while(true)
{ //Tao menu
cout<<"\n 1. Nhap danh sach";
cout<<"\n 2. Xem danh sach ";
cout<<"\n 3. Sap xep tang dan bang SELECTION Sort";
cout<<"\n 4. Sap xep tang dan bang BUBBLE Sort";
cout<<"\n 5. Sap xep tang dan bang INSERTION Sort";
cout<<"\n 6. Sap xep tang dan bang QUICK Sort";
cout<<"\n 7. Sap xep tang dan bang HEAP Sort";
cout<<"\n 8. Sap xep tang dan bang MERGE Sort";
cout<<"\n z. Ket thuc";
cout<<endl<<"\nHay nhan phim tu 1 -> z de chon: ";
char chon=toupper(getch());
if(toupper(chon)=='Z') break;
switch (chon)
{case '1':nhap(a,N);break;
case '2':xem(a,N);break;
case '3':selectsort(a,N);break;
case '4':bubblesort(a,N);break;
case '5':insertsort(a,N);break;
case '6':quicksort(a,0,N-1);break;
case '7':heapsort(a,N);break;
case '8':mergesort(a,N);break;
}
35
Photo Huyền Trang
cout<<"\n\nNhan phim bat ky de tiep tuc";
getch();
}
}
C. Giải thuật sinh và quay lui
Dạng dễ
Bài 6
#include<iostream>
using namespace std;
int A[100];
int DoiCoSo(int a,int k)
{
int i=1; A[1]=0;
while (a!=0)
{
A[i]=a%k;
a=a/k;
i++;
}
return i-1;
}
void II(int N)
{
int i=2;
while(i<=N)
if (N%i==0)
{
cout<<i<<" ";
N=N/i;
}
else i++;
cout<<"\n";
}
void III(int m)
{
for (int i=m;i>=1;i--) cout<<A[i];
cout<<"\n";
}
int SoHoanHao(int a)
{
int s=0;
36
Photo Huyền Trang
for (int i=1;i<=a/2;i++)
if (a%i==0) s=s+i;
if (s==a) return 1;
return 0;
}
int main()
{
int N,B;
cout<<"Nhap N B = ";
cin>>N>>B;
//-------------------------------
cout<<"ii,\n";
II(N);
//-------------------------------
int m=DoiCoSo(N,B);
cout<<"iii,\n";
III(m);
//-------------------------------
cout<<"iv,\n";
for (int a=1;a<N;a++)
if (SoHoanHao(a)) cout<<a<<" ";
cout<<"\n";
}

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();

Dạng bài khó


Bài 1
#include<iostream>
#include<math.h>
using namespace std;
int B[100]; int A[100];
long GiaTri(int *M,int n)
{
long s=0,t=1;
for (int i=n;i>=1;i--)
47
Photo Huyền Trang
{
s=s+M[i]*t;
t=t*10;
}
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 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 DoiCoSo(int a,int k)
{
int i=1; A[1]=0;
while (a!=0)
{
A[i]=a%k;
a=a/k;
i++;
}
return i-1;
}
void KhoiDau()
48
Photo Huyền Trang
{
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 k;
long a;
cout<<"Nhap Co So : "; cin>>k;
while(!stop)
{
a=GiaTri(B,5);
int n = DoiCoSo(a,k);
if
(NamChuSo()&&SoNgTo(a)&&MangThNghich(B,5)&&MangThNghich(A,n))
XuatKetQua();
SinhTiep();
}
}
int main()
{
KhoiDau();
SinhLienTiep();
}

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();
}

Dạng bài rất khó


Bài 7
#include<iostream>
#include<fstream>
using namespace std;
int B[100];
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 TongChuSo()
{
int s=0;
for (int i=1;i<=6;i++) s=s+B[i];
return s;
}
int KhongChuaR(int r)
{
for (int i=1;i<=6;i++)
if (B[i]==r) return 0;
return 1;
}
int LoaiI()
{
if (MangThNghich(B,6)) return 1;
return 0;
}

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

You might also like