Tải bản đầy đủ (.docx) (19 trang)

CHUYEN DE BAI TOAN VA THUAT TOAN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (126.64 KB, 19 trang )

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-1phầ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)



×