SỞ GIÁO DỤC VÀ ĐÀO TẠO YÊN BÁI TRƯỜNG TRUNG HỌC PHỔ THÔNG HƯNG KHÁNH BÁO CÁO SÁNG KIẾN CẤP CƠ SỞ LĨNH VỰC TIN HỌC TÊN SÁNG KIẾN KỸ THUẬT LÀM MỊN CHƯƠNG TRÌNH Tác giả CAO DANH THẠCH Trình độ chuyên môn[.]
SỞ GIÁO DỤC VÀ ĐÀO TẠO YÊN BÁI TRƯỜNG TRUNG HỌC PHỔ THÔNG HƯNG KHÁNH BÁO CÁO SÁNG KIẾN CẤP CƠ SỞ LĨNH VỰC: TIN HỌC TÊN SÁNG KIẾN KỸ THUẬT LÀM MỊN CHƯƠNG TRÌNH Tác giả: CAO DANH THẠCH Trình độ chun mơn: Đại học Cơng nghệ Thơng tin Chức vụ: Giáo viên Đơn vị công tác: Trường Trung học phổ thông Hưng Khánh Yên Bái, ngày 19 tháng 01 năm 2022 MỤC LỤC I THÔNG TIN CHUNG VỀ SÁNG KIẾN Tên sáng kiến: Lĩnh vực áp dụng sáng kiến: 3 Phạm vi áp dụng sáng kiến: Thời gian áp dụng sáng kiến: Tác giả: II MÔ TẢ SÁNG KIẾN: Tình trạng giải pháp biết Nội dung giải pháp đề nghị công nhận sáng kiến: Bài A Tìm ước GCD.* Bài B SỐ ĐẸP Bài C GIẢI PHƯƠNG TRÌNH 11 Bài D TÍCH CÁC CHỮ SỐ 14 Bài E SỐ NGHỊCH THẾ 17 Bài F Tìm ước chung lớn 18 Bài G Sắp xếp dãy số 20 Bài H Vị trí số nguyên tố 22 Bài I Xâu đối xứng dài 23 Bài J Chọn số 24 Khả áp dụng giải pháp 288 Hiệu quả, lợi ích thu dự kiến thu áp dụng giải pháp 28 Các điều kiện cần thiết để áp dụng sáng kiến 299 III Cam kết không chép vi phạm quyền 30 IV TÀI LIỆU THAM KHẢO 30 I THÔNG TIN CHUNG VỀ SÁNG KIẾN Tên sáng kiến: KỸ THUẬT LÀM MỊN CHƯƠNG TRÌNH Lĩnh vực áp dụng sáng kiến: Tin học Phạm vi áp dụng sáng kiến: Sáng kiến áp dụng dạy môn Tin học 11 dạy bồi dưỡng học sinh giỏi môn Tin học Thời gian áp dụng sáng kiến: Từ ngày 25 tháng năm 2020 đến ngày 18 tháng 01 năm 2022 Tác giả: Họ tên: Cao Danh Thạch Năm sinh: 1973 Trình độ chun mơn: Đại học Chức vụ công tác: Giáo viên Tin học Nơi làm việc: Trường THPT Hưng Khánh Địa liên hệ: Cao Danh Thạch, giáo viên Tin học, trường THPT Hưng Khánh Điện thoại: 0969991672 II MÔ TẢ SÁNG KIẾN: Tình trạng giải pháp biết Các tốn lập trình tối ưu ngày quan tâm nghiên cứu, phát triển, ứng dụng khoa học sống Trong năm gần đây, toán lập trình tối ưu xuất nhiều đề thi giỏi cấp Một cách tiếp cận toán kỹ thuật làm mịn chương trình Nắm vững kỹ thuật làm mịn chương trình, học sinh có kĩ cần thiết để làm tốt toán lập trình mơn Tin học 11 Đồng thời, sáng kiến kinh nghiệm nguồn tài liệu bổ ích, quý giá cho giáo viên dạy bồi dưỡng học sinh giỏi môn Tin học Hiện tài liệu viết kỹ thuật làm mịn chương trình khơng nhiều, có chủ yếu tập trung lí thuyết thuật tốn Trong việc mơ tả thuật tốn ngơn ngữ lập trình Pascal địi hỏi người học phải có kĩ cài đặt tốt cài đặt thành cơng thuật tốn, mà học sinh chưa có đủ kĩ Yêu cầu đặt là: Tài liệu kỹ thuật làm mịn chương trình mà nội dung phương pháp rõ ràng, có mã nguồn tham khảo dễ hiểu, hệ thống tập định hướng rèn luyện kỹ cài đặt, kĩ phát thuật toán tối ưu để giải tốn lập trình Giáo viên học sinh sử dụng tài liệu kết hợp với sách giáo khoa Tin học 11 cách hiệu Trong phạm vi sáng kiến kinh nghiệm tơi xin đề cập đến toán áp dụng kĩ thuật làm mịn chương trình Phạm vi giới hạn sáng kiến: - Kỹ thuật làm mịn chương trình - Các tốn áp dụng kỹ thuật làm mịn chương trình - Hình thành kĩ cần thiết cho học sinh tiếp cận với tốn lập trình Nội dung giải pháp đề nghị công nhận sáng kiến: Chúng ta biết rằng: Khi học môn Tin học 11, học sinh học tư lập trình với ngơn ngữ lập trình cụ thể Ở ngơn ngữ lập trình Pascal, tương lai ngơn ngữ lập trình C++ Python Ở tốn, ln có thuật tốn đơn giản để xử lí có nhiều thuật toán tốt để giải tốn trọn vẹn Mơ hình kĩ thuật làm mịn chương trình sau: Bài tốn Bài toán i toán thuật toán i1 toán thuật toán i2 toán N thuật toán iM Mỗi toán, chia thành toán nhỏ Ở toán nhỏ tốn sở chia thành toán nhỏ Khi giải toán gốc (bài tốn 0) ta cài đặt thuật toán Khi chia thành toán tốn con, ta giải phần trọn vẹn thuật tốn tối ưu Từ toán giải thuật toán tốt Việc chia toán thành toán nhỏ sở tìm kiếm thuật tốn tốt để giải Áp dụng kỹ thuật làm mịn chương trình để giải tốn sau, giúp hình thành tư lập trình kỹ cài đặt chương trình cho học sinh: Bài A Tìm ước GCD.* Cho số nguyên dương N (N ≤ 108) Liệt kê ước nguyên tố N Ví dụ: N = 10; Các ước nguyên tố 2, Ý tưởng thuật toán: Subtask1: Duyệt I từ tới N, I ước N I nguyên tố đưa I For i:=1 to n If (n mod I = 0) and (nguyento(i) = true) then write(I,#32); Độ phức tạp thuật tốn: Vịng For ngồi N phép tính, với I ta kiểm tra tính nguyên tố √𝑁 phép tính Vậy độ phức tạp O(N √𝑁) Làm theo cách học sinh chạy với N ≤ 104 Không đạt điểm tối đa Ở cách ta tổ chức hàm kiểm tra tính ngun tố (bài tốn con) Tuy nhiên thuật toán chưa thực tốt Subtask2: Bổ đề: Nếu I ước N thì: N mod I = N mod (N div I) = Ví dụ: 100 chia hết cho 2, 100 chia hết cho phần lại 50 I khác 1, bé có, ước N thuộc đoạn [2, √𝑁] Vậy ta thực hiện: Duyệt I từ tới √𝑁, I ước N thì: + I nguyên tố đẩy I vào mảng C[k] + Nếu (I N div I) nguyento(N div i) = true đẩy N div I vào C[k]; Sắp xếp mảng lưu nghiệm C[k] thành dãy không giảm, đưa mảng C[k] Độ phức tạp thuật tốn: Vịng For ngồi √𝑁 phép tính, với I ta kiểm tra tính nguyên tố √𝑁 phép tính Vậy độ phức tạp O(N) Làm theo cách học sinh chạy với N ≤ 106 Không đạt điểm tối đa Subtask3: Ta nhận thấy: số 100 = 2.2.5.5 ước nguyên tố N Số 26 = 2.13 có ước nguyên tố 13 Vậy, với số N ta phân tích N thành tích thừa số nguyên tố lưu vào mảng C Sắp xếp mảng C thành dãy không giảm, nén mảng C thành mảng D chứa C[i] khác Đưa mảng D Chỗ này, ta xử lí khéo léo chỗ tạo mảng C lưu phần tử khác vào mảng C Ta tổ chức thủ tục phân tích số N thành tích thừa số nguyên tố uses math; var n,i,k:longint; c:array[-1 100007] of longint; procedure nhapdl; begin assign(input,'GCD.INP'); reset(input); assign(output,'GCD.OUT'); rewrite(output); readln(n); end; procedure phantich(u:longint); begin i:=2; while (i*i)0) and (u mod i=0) begin if c[k] I then begin inc(k); c[k]:=i; end; u:=u div i; end; inc(i); end; if u>1 then begin inc(k); c[k]:=u; end; end; begin nhapdl; k:=0; phantich(n); for i:=1 to k write(c[i],#32); close(input); close(output); end Độ phức tạp thuật toán: O(√𝑁) Làm theo cách học sinh chạy với N ≤ 108 Đạt điểm tối đa Bài B SỐ ĐẸP Một số gọi đẹp tổng bình phương chữ số (trong dạng biểu diễn thập phân) số nguyên tố Ví dụ, 12 số đẹp 12+22 = – số nguyên tố Các số đẹp đánh số theo thứ tự tăng dần giá trị, trở Yêu cầu: Cho số nguyên n (1 ≤ n ≤ 10000) Hãy tìm số đẹp thứ n Dữ liệu: Vào từ file văn BEAUTY2.INP, gồm nhiều tests, test cho dòng chứa số nguyên n Kết quả: Đưa file văn BEAUTY2.OUT, kết test đưa dòng Ví dụ: BEAUTY2.INP BEAUTY2.OUT 11 12 23 Ý tưởng thuật toán: Từ toán ta tổ chức chương trình gồm: Hàm tính tổng bình phương chữ số U Độ phức tạp thuật tốn O(loglogU) Vấn đề đặt hàm kiểm tra tính nguyên tố U Dựa vào định nghĩa: Số nguyên tố số nguyên dương > có hai ước Subtask1: Hàm kiểm tra tính nguyên tố U Duyệt I từ tới U: U chia hết cho I kt:= false; kt:= true; Với số nguyên dương U ta phải For tới U độ phức tạp thuật toán cách O(U) Độ phức tạp chung: O(U.loglogU) cho đoạn kiểm tra số số đẹp Subtask2: Hàm kiểm tra tính ngun tố U Duyệt I từ tới U div 2: U chia hết cho I kt:= false; kt:= true; Với số nguyên dương U ta phải For tới U div độ phức tạp thuật toán cách O(U div 2) Độ phức tạp chung: O((U div 2).loglogU) cho đoạn kiểm tra số số đẹp Subtask3: Với số nguyên U > 1, U có ước ngồi U I ước I có I thuộc đoạn [2, √𝑈] Khi đó, U có ước là: 1, I U U khơng số nguyên tố Với số nguyên dương U ta phải For tới √𝑈 độ phức tạp thuật toán cách O(√𝑈.loglogU) để kiểm tra U số đẹp Làm cách ta đạt điểm tối đa uses math; 10 var a:array[-1 100007] of longint; n,i:longint; function NT(x:longint):boolean; var j:longint; begin if (x0 begin s:=s+sqr(u mod 10); u:=u div 10; end; if nt(s) then exit(true) else exit(false); end; function TIMSD(x:longint):int64; var d,p:longint; begin d:=0; p:=1; while d aj Yêu cầu: Cho n hoán vị A Hãy xác định số nghịch Dữ liệu: Vào từ file văn INVERS.INP: • Dịng chứa số ngun n, • Dịng thứ chứa n số nguyên xác định hoán vị A Kết quả: Đưa file văn INVERS.OUT số nguyên – số lượng nghịch Ví dụ: INVERS.INP INVERS.OUT 5 24351 Ý tưởng thuật toán: Subtask1: Tổ chức hàm check(u,v:longint): boolean; để kiểm tra a[u] < a[v] u < v hay không For u:=1 to N for v :=1 to N check(u,v) = true tăng đếm lên Độ phức tạp O(N2) Subtask2: Khơng tính tổng qt, ta xếp dãy số thành dãy không giảm lưu số Duyệt từ tới N ta chặt nhị phân tìm phần tử bé lớn a[i] có số[res] > chiso[a[i]] tăng đếm lên 18 Chi phí chặt nhị phân O(logN) Vịng For ngồi O(N) Vậy chi phí chung O(N.logN) uses math; var a:array[-1 100007] of longint; i,n,j,res:longint; procedure nhapdl; begin assign(input,'INVERS.INP'); reset(input); assign(output,'INVERS.OUT'); rewrite(output); readln(n); for i:=1 to n read(a[i]); end; procedure xl; begin res:=0; for i:=1 to n-1 for j:=i+1 to n if a[i]0 Begin R:= u mod v; U:= v; V:=r; End; Exit(u); End; Kết toán: res:= gcd(a,gcd(b,c)); Độ phức tạp thuật tốn: O(logloga); NOTE: 20 • Tổng qt lên, để tìm GCD dãy a1, a2, …, aN Ta gắn res := a[1]; For(i,2,N) res:=gdc(res,a[i]); • Bội chung nhỏ a b là: a*b div GCD(a,b); Tổng quát lên ta tìm BCNN N phần tử Bài G Sắp xếp dãy số Cho N dãy a1, a2,…,aN Hãy xếp dãy thành dãy khơng Đưa dãy sau xếp Ví dụ: N = 6; dãy → 3 Thuật toán: Subtask1: Sử dụng thuật toán xếp bọt For i:=1 to n-1 For j:=1 to n Nếu a[i] > a[j] đổi chỗ (a[i],a[j]) Độ phức tạp thuật toán: O(N2) Subtask2: Ta sử dụng thuật toán Sắp xếp nhanh Quicksort để xếp dãy số thành dãy không giảm Ta nên cố định code xếp nhanh sau: Procedure qsort(L, H:longint); Var i,j,mid, temp:longint; Begin If (L>H) then exit(); I:=L; J:=H; Mid:=a[(i+j) div 2]; While i