Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
Mục Lục
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
A. BÀI TỐN
I.
Bài tốn
Trong phạm vi tin học ta có thể quan niệm bài toán là một việc, một vấn
đề nào đó mà ta muốn máy tính thực hiện. Thuật ngữ “ bài tốn” có thể
hiểu theo nghĩa phổ dụng, bài tốn có nhiều bộ dữ liệu đầu vào khác nhau
(test)
Khi dùng máy tính để giải bài tốn, ta cần quan tâm đến hai yếu tố: đưa
vào máy tính thơng tin gì ( input) và cần lấy ra thơng tin gì ( output). Do đó
để phát biểu một bài tốn, ta cần phải trình bày về input, output của bài
tốn đó và mối quan hệ giữa input và output
Ví dụ: Bài tốn kiểm tra tính hồn hảo của một số ngun
- Input: Số nguyên N;
- Output: “ N là số hoàn hảo” hoặc “ N khơng phải là số hồn hảo”
Để giải bài tốn trên máy tính cần thực hiện các bước sau:
- Xác định bài toán
- Thiết kế hoặc lựa chọn thuật tốn
- Viết chương trình
- Kiểm thử và hiệu chỉnh chương trình
- Viết tài liệu
II. Các bước giải bài tốn trên máy tính
1. Xác định bài tốn
Là xác định tập dữ liệu đầu vào Input và tập kết quả cần nhận được
output
2. Thiết kế hoặc lựa chọn thuật toán
Sau khi xác định được input và output của bài toán, vấn đề quan trọng
là tìm cách xác lập mối quan hệ giữa Input và Output. Trên cơ sở đó, từ
input đã cho tìm được dãy các thao tác, sau khi thực hiện chúng tìm được
output cần tìm. Việc chỉ ra một cách tường minh dãy thao tác như vậy gọi
là một thuật tốn đẻ giải bài tốn đó.
Mỗi thuật tốn chỉ giải được một bài tốn, nhưng có thể có nhiều thuật
toán khác nhau cùng giải một bài toán. Do vậy, cần thiết phải lựa chọn
thuật toán tốt nhất để giải một bài tốn đã cho.
3. Viết chương trình
Việc viết chương trình bao gồm lựa chọn cấu trúc dữ liệu, ngơn ngữ lập
trình và sử dụng chúng để diễn tả đúng thuật tốn. Có những thuật tốn chỉ
thích ứng và hiệu quả với một số cách tổ chức dữ liệu nhất định, đối với
các cách tổ chức dữ liệu khác thì khơng có hiệu quả, thậm chí khơng thể
thực hiện được. Vì thế hai bước “ thiết kế thuật tốn hoặc lựa chọn thuật
tốn” và “ viết chương trình” thường được thực hiện không tách rời mà gắn
kết rất chặt chẽ
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
Như vậy có một thuật tốn tốt chưa đủ mà phải chọn được cấu trúc dữ
liệu thích hợp, đồng thời phải có kĩ thuật cài đặt chương trình tốt
4. Kiểm thử và hiệu chỉnh chương trình
Chương trình được viết có thể cịn có lỗi, vì vậy cần phải kiểm thử tính
đúng đắn của chương trình. Trong quá trình kiểm thử nếu phát hiện có sai
sót thì phải hiệu chỉnh chương trình và kiểm thử lại
Trên cơ sở đánh giá các lỗi cỉa chương trình thơng qua kiểm thử có thể
xác định được hoặc ngơn ngữ lập trình, hoặc cấu trúc dữ liệu, thậm chí có
cả thuật tốn đã lựa chọn khơng phù hợp, cần thiết quay lại các công việc
của các bài tốn trước đó.
5. Viết tài liệu
Tài liệu ( bao gồm cả phần chú thích trong chương trình) là cần thiết
khơng những cho người dùng để có thể khai thác tốt chương trình, đề xuất
phương án để hồn thiện chương trình để dễ dàng chỉnh sửa, nâng cấp
chương trình khi cần thiết.
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
B. THUẬT TỐN
I. Khái niệm
Thuật tốn để giải một bài tốn là một dãy hữu hạn các thao tác được
sắp xếp theo một trật tự xác định sao cho sau khi thực hiện dãy các thao tác
đó, từ input của bài tốn nhận được output cần tìm.
II. Các cách diễn tả thuật tốn
Có 2 cách diễn tả thuật tốn
1. Diễn tả bằng cách liệt kê
Dấu
dùng để gán giá trị cho biến ở biến
Ví dụ: i
i+1; {đặt biến i bằng giá trị mới bằng giá trị trước đó
cộng 1
đơn vị}
[x] là kí hiệu phần nguyên của x, là số nguyên lớn nhất khơng vượt q
x
2. Diễn tả bằng sơ khối
Hình thoi
thể hiện thao tác so sánh
Hình chữ nhật
thể hiện các phép tính tốn
Hình
thể hiện thao tác nhập/ xuất dữ liệu
Các
chỉ qui trình thực hiện các thao tác
Ví dụ: Bài tốn kiểm tra tính hồn hảo của một số ngun
- Input: Số ngun N;
- Output: “ N là số hoàn hảo” hoặc “ N khơng phải là số hồn hảo”
Thuật tốn được mô tả theo cách liệt kê như sau:
Bước 1: Nhập N;
Bước 2: i
1;s 0;
Bước 3: Nếu i> N thì chuyển đến Bước 5;
Bước 4: Nếu N chia hết cho i thì s
s+i; chuyển đến Bước 6;
Bước 5: Nếu s=2n thì thơng báo “N là số hồn hảo “ và kết thúc;
Ngược lại thông báo “ N không phải là số hoàn hảo” và kết
thúc.
Bước 6: i
i+1;
Bước 7: Quay lại bước 3;
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
Thuật tốn được mơ tả theo sơ đồ khối như sau:
Nhập N
i:=1; s:=0;
Đúng
i>N
S = 2*N
Sai
Sai
Đúng
N Khơng phải so hồn hảo
N mod i =0
Sai
Đúng
N là so hồn hảo
S:=s+i
i:=i+1
III. Các tính chất của thuật tốn
Tính dừng (kết thúc): Thuật tốn phải đưa ra Output sau hữu hạn lần thực
hiện các thao tác
Ví dụ: Thuật tốn kiểm tra số hồn hảo nêu trên chắc chắn sẽ kết thúc
đúng N lần thực hiện phép so sánh.
Tính xác định ( đơn nghĩa):Sau khi thực hiện một thao tác thì hoặc là thuật
tốn kết thúc hoặc là có đúng một thao tác xác định, đơn trị và khơng có
sự nhập nhằng để được thực hiện tiếp theo
Ví dụ: Thuật tốn kiểm tra số hồn hảo nêu trên sau khi gán giá trị i, s
thì đi so sánh i với N. Nếu i
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
theo N mod i =0 hay N mod i <>0. Không có con đường nào khác để lựa
chọn.
Tính phổ dụng :Thể hiện ở chỗ thuật toán để giải một bài tốn phải đảm
bảo giải được bài tốn đó với nhiều bộ dữ liệu khác nhau chứ không dùng
để giải bài toán với một bộ dữ liệu cụ thể và duy nhất.
Ví dụ: Thuật tốn kiểm tra số hồn hảo nêu trên là áp dụng cho bất kì số
nào và (N) là tùy chọn.
Tính hiệu quả:Đối với một bài tốn, có thể có nhiều thuật tốn nhưng các
thuật tốn này đều phải cho cùng một dữ liệu đầu ra với cùng một dữ liệu
đầu vào cho trước. Tuy nhiên, chúng có thể khác nhau về hiệu quả:
- Hiệu quả thời gian: Quan tâm tới thời gian cần thiết để thực hiện
xong thuật tốn. Thời gian đó có nằm trong giới hạn cho phép
không?
- Hiệu quả không gian:Quan tâm tới dung lượng bộ nhớ để lưu trữ các
đối tượng như Input, output, các kết quả trung gian của chương trình
được dùng để thực hiện thuật tốn. Khơng gian đó có nằm trong giới
hạn cho phép khơng?
- Tính khả thi cài đặt thuật tốn: Quan tâm tới việc thuật tốn đó có
chuyển đổi được thành chương trình thực hiện được trên máy tính
hay khơng?
IV. Lựa chọn thuật tốn
Khi giải một bài tốn, ta cần chọn thuật toán mà cho là “ tốt” hơn cả.
Vậy dựa trên cơ sở nào đánh giá thuật tốn này “ tốt” hơn thuật tốn kia?
Thơng thường dựa vào 2 tiêu chí sau:
- (1) Chi phí cài đặt thuật tốn: Dễ hiểu, dễ cài đặt, cơng sức cài đặt
của người lập trình
- (2) Tính hiệu quả của thuật toán: Chúng ta đặc biệt quan tâm đến
thời gian thực hiện của thuật tốn , bên cạnh đó là dung lượng khơng
gian nhớ.
Đối với các chương trình thực hiện một số ít lần trên dữ liệu đầu vào
khơng q lớn thì tiêu chí (1) là quan trọng. Bởi vì, một thuật tốn đơn
giản và dễ hiểu thì việc sửa đổi nâng cấp có thể dễ dàng, ít tốn cơng sức lập
trình, bên cạnh đó cịn thể hiện thói quen, kinh nghiệm của người lập trình
Nếu viêt chương trình để sử dụng nhiều lần, cho nhiều người sử dụng
thì tiêu chí (2) là quan trọng.
Như vậy việc lựa chọn một thuật toán “ tốt” phụ thuộc rất nhiều các yếu
tố: Chương trình dùng ít hay nhiều?, hệ thống máy tính thế nào?, … Điều
mấu chốt là phải dựa vào đặc tính cụ thể của bài tốn để xác định tiêu chí
sự hiệu quả cho sự lựa chọn thuật toán.
Chun đề dạy học sinh giỏi
Bài tốn và thuật tốn
Ví dụ: Thuật tốn kiểm tra số hồn hảo như trên là chưa hiệu quả. Đối
với thuật toán trên ta chỉ cần kiểm tra biến i chạy từ 1 đến div(n/2) và kiểm
tra s=N hay không?
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
C. MỘT SỐ BÀI TỐN
Bài 1: Tìm giá trị lớn nhất trong 3 số a, b, c
Bài 2: Cho số N kiểm tra xem chữ số hàng chục của số N là số chẵn hay số lẻ
Bài 3: Giải phương trình bậc 2 ax2 + bx + c =0
Bài 4: Cho số tự nhiên đếm chữ số của N
Bài 5: Cho dãy A gồm N số nguyên a1, .., aN. Sắp xếp dãy thành dãy không
giảm
Bài 6: Cho dãy A gồm N số nguyên a1,. ., aN và một số nguyên dương k. C
Bài 7: Cho số N tính tổng các chữ số N<1000. Dếm xem N có bao nhiêu chữ
số?
Bài 8: Cho số N tính tổng các chữ số của N;
Bài 9: Đếm số ước của N;
Bài 10: Tính S = 1 + x+x2 +x3+ .. + xn;
Bài 11: Cho 1 lỗ thủng hình chữ nhật có kích thước là a, b . Cho một viên
gạch có kích thước lần lượt là x, y, z. Hãy cho biết viên gạch có đi qua lỗ
thủng đó hay khơng?
Bài 12: Tính tổng S = 1+2+ ..+N;
Bài 13: Tính S = 13 + 23+ .. + n3
Bài 14: Tính S = 1-x+x2 – x3 + x4 – x5+ …+ (-1)n xn
Bài 15: Tính N!
Bài 16: Tính
Bài 17: Đếm các phần tử lẻ trong dãy A: a1, .., aN;
Bài 18: Một dãy A gồm N số nguyên : a1, .. , aN. Một phần tử được gọi là
cực đại địa phương nếu a i-1
phần tử là cực đại địa phương
Bài 19: Kiểm tra số N có phải là số đối xứng khơng?
Bài 20: Phân tích N ra thừa số nguyên tố. ( Ví dụ: 100 = 22 *52)
Bài 21: Kiểm tra N có phải là số nguyên tố hay không?
Bài 22: Liệt kê các số nguyên tố từ 1 đến N
Bài 23: Tìm ước số chung lớn nhất của 2 số a, b
Bài 24: Cho dãy A : a1,…, aN. Hãy đếm số lượng giá trị khác nhau trong dãy
và đưa ra số lần lặp của giá trị xuất hiện nhiều nhất.
Ví dụ: Dãy A gồm 8 số: 6, 7, 1, 7, 4, 6, 6, 8. Dãy A có 5 giá trị khác nhau và
số lần lặp của giá trị xuất hiện nhiều nhất là 3.
Bài 25: Cho dãy N (N<=30000) số tự nhiên không vượt qua 10 9 . Tìm số tự
nhiên nhỏ nhất không xuất hiện trong dãy.
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
HƯỚNG DẪN GIẢI MỘT SỐ BÀI TẬP
Để môt tả cấu trúc rẽ nhánh trong pascal:
- Dạng thiếu:
Đúng
Câu lệnh
Điều kiên
Sai
- Dạng đủ:
Sai
Đúng
Câu lệnh
Câu lệnh
Điều kiên
Để mô tả cấu trúc lặp trong pascal:
Sai
Điều kiên
Đúng
Câu lệnh
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
Bài 1: Tìm giá trị lớn nhất trong 3 số a, b, c
- Input: Ba số a, b, c
- Output: Số lớn nhất
Thuật tốn mơ tả bằng sơ đồ khối:
Nhập a, b, c
Sai
a>b
b>c
Sai
Đúng
Đúng
Số b là lớn nhất
a>c
Số a là lớn nhất
Số c là lớn nhất
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
Bài 2: Cho số N kiểm tra xem chữ số hàng chục của số N là số chẵn
hay số lẻ
- Input: Số N
- Output: Chữ số hàng chục là chẵn hoặc lẻ
Thuật tốn mơ tả bằng sơ đồ khối:
Nhập N
a:= (N mod 100) div 10
Là số chẵn
a mod 2 = 0
Là số lẻ
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
Bài 3: Giải phương trình bậc 2 ax2 + bx + c =0
- Input: Nhập vào hệ số a,b, c
- Output: Nghiệm của phương trình
Thuật tốn mơ tả bằng sơ đồ khối:
Nhập a, b, c
Đúng
a =0
Đúng
b=0
c=0
Sai
Pt vô số nghiệm
dt:= b*b-4*a*c
Đúng
Pt vô nghiệm
dt < 0
Sai
Đúng
Pt có nghiệm kép x
x:= -b/2*a
dt = 0
Sai
x1:= -b –sqrt(dt)/2*a
x2:= -b –sqrt(dt)/2*a
Pt có 2 nghiệm x1, x2
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
Bài 4: Cho số tự nhiên đếm chữ số của N
- Input: Nhập N
- Output: Số chữ số của N
Thuật toán mô tả bằng sơ đồ khối:
Nhập N
i:=10
dem:=1;
Đúng
dem
N< i
Sai
dem: = dem +1;
i:= i*10;
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
Bài 5: Cho dãy A gồm N số nguyên a1, .., aN. Sắp xếp dãy thành dãy không
giảm
- Input: N, Dãy A: a1,.., aN
- Output: Dãy a sắp xếp theo chiều tăng dần
Thuật tốn mơ tả bằng sơ đồ khối:
Sắp xếp nổi bọt:
Nhập N, Dãy A: a1,.., aN
M N
Đúng
M< 2
Sai
Đúng
i>M
Sai
Đúng
Tráo đổi ai với ai+1
ai > ai+1
Sai
Đưa ra A, rồi kết thúc
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
NhậpSort):
l, r;
Sắp xếp nhanh (Quick
Dãy a1, .. , aN
i:=L; j:= r;
X:= a[div((i+j)/2)]
Đúng
Inc(i)
ai< x
Sai
Đúng
Dec(j)
aj>x
Sai
Đúng
i<= j
Swap(ai, aj)
Inc(i);
Dec(j);
Sai
Đúng
i:=L
L< = j
Sai
Đúng
Sai
J:=r
i<= r
Dãy A đã sắp xếp
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
Bài 6: Cho dãy A gồm N số nguyên a1,. ., aN và một số nguyên dương
k. Cho biết có hay không phần chỉ số i mà ai = k
- Input: Nhập N và dãy A: a1, .., aN;
- Output: Có hay khơng chỉ số i mà ai = k;
Thuật tốn mơ tả bằng sơ đồ khối:
Thuật tốn tìm kiêm tuần tự:
Nhập N, dãy A: a1, .., aN
i
1;
Đúng
Đưa ra chỉ số i, rồi kết thúc
ai = k
Sai
i
i +1
Sai
i>N
Đúng
Thông báo dãy A khơng có số hạng nào bằng k rồi kết thúc
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
Thuật tốn tìm kiêm nhị phân:
Nhập N, Dãy a tăng: a1,.., aN
Giua:= Dau+Cuoi/2
Sai
agiua =k
Đúng
Đúng
agiua >k
Sai
Sai
Đưa ra giua rồi kết thúc
Sai
Dau>Cuoi
Đúng
Thông báo dãy A khơng có so hạng nào mà ai =k
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
Bài 11: Cho 1 lỗ thủng hình chữ nhật có kích thước là a, b . Cho một viên
gạch có kích thước lần lượt là x, y, z. Hãy cho biết viên gạch có đi qua lỗ
thủng đó hay khơng?
- Input: Nhập a, b, x, y, z
- Output: Viên gạch có hay khơng đi qua lỗ thủng.
Thuật tốn:
Nhập a, b, x, y, z
Sai
Đổi vị trí a và b
a< b
Viên gạch qua
Đúng
Đúng
Đúng
a
x<=y<=z
Sai
Sai
Đúng
Đổi vị trí x và y
X >y
Sai
Đúng
y>z
Sai
Đổi vị trí y và z
Viên gạch không qua
Chuyên đề dạy học sinh giỏi
Bài toán và thuật toán
Bài 24: Cho dãy A : a1,…, aN. Hãy đếm số lượng giá trị khác nhau trong dãy
và đưa ra số lần lặp của giá trị xuất hiện nhiều nhất.
Ví dụ: Dãy A gồm 8 số: 6, 7, 1, 7, 4, 6, 6, 8. Dãy A có 5 giá trị khác nhau và
số lần lặp của giá trị xuất hiện nhiều nhất là 3.
- Input: Nhập N và dãy A : a1, .., aN
- Output: Số lượng giá trị khác nhau trong dãy và số lần lặp của giá trị
xuất hiện nhiều nhất
Đầu tiên ta sẽ đi sắp xếp dãy A thành dãy tăng dần sau đó thực hiện thuật
tốn:
Nhập N, Dãy
A tăng: a1, .., aN
i:=2; count:=1;
dem:=1; rslt:=1;
Đúng
Số lượng giá trị khác nhau là : count;
Số lần lặp của giá trị xuất hiện nhiều nhất là : rslt
i>N
Sai
Đúng
Inc (count);
Dem:=1;
ai-1 < > ai
Sai
Inc(dem)
Đúng
Rslt: = dem
Dem > rslt
Sai
Inc(i)