Chuyên đề 2: Giải toán & Thuật toán số học (Chi tiết từng bài)
Chuyên đề này hướng dẫn chi tiết từng bài học từ Tuần 13 đến Tuần 23 theo lộ trình ôn thi Tin học trẻ. Mỗi bài học tập trung vào giải thuật tối ưu và cấu trúc lệnh kéo thả tương ứng.
📘 Bài 1 (Tuần 13): Nhập dữ liệu & Định dạng đầu ra
Mục tiêu: Đọc dữ liệu đầu vào có ràng buộc và định dạng hiển thị kết quả đúng chuẩn phòng thi.
1. Kỹ thuật lấy thông tin từ người dùng
Sử dụng câu lệnh hỏi [Nhập dữ liệu] và đợi. Dữ liệu nhập vào sẽ lưu ở biến câu trả lời.
- Nếu đề bài yêu cầu nhập nhiều giá trị (ví dụ nhập 2 số
và ), ta thực hiện hỏi 2 lần: - Hỏi
"Nhập số A: "đặt [A] thành [câu trả lời] - Hỏi
"Nhập số B: "đặt [B] thành [câu trả lời]
- Hỏi
2. Định dạng đầu ra phức tạp bằng khối kết hợp (join)
Khi in ra màn hình, giám khảo yêu cầu định dạng rõ ràng (ví dụ: "Ước chung lớn nhất là: 12" hoặc "Số 23 là số nguyên tố").
- Khối lệnh
kết hợp (join)trong nhómOperatorsmặc định ghép 2 chuỗi văn bản. Để ghép nhiều chuỗi, ta lồng các khốikết hợpvào nhau:kết hợp [Số ] [ kết hợp [ N ] [ là số nguyên tố ] ]- Kết quả in ra sân khấu qua câu lệnh nói:
nói [chuỗi kết hợp] trong [5] giây.
📘 Bài 2 (Tuần 14): Thuật toán Min, Max & Tính tổng dồn
Mục tiêu: Duyệt các số nhập vào để tìm phần tử lớn nhất/nhỏ nhất và cộng lũy kế.
1. Thuật toán tìm giá trị lớn nhất (Max) / nhỏ nhất (Min)
Giả sử người dùng nhập vào một dãy gồm
- Giải thuật:
- Hỏi số thứ nhất
Đặt biến maxthànhcâu trả lời. - Lặp lại
N - 1lần để nhập các số tiếp theo:- Hỏi
"Nhập số tiếp theo: " - Nếu
câu trả lời>maxthì:- Đặt
maxthànhcâu trả lời.
- Đặt
- Hỏi
- Sau vòng lặp,
maxchính là số lớn nhất.
- Hỏi số thứ nhất
2. Thuật toán Tính tổng dồn (Accumulator)
Tính tổng các số từ
- Khởi tạo biến
tong_so = 0, biến chạyi = 1. - Lặp lại
Nlần:- Đặt
tong_sothànhtong_so + i. - Thay đổi
imột lượng1.
- Đặt
📘 Bài 3 (Tuần 15): Làm chủ Danh sách (List/Mảng)
Mục tiêu: Sử dụng mảng động để xử lý dãy số có kích thước lớn.
1. Khởi tạo mảng trống
Ở đầu chương trình, luôn phải dùng lệnh: xóa tất cả của [danh sách]. Nếu không, danh sách sẽ giữ nguyên các số cũ của lần chạy trước làm sai lệch kết quả.
2. Thuật toán duyệt danh sách tìm kiếm phần tử chẵn
Giả sử có danh sách day_so chứa các số ngẫu nhiên. Ta muốn lọc các số chẵn ra một danh sách khác tên là so_chan:
xóa tất cả của [so_chan]- Đặt biến chỉ số
i = 1 - Lặp lại
kích thước của [day_so]lần:- Nếu
(phần tử i của [day_so] mod 2) = 0thì:- Thêm
phần tử i của [day_so]vàoso_chan.
- Thêm
- Thay đổi
imột lượng1.
- Nếu
📘 Bài 4 (Tuần 16): Thuật toán Kiểm tra Số nguyên tố tối ưu
Mục tiêu: Lập trình kiểm tra số nguyên tố chạy trong dưới 1 giây với N lên tới 10^9 (1 tỷ).
1. Tại sao cần tối ưu căn bậc hai?
Nếu kiểm tra số N = 10^9 bằng cách chia thử từ 2 đến N-1, Scratch sẽ phải lặp 1 tỷ lần, mất khoảng vài phút và bị treo máy. Tuy nhiên, nếu số N có một ước số lớn hơn căn bậc hai của N thì chắc chắn nó phải có một ước số khác tương ứng nhỏ hơn hoặc bằng căn bậc hai của N. Do đó, ta chỉ cần chia thử từ 2 đến phần nguyên của căn bậc hai của N. Số lần lặp giảm từ 1 tỷ xuống còn khoảng 31,622 lần (chạy mất chưa tới 0.05 giây).
2. Khối lệnh Scratch tối ưu:
định nghĩa kiem_tra_nguyen_to [N]
đặt [la_so_nguyen_to] thành [1]
nếu < [N] < [2] > thì
đặt [la_so_nguyen_to] thành [0]
ngược lại
đặt [i] thành [2]
lặp lại cho đến khi << [i] > [làm tròn xuống (căn bậc hai của (N))] > hoặc < [la_so_nguyen_to] = [0] >>
nếu < (N mod i) = [0] > thì
đặt [la_so_nguyen_to] thành [0]
thay đổi [i] một lượng [1]📘 Bài 5 (Tuần 17): Phân tích thừa số nguyên tố & Sàng Eratosthenes
Mục tiêu: Thực hiện phân tích cấu trúc nhân tử và tìm nhanh tập hợp số nguyên tố.
1. Phân tích thừa số nguyên tố (Prime Factorization)
- Đặt biến
chia = 2. - Lặp lại cho đến khi
N = 1:- Nếu
N mod chia = 0thì:- Thêm
chiavào danh sáchcac_thua_so. - Đặt
NthànhN / chia.
- Thêm
- Ngược lại:
- Thay đổi
chiamột lượng1.
- Thay đổi
- Nếu
2. Thuật toán Sàng số nguyên tố Eratosthenes
Sử dụng một danh sách có
- Điền đầy danh sách
danh_daugồmphần tử có giá trị ban đầu là 1(biểu thị là số nguyên tố). - Đặt
danh_dau[1] = 0. - Đặt biến
p = 2. - Lặp lại cho đến khi
p * p > N:- Nếu
phần tử p của danh_dau = 1thì:- Đặt biến bội số
k = p * p. - Lặp lại cho đến khi
k > N:- Đặt phần tử
kcủadanh_dauthành0(loại bỏ bội số của p). - Đặt
kthànhk + p.
- Đặt phần tử
- Đặt biến bội số
- Thay đổi
pmột lượng1.
- Nếu
- Sau khi sàng xong, các vị trí có giá trị
1trong danh sáchdanh_dauchính là các số nguyên tố.
📘 Bài 6 (Tuần 18): Thuật toán tìm UCLN và BCNN
Mục tiêu: Lập trình tìm ước và bội chung của hai số dựa trên số dư.
Thuật toán Euclid chia dư (Modulo):
So với việc tìm tất cả các ước của cả hai số rồi so sánh (rất chậm), thuật toán chia dư Euclid thực hiện hoán đổi giá trị chia dư cho đến khi số dư bằng 0.
- Khai báo 2 biến
a = A,b = B. - Lặp lại cho đến khi
b = 0:- Đặt biến tạm
tempthànhb. - Đặt
bthànha mod b. - Đặt
athànhtemp.
- Đặt biến tạm
- Sau vòng lặp, ước chung lớn nhất (UCLN) chính là giá trị của biến
a. - Tính BCNN:
BCNN = (A * B) / UCLN.
📘 Bài 7 (Tuần 19): Số hoàn hảo & Số đối xứng
Mục tiêu: Kiểm tra tính chất đặc biệt của một số tự nhiên.
1. Lập trình tìm Số hoàn hảo
Số hoàn hảo là số bằng tổng các ước thực sự của nó.
- Khởi tạo biến
tong_uoc = 1(vì 1 luôn là ước của mọi số). - Đặt biến chạy
i = 2. - Lặp lại cho đến khi
i > làm tròn xuống (N / 2):- Nếu
N mod i = 0thì:- Đặt
tong_uocthànhtong_uoc + i.
- Đặt
- Thay đổi
imột lượng1.
- Nếu
- Nếu
tong_uoc = NvàN > 1thì kết luậnNlà số hoàn hảo.
2. Lập trình kiểm tra Số đối xứng
- Chuyển số
Nthành chuỗi ký tự. - Đặt biến
ithànhđộ dài của chuỗi N. - Khởi tạo chuỗi rỗng
chuoi_dao_nguoc. - Lặp lại
độ dài của chuỗi Nlần:- Đặt
chuoi_dao_nguocthànhkết hợp [chuoi_dao_nguoc] [ký tự thứ i của chuỗi N]. - Thay đổi
imột lượng-1.
- Đặt
- Nếu
N = chuoi_dao_nguocthì concluseNlà số đối xứng.
📘 Bài 8 (Tuần 20): Thuật toán Duyệt vét cạn (Vòng lặp lồng nhau)
Mục tiêu: Giải quyết bài toán bằng cách thử nghiệm toàn bộ không gian nghiệm.
Thuật toán giải bài toán "Gà và Chó"
Đề bài: Tổng số con là 36, tổng số chân là 100.
- Đặt biến
ga = 1. - Lặp lại
36lần:- Đặt biến
chothành36 - ga. - Nếu
(ga * 2) + (cho * 4) = 100thì:- Nói
kết hợp [Số gà là: ] [ga]vàkết hợp [Số chó là: ] [cho]. - Dừng toàn bộ kịch bản (đã tìm thấy nghiệm).
- Nói
- Thay đổi
gamột lượng1.
- Đặt biến
📘 Bài 9 (Tuần 21): Quy luật Dãy số
Mục tiêu: Xác định quy luật dãy số dựa trên vòng lặp lặp kế tiếp.
Tìm số hạng thứ của dãy Fibonacci
Dãy Fibonacci:
- Nếu
N = 1hoặcN = 2thì kết quả là1. - Ngược lại:
- Đặt
F0thành1,F1thành1,F_nextthành0. - Đặt biến đếm
ithành3. - Lặp lại cho đến khi
i > N:- Đặt
F_nextthànhF0 + F1. - Đặt
F0thànhF1. - Đặt
F1thànhF_next. - Thay đổi
imột lượng1.
- Đặt
- Kết quả là
F_next.
- Đặt
📘 Bài 10 (Tuần 22): Xử lý Chuỗi ký tự cơ bản
Mục tiêu: Làm việc với các lệnh duyệt và đếm trên chuỗi ký tự.
Thuật toán đếm số từ trong một câu văn
Mỗi từ cách nhau bởi một dấu cách " ". Thuật toán sẽ đếm số khoảng trắng để suy ra số từ.
- Đặt biến
dem_tu = 1(giả định câu có ít nhất 1 từ). - Đặt biến chỉ mục
i = 1. - Lặp lại
độ dài của chuỗi [cau_nhap_vao]lần:- Nếu
ký tự thứ i của [cau_nhap_vao] = " "thì:- Thay đổi
dem_tumột lượng1.
- Thay đổi
- Thay đổi
imột lượng1.
- Nếu
- In kết quả
dem_tu.
📘 Bài 11 (Tuần 23): Chuẩn hóa chuỗi văn bản
Mục tiêu: Làm sạch dữ liệu chuỗi nhập vào bị lỗi dấu cách.
Thuật toán loại bỏ dấu cách thừa (Trái, phải và giữa các từ)
- Khởi tạo chuỗi rỗng
chuoi_sach. - Đặt chỉ mục
i = 1. - Lặp lại
độ dài của chuỗi [cau_nhap_vao]lần:- Nếu
không << ký tự thứ i của cau_nhap_vao = " "> và < ký tự thứ i+1 của cau_nhap_vao = " " >>thì:- Đặt
chuoi_sachthànhkết hợp [chuoi_sach] [ký tự thứ i của cau_nhap_vao].
- Đặt
- Thay đổi
imột lượng1.
- Nếu
- (Đoạn code trên xử lý dấu cách đúp ở giữa chuỗi. Cuối cùng, thực hiện cắt dấu cách ở đầu và cuối chuỗi sạch nếu có).
