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

SKKN sử dụng một số định lí suy luận toán học để lập trình giải một bài toán bồi dưỡng học sinh giỏi tin học

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 (141.45 KB, 21 trang )

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HỐ

TRƯỜNG THPT NƠNG CỐNG II

SÁNG KIẾN KINH NGHIỆM

SỬ DỤNG MỘT SỐ ĐỊNH LÝ VÀ SUY LUẬN TỐN
HỌC ĐỂ LẬP TRÌNH GIẢI MỘT SỐ BÀI TOÁN BỒI
DƯỠNG HỌC SINH GIỎI TIN HỌC

Người thực hiện: Hồng Thị Yến
Chức vụ: Giáo viên
Đơn vị cơng tác: Trường THPT Nông Cống II
SKKN thuộc lĩnh mực (môn): Tin học

THANH HOÁ NĂM 2021
1


MỤC LỤC
TRANG
1. MỞ ĐẦU......................................................................................................2
1.1. Lý do chọn đề tài.......................................................................................2
1.2. Mục đích nghiên cứu.................................................................................2
1.3. Đối tượng nghiên cứu................................................................................3
1.4. Phương pháp nghiên cứu...........................................................................3
2. NỘI DUNG CỦA SÁNG KIẾN KINH NGHIỆM....................................3
1 Cơ sở lý luận của sáng kiến kinh nghiệm....................................................3
2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm...................4
3 Các sáng kiến kinh nghiệm hoặc các giải pháp đã sử dụng
để giải quyết vấn đề...................................................................................5


2.3.1. Định lý pytago...............................................................................6
2.3.2. Định lý Ơclit.................................................................................7
2.3.3. Định lý Lơgiăngđrơ......................................................................8
2.3.4. Định lý Viet...................................................................................12
2.3.5. Suy luận toán học..........................................................................13
2.3.6. Định lý cơ bản của số học.............................................................15
2.3.7. Nguyên lý Dirile...........................................................................16
2.4.
Hiệu quả của sáng kiến kinh nghiệm đối với hoạt động
giáo dục, với bản thân, đồng nghiệp và nhà trường...................................18
3. KẾT LUẬN, KIẾN NGHỊ..........................................................................18
3.1. Kết luận......................................................................................................18
3.2. Kiến nghị...................................................................................................19
TÀI LIỆU THAM KHẢO...............................................................................20

2


1. MỞ ĐẦU
1.1. Lí do chọn đề tài.
Sau cuộc cách mạng cơng nghiệp liên quan đến cơ khí, điện, động cơ đốt
trong, con người đang ở khoảng năm thứ 40 của cuộc cách mạng tin học – thời
đại máy tính. Để đáp ứng nhu cầu của thời đại công nghiệp hóa, hiện đại hóa,
giáo dục phổ thơng trang bị cho học sinh tri thức về tốn học, vật lý, hóa học,….
Tương tự như vậy, để đáp ứng nhu cầu thời đại số hóa, thời đại của cách mạng
tin học thì phải trang bị cho công dân tương lai kiến thức, kỹ năng, năng lực tin
học.
Tin học là hành trang thiết yếu trên con đường nghề nghiệp. Phần lớn các
ngành nghề trong xã hội hiện đại đòi hỏi hiểu biết tin học. Thêm nữa, rất nhiều
ngành nghề mới xuất hiện trong lĩnh vực tin học như: lập trình viên, quản trị

mạng, thiết kế cơ sở kỹ thuật, an ninh mạng,… Đối với chính ngành giáo dục,
tin học là cơ sở hạ tầng của giáo dục. Tin học là môi trường dạy học, công cụ
quản lý giáo dục, công cụ sư phạm, thiết bị học tập cá nhân, làm việc của nhóm
giáo viên, học sinh.
Học sinh THPT là nguồn lao động trẻ có thể sử dụng ngay sau khi tốt
nghiệp do vậy việc được tiếp cận công nghệ thông tin từ trong nhà trường phổ
thơng sẽ giúp cho học sinh có thể tự tin hơn trong công việc. Việc đào tạo học
sinh có nền tảng lập trình cơ bản và có đam mê lập trình có vai trị quan trọng
trong sự phát triển sau này của các em. Thông qua việc dạy đội tuyển học sinh
giỏi, dạy những lớp mũi nhọn nhiều năm để học sinh u thích lập trình tơi rút ra
những kinh nghiệm sau: Tạo sự đam mê lập trình và đọc sách; vận dụng các kiến
thức đã học để giải các bài tốn thực tế; hình thành và phát triển tư duy logic;
hình thành các bước để giải quyết vấn đề nêu ra; dạy học thông qua các chuyên
đề độc lập hay liên hệ giữa toán học và tin học để giải quyết các bài tốn.
Vì vậy ngồi dạy học chính khóa Tin học trong nhà trường nhằm đảm bảo
tính phổ thơng, hướng nghiệp và dạy nghề, ta cần phải tạo điều kiện cho các học
sinh có năng khiếu về Tin học phát triển về khả năng lập trình để giải quyết bài
toán từ đơn giản đến nâng cao. Góp phần nâng cao chất lượng dạy và học Tin
học 11 ở nhà trường phổ thông, bồi dưỡng các học sinh có năng khiếu và u
thích mơn tin học. Bồi dưỡng học sinh giỏi là nhiệm vụ khó khơng chỉ từ việc
lựa chọn học sinh, lựa chọn phương pháp mà còn đòi hỏi nhiều kiến thức, kỹ
năng vận dụng cao.
Trong quá trình dạy học sinh và đứng đội tuyển học sinh giỏi tơi thấy rằng
nhiều bài tốn sẽ được giải quyết nhanh nếu chúng ta biết một số định lý tốn
học, tính chất của các số và áp dụng hợp lý. Với những lý do trên nên tôi quyết
định chọn đề tài :“Sử dụng một số định lý và suy luận tốn học để lập trình
giải một số bài tốn bồi dưỡng học sinh giỏi Tin học”.
1.2. Mục đích nghiên cứu.
3



Đưa ra một số định lý toán học, sử dụng định lý đó và suy luận trong tốn
học để giải quyết một số bài toán trở nên tối ưu hơn, phát huy khả năng tư duy
sáng tạo cho học sinh và nâng cao chất lượng học sinh giỏi. Đặc biệt hình thành
ở học sinh kỹ năng phân tích, xử lý các vấn đề thường gặp trong lập trình giải
bài tốn phức tạp mà nhiều tài liệu chưa đề cập đến.
1.3. Đối tượng nghiên cứu.
Học sinh khối 11 và đội tuyển học sinh giỏi trường THPT Nông Cống II.
1.4. Phương pháp nghiên cứu.
+ Phương pháp nghiên cứu xây dựng cơ sở lý thuyết
+ Kỹ thuật phân tích thuật tốn
+ Phát triển tư duy học sinh
+ Tìm hiểu và phát triển kỹ năng.
+ Tham khảo các tài liệu lấy từ nhiều nguồn nhất là các học liệu mở trên
mạng internet và phân tích có hệ thống các dạng bài tập theo nội dung đã đề ra.
2. NỘI DUNG SÁNG KIẾN KINH NGHIỆM
2.1.

Cơ sở lí luận của sáng kiến kinh nghiệm.
Nghị quyết hội nghị trung ương 8 khóa XI về đổi mới căn bản toàn diện giáo
dục và đào tạo đã đề ra mục tiêu tổng quát: Tạo chuyển biến căn bản, mạnh mẽ
về chất lượng, hiệu quả giáo dục, đào tạo; đáp ứng ngày càng tốt hơn công cuộc
xây dựng, bảo vệ Tổ quốc và nhu cầu học tập của nhân dân. Giáo dục con người
Việt Nam phát triển toàn diện và phát huy tốt nhất tiềm năng, khả năng sáng tạo
của mỗi cá nhân; yêu gia đình, yêu Tổ quốc, yêu đồng bào; sống tốt và làm việc
hiệu quả. Phát triển khả năng sáng tạo, tự học, khuyến khích học tập suốt đời.
Tiếp tục đổi mới mạnh mẽ và đồng bộ các yếu tố cơ bản của giáo dục, đào tạo
theo hướng coi trọng phát triển phẩm chất, năng lực của người học. Đa dạng hóa
nội dung, tài liệu học tập, đáp ứng yêu cầu của các bậc học, các chương trình
giáo dục, đào tạo và nhu cầu học tập suốt đời của mọi người.

Tiếp tục đổi mới mạnh mẽ phương pháp dạy và học theo hướng hiện đại;
phát huy tính tích cực, chủ động, sáng tạo và vận dụng kiến thức, kỹ năng của
người học; khắc phục lối truyền thụ áp đặt một chiều, ghi nhớ máy móc. Tập
trung dạy cách học, cách nghĩ, khuyến khích tự học, tạo cơ sở để người học tự
cập nhật và đổi mới tri thức, kỹ năng, phát triển năng lực. Chuyển từ học chủ
yếu trên lớp sang tổ chức hình thức học tập đa dạng, chú ý các hoạt động xã hội,
ngoại khóa, nghiên cứu khoa học. Đẩy mạnh ứng dụng công nghệ thông tin và
truyền thông trong dạy và học. Đổi mới mạnh mẽ và đồng bộ mục tiêu, chương
trình, nội dung, phương pháp, hình thức giáo dục, đào tạo theo hướng coi trọng
phát triển năng lực và phẩm chất của người học. Theo hướng phát triển mạnh
năng lực và phẩm chất người học, bảo đảm hài hịa đức, trí, thể, mỹ; thực hiện
4


tốt phương châm mới: Dạy người, dạy chữ và dạy nghề. Chú trọng giáo dục
nhân cách, đạo đức, lối sống, tri thức pháp luật và ý thức công dân
Luật Giáo dục số 38/2005/QH11, Điều 28 quy định: “Phương pháp giáo dục
phổ thơng phải phát huy tính tích cực, tự giác, chủ động, sáng tạo của học sinh;
phù hợp với đặc điểm của từng lớp học, môn học; bồi dưỡng phương pháp tự
học, khả năng làm việc theo nhóm; rèn luyện kỹ năng kiến thức vào thực tiễn;
tác động đến tình cảm, đem lại niềm vui, hứng thú học tập cho học sinh”
Căn cứ vào những quan điểm, định hướng trên để xác định ra nhiệm vụ cụ
thể của môn Tin học, tổ chức hoạt động đào tạo góp phần thực hiện mục tiêu
giáo dục mà Đảng và nhà nước đề ra. Ngoài việc tạo điều kiện cho học sinh
chiếm lĩnh những tri thức và kỹ năng Tin học cần thiết, Tin học cịn có tác dụng
phát triển năng lực trí tuệ chung như: phân tích, tổng hợp, trừu tượng hố, khái
qt hố, rèn luyện những đức tính, phẩm chất của người lao động mới. Học
sinh sẽ thấy rõ hiệu quả mạnh mẽ của công nghệ thông tin và nhận thức cần có.
Tốn học có ảnh hưởng rất lớn đến mọi lĩnh vực của cuộc sống. Các bài toán
tin nếu được thuật toán trên cơ sở lý thuyết toán học vững chắc sẽ đem lại kết

quả tốt hơn rất nhiều so với các thuật tốn khác. Qua đó ta có thể thấy được sự
liên quan mật thiết như thế nào. Việc sử dụng một số định lý và suy luận toán
học khi lập trình giải một số bài tốn sẽ tối ưu hơn.

2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm.
• Thực trạng chung:
Sự quan trọng của CNTT trong xã hội hiện nay ai cũng biết nhưng để được
sự quan tâm của các em học sinh, phụ huynh, nhà trường là cả một khó khăn.
Lập trình Pascal là mơn học khó, trừu tượng học sinh khó nắm được kiến
thức. Khả năng nhận dạng, phân tích đề của học sinh chưa chắc chắn, đôi khi sai
kiến thức cơ bản về cú pháp và ngữ nghĩa. Kiến thức cơ bản trong sách giáo
khoa Tin học 11 chưa đủ để học sinh làm tốt các đề thi học sinh giỏi. Đa số kiến
thức thi học sinh giỏi là những kiến thức trong sách tham khảo, nâng cao. Vì thế
giáo viên dạy bồi dưỡng học sinh giỏi phải có chương trình bồi dưỡng thường
xuyên, tập hợp, biên soạn tư liệu phù hợp với đối tượng học sinh và đảm bảo
mức độ của đề thi học sinh giỏi.
• Thuận lợi và khó khăn khi thực hiện đề tài ở trường THPT Nông Cống
II
- Thuận lợi:
+ Nhà trường:

5


Bộ môn Tin học được đưa vào giảng dạy cấp trung học phổ thông đã được
hơn 10 năm, nhà trường đã tạo điều kiện về cơ sở vật chất như máy tính, trang
thiết bị để phục vụ cho việc dạy và học môn Tin học.
+ Giáo viên:
Giáo viên được đào tạo chuẩn kiến thức cơ bản và nâng cao về Tin học.
Giáo viên giảng dạy đã qua đào tạo chuyên ngành Sư phạm Tin học, bồi

dưỡng kiến thức qua các đợt tập huấn do Sở giáo dục và đào tạo tổ chức.
Được sự giúp đỡ, tạo điều kiện của tổ nhóm chun mơn Tốn – Tin.
+ Học sinh:
Phần lớn học sinh có kiến thức, tư duy tốn học cơ bản do đó tiếp cận lập
trình một cách dễ dàng hơn. Một số học sinh có khả năng phát triển về lập trình
và u thích lập trình.
Nhiều học sinh đã thấy được tiềm năng phát triển của ngành CNTT trong
tương lai, qua đó có ý thức và định hướng về nghề CNTT.
Đặc biệt trong vài năm trở lại đây có một số trường Đại học tuyển thẳng
học sinh đạt giải cao trong kỳ thi học sinh giỏi cấp tỉnh. Từ đó làm thay đổi một
phần cách nhìn với một mơn khơng thi quốc gia THPT.
- Khó khăn:
+ Nhà trường:
Nhà trường đã tạo điều kiện tối đa nhưng vì nhiều lý do nên cơ sở vật chất
để có thể học tốt mơn tin học chưa đáp ứng được nhu cầu của học sinh.
+ Giáo viên:
Mức độ tiếp thu kiến thức của học sinh là khác nhau nên tính hiệu quả chưa
đồng đều. Địi hỏi sự đầu tư thời gian cơng sức của giáo viên nhiều.
Giáo viên thường gặp khó khăn về phân hố học sinh và bồi dưỡng học
sinh u thích và học khá giỏi môn tin.
Tài liệu của môn tin học trong nhà trường khá ít do đó gây khó khăn cho
việc nâng cao trình độ.
Đời sống giáo viên cịn nhiều khó khăn nên việc tập trung tối đa cho mơn
học cũng bị ảnh hưởng.
+ Học sinh:
Chương trình học, thi cử ở phổ thông khá nặng và chiếm lượng thời gian
lớn nên việc học sinh bỏ thời gian đầu tư cho một môn không tham gia thi THPT
Quốc gia là rất ít.
Lập trình có đặc trưng riêng so với các mơn học khác nên sự tiếp cận của
học sinh khá khó khăn.

Nhiều học sinh u thích và đam mê lập trình nhưng điều kiện kinh tế gia
đình chưa đủ để các em có thể chuyên tâm học tập.
6


2.3.

Các sáng kiến kinh nghiệm hoặc các giải pháp đã sử dụng để giải quyết vấn
đề.
Mọi bài tốn có thuật tốn đều có thể giải được trên máy tính điện tử. Mỗi
thuật tốn chỉ giải một bài tốn, nhưng có thể có nhiều thuật tốn khác nhau
cùng giải một bài toán. Cần thiết phải lựa chọn một thuật toán phù hợp, để lập
trình bài tốn thường dựa trên hai yếu tố quan trọng là thời gian và không gian.
Trong khi lập trình giải một số bài tốn nếu chỉ sử dụng kiến thức cơ bản đơn
thuần thì chương trình đó chỉ chạy được bộ test nhỏ. Vậy làm thế nào để chương
trình đó có thể chạy được bộ test lớn trong khoảng thời gian rất ngắn? Ở đây tôi
muốn đưa ra được mối liên hệ mật thiết giữa toán học và tin học để giải quyết
vấn đề đó. Vì vậy để khuyến khích tính tích cực chủ động tiếp thu kiến thức của
học sinh, tôi giới thiệu một số bài toán cơ bản như sau:
2.3.1. Định lý pytago
Định lý: Trong một tam giác vng, bình phương cạnh huyền bằng tổng bình
phương hai cạnh góc vng.
Bài tốn. Tính diện tích 1
Một hình trịn nội tiếp trong tam giác đều cạnh a (như hình vẽ).
Cho cạnh a, hãy tính diện tích phần gạch chéo của hình
Input: Đọc dữ liệu từ tệp BAI1.INP
- Giá trị a
Ouput: Ghi dữ liệu vào tệp BAI1.OUT
- Diện tích phần gạch chéo, lấy 2 chữ số phần thập phân.
Ví dụ

BAI1.INP
BAI1.OUT
6
6.16
Thuật tốn:
+ Đường cao tam giác h: sử dụng định lý Pitago trong tam giác vuông:
h

a
a2 − ( )2
2

h
3

+ Bán kính đường trịn: r
- Tính diện tích tam giác S1: S1  .
- Tính diện tích hình trịn S2: S2  πr2.
- Diện tích phần gạch chéo: S1-S2.
Chương trình:
program dien_tich;
var a,s1,s2:real;
f1,f2:text;
7


begin
assign(f1,'BAI1.INP');reset(f1);
assign(f2,'BAI1.OUT');rewrite(f2);
readln(f1,a);

s1:=1/2*a*sqrt(a*a-a*a/4);
s2:=Pi*(a*a-a*a/4)/9;
write(f2,(s1-s2):0:2);
close(f1);close(f2);
end.
Bài tập áp dụng. Tính diện tích 2
Một tam giác đều cạnh a nội tiếp một đường trịn (như hình vẽ)
Cho cạnh a, hãy tính diện tích phần gạch chéo.
Input: Đọc dữ liệu từ tệp BAI2.INP
- Giá trị a.
Ouput: Ghi dữ liệu vào tệp BAI2.OUT
- Diện tích phần gạch chéo, lấy 2 chữ số phần thập phân.
Ví dụ
BAI2.INP
BAI2.OUT
3
5.52
2.3.2. Định lý Ơclit
Cho a, b là hai số nguyên (giả sử a ≥ b), để tìm ước chung
lớn nhất của hai số a và b ta cần thực hiện chia a cho b được
thương q và số dư r (r ≥ 0) tức là
a = b*q + r, khi đó ta có:
Ucln(a,b) =
Trong đó: r = a mod b
Bài tốn: Cộng phân số
C
D

A
B


Cho hai phân số
và .
Hãy xác định 2 số nguyên dương E và F thỏa mãn 2 điều kiện sau:
+ Điều kiện 1:

E A C
= +
F B D
E
F

+ Điều kiện 2:
là phân số tối giản
Input: Đọc dữ liệu từ tệp văn bản PHANSO.INP, có cấu trúc
+ Dịng 1 chứa hai số A và B.
+ Dòng 2 chứa hai số C và D.
( A, B, C, D là các số nguyên dương và không lớn hơn 104)
Output: kết quả đưa ra tệp văn bản PHANSO.OUT
8


Có một dịng chứa hai số E và F tìm được thỏa mãn hai điều kiện trên.
(Các số ghi trên một dịng được cách nhau bởi một dấu cách trống)
Ví dụ
PHANSO.INP
PHANSO.OUT
2 5
9 10
3 6

Thuật toán:
Với bài toán này chúng ta chỉ cần sử dụng một chương trình con tìm UCLN của
2 số là giải quyết được.
Chương trình:
Program cong_phan_so;
var a,b,c,d,e,f,u:longint;
f1,f2:text;
function ucln(m,n:longint): longint;
begin
while (m<>0) and (n<>0) do
if m>n then m:=m mod n
else n:=n mod m;
ucln:= m+n;
end;
BEGIN
assign(f1,'PHANSO.INP');reset(f1);
assign(f2,'PHANSO.OUT'); rewrite(f2);
read(f1,a,b,c,d);
e:=a*d+b*c;
f:=b*d;
u:=ucln(e,f);
write(f2,e div u,' ',f div u);
close(f1); close(f2)
END.
Bài tập áp dụng: Cho 3 số nguyên A, B, C. Hãy tìm cặp số nguyên x và y sao
cho thỏa mãn phương trình: Ax +By = C.
Input: từ tệp văn bản CAPSO.INP, có cấu trúc
+ Dịng 1 chứa ba số A, B và C.
( A, B, C là các số nguyên và không lớn hơn 104)
Output: kết quả đưa ra tệp văn bản CAPSO.OUT

Có một dịng chứa hai số x và y tìm được thỏa mãn điều kiện trên. Nếu
khơng có cặp số x, y thỏa mãn thì đưa ra số 0
CAPSO.INP
CAPSO.OUT
29 8 1
-3 11
9


Thuật toán:
Đối với bài toán này ta dựa vào định lý Ơclit mở rộng: UCLN(A, B) có
một tính chất khá đặc biệt đó là ln biểu diễn được ở dạng:
Ax + By = UCLN(A, B) trong đó x, y là hai số nguyên.
Để tồn tại cặp số nguyên x, y thỏa mãn điều kiện thì điều kiện cần và đủ
là UCLN(A,B) là ước của C.
2.3.3. Định lý Lơgiăngđrơ
Trong triển khai số n! (n là số tự nhiên lớn hơn 1) ra thừa số nguyên tố thì
thừa số nguyên tố p có số mũ là:
Bài tốn: Tìm số mũ của số nguyên tố p trong cách phân tích của n! ra thừa số
nguyên tố (n ≤ 231).
Việc duyệt các số nguyên là bội của p từ 1 đến n để chia cho p tìm số mũ
rồi lấy tổng các số mũ này là khơng thể thực hiện được.
Ví dụ:
Nếu n=231 cịn p = 2 thì ta phải duyệt qua (n div p) số, đại lượng này bằng
230 =1.073.741.824 tức là hơn 1 tỷ số cần phải duyệt. Nội chỉ việc cho biến i
chạy qua 230 số này mà chưa làm gì cả cũng đã mất khoảng 10 giây rồi
Như vậy ta cần phải tìm 1 cách khác để tính số mũ của p.
Gọi si là số chia hết cho p i trong khoảng 1..n. Số này bằng tổng của số các
số chia hết cho p, p2, p3… trong khoảng 1..n.
Dễ thấy số mũ của p là s1+s2+…+sk với k lớn nhất sao cho pk ≤ n

Ví dụ: n=29 và p =3 thì k=3, s1 =9, s2 =3, s3 =1 → Số mũ của 3 là
s1+s2+s3 =13. Mặt khác các số chia hết cho p i trong khoảng 1..n là: 1* p i, 2* pi,
3* pi, …,*pi → có số.
Đây chính là nội dung của định lý Lơgiăngđrơ: Số mũ của số nguyên tố p
trong phân tích n! thành các thừa số nguyên tố là:
Để ý rằng (Số số chia hết cho p i+1 trong khoảng 1..n bằng số số chia hết
cho pi trong khoảng 1..(n div p)).
function SoMu(p:longint;n:longint):integer;
var count:integer;
begin
count:=0;
while n<>0 do
begin
n:=n div p;
Count:=count + n;
end;
SoMu:=count;
end;
10


Với k đủ lớn ta cóhay n < pk. Vì vậy hàm SoMu chỉ phải vào vòng lặp k lần
với k là số nguyên nhỏ nhất sao cho n < pk
Cụ thể trong bài này trường hợp lớn nhất là n = 231; p = 2 thì k = = 31 so với
230 (nhỏ hơn 34 triệu lần) !
Ta có thể áp dụng định lý Lơgiăngđrơ để giải quyết các bài tốn sau:
Bài tốn 1. Tìm chữ số tận cùng khác 0 của n!
Yêu cầu: Em hãy viết chương trình tìm chữ số tận cùng khác 0 của n! (với
n≤107)
Input: Đọc dữ liệu từ tệp CHUSO.INP gồm có nhiều dịng liên tiếp nhau,

trên mỗi dịng chứa một số ngun khơng âm N.
Output: Ghi vào tệp CHUSO.OUT có số dịng bằng số dòng tương ứng với
dữ liệu vào. Trên mỗi dòng ghi chữ số khác khơng cuối cùng của n!
Ví dụ:
CHUSO.INP CHUSO.OU
T
24
6
26
4
125
8
674
4
Thuật toán:
Các chữ số cuối cùng bằng 0 của n giai thừa được sinh ra khi và chỉ khi
trong khai triển ra thừa số ngun tố của tích trên có chứa các cặp thừa số 2 và
5. Vậy thì trước hết ta đếm số lượng các thừa số 2, kí hiệu là d2 và số lượng các
thừa số 5, kí hiệu là d5. Ta sử dụng định lý Lơgiăngđrơ để tính số mũ của 2 và
5.
Thí dụ, với n = 15 ta có dạng khai triển ra thừa số nguyên tố của n giai thừa như
sau:
n! = 1.2.3.(2.2).5.(2.3).7.(2.2.2).9.(2.5).11. (2.2.3).13.(2.7).(3.5)
Do đó d2 = 11 và d5 = 3. Vậy ta có ba cặp 2.5 = 10 và số mũ dôi ra của
thừa số 2 so với thừa số 5 sẽ là d2 – d5 = 11 – 3 = 8. Khi đó, kết quả sẽ là:
chữ số cuối cùng khác 0 của 15! = chữ số cuối cùng của k.2 d2-d5. Trong đó k là
tích của các thừa số cịn lại.
Dễ thấy với mọi n, ta ln có d2 > d5 vì cứ hai số liên tiếp thì có một số
chẵn (chia hết cho 2), còn năm số liên tiếp mới có một số chia hết cho 5.
Việc cịn lại là lấy tích k của các số cịn lại. Vì tích này không bao giờ tận

cùng bằng 0 cho nên ta chỉ cần giữ lại một chữ số cuối cùng bằng cách lấy mod
10.
Để tính chữ số tận cùng của 2m với m = d2 – d5 > 0 ta để ý đến tính tuần
hồn của nó, cụ thể là ta chỉ cần tính chữ số tận cùng của 2(m mod 4) với các
trường hợp:
m mod 4 = 0, 1, 2 và 3.
11


Theo thí dụ trên ta có m mod 4 = 8 mod 4 = 0, do đó chữ số cuối của 2 m là
6 chứ khơng phải là 1 vì m > 0. Ta tính được (những cặp 2 và 5 được gạch dưới)
15! = 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15 =
= 1.2.3.(2.2).5.(2.3).7.(2.2.2).9.(2.5).11. (2.2.3).13.(2.7).(3.5)
(3.3.7.9.11.3.13.7.3). 28 mod 10 =
= ((k mod 10) . (28 mod 10)) mod 10 = (3.6) mod 10 = 8.
Chữ số cuối cùng khác 0 của 15! là 8.
Lưu ý rằng (a.b) mod m=((a mod m).(b mod m)) mod m cho nên ta có thể
lấy mod ở các bước trung gian với số lần tùy ý.
Để tránh việc tràn số khi sử dụng các biến dung lượng nhỏ như kiểu word thay
vì dùng longint chúng ta có thể tăng thêm một phép tốn mod nữa. Chẳng hạn,
khi tích luỹ kết quả, thay vì viết k := (k*c) mod 10; ta nên viết k := (k*(c mod
10)) mod 10;
Chương trình:
Program chu_so_tan_cung_khac_0;
Var f1,f2:text;
N:longint;
function tim(n: longint): longint;
var m: longint;
i,k,x,d: longint;
begin

k := 1; m := 0;
tim := k;
if (n <= 1) then exit;
d := 0;
for i := 2 to n do
begin
x := i;
while x mod 2 = 0 do
begin m := m+1; x := x div 2;
end;
while x mod 5 = 0 do
begin m := m-1; x := x div 5; end;
k := (k*(x mod 10)) mod 10;
end;
case (m mod 4) of
0: x := 6;
1: x := 2;
2: x := 4;
3: x := 8;
end;
tim := (k*x) mod 10;
end;
BEGIN
12


assign(f1,'CHUSO.INP');reset(f1);
assign(f2,'CHUSO.OUT'); rewrite(f2);
while not eof(f1) do
begin

Readln(f1,n);
Writeln(f2,tim(n));
end;
Close(f1); Close(f2);
END.
Bài tốn áp dụng: Tìm số chữ số 0 tận cùng n!
Thuật toán:
Ta thấy n! khi phân tích ra thừa số ngun tố thì có dạng:
n! = 2SoMu(2,n) * 5SoMu(5,n) *…
Trong công thức Lơgiăngđrơ nếu p1< p2 thì SoMu(p1,n) ≥ SoMu(p2,n)
nên số chữ số 0 tận cùng của n! chính là SoMu(5,n).
2.3.4. Định lý Viet
Bài tốn: Cho số thực R. Tìm các số thực a1,a2,a3,…,an sao cho
(các số trong dãy a có thể bằng nhau)
Input: Đọc dữ liệu từ tệp SOTHUC.INP
Gồm: Duy nhất một số thực R
Output: Ghi kết quả vào tệp SOTHUC.OUT
Gồm: Các số thực a1, a2, a3, …, an mỗi số ghi trên một dịng (lấy 5 chữ
số phần thập phân). Nếu khơng tìm được số nào thì ghi ‘No’.
Ví dụ:
SOTHUC.INP
SOTHUC.OUT
4
2.00000 2.00000
Thuật tốn:
Sử dụng định lí Viet để giải.
Trước hết ta lập phương trình t2 − R*t + R = 0. (1)
Nếu phương trình (1) vơ nghiệm thì khơng thể phân tích được R. Ngược
lại, gọi hai nghiệm của (1) là t1,t2 (t1,t2 có thể bằng nhau). Rồi sau đó tiếp tục
phân tích t1,t2. Như vậy ta phải cài đặt một chương trình đệ quy để tiến hành

phân tích R.
Chương trình:
Program Tim_cac_so_thuc;
uses crt;
var r,delta:real; f1,f2:text;
{*********************************}
Procedure xuli(r:real);
var x1,x2:real;
13


begin delta:=sqr(r)-4*r;
if delta>=0 then
begin
x1:=(r+sqrt(delta))/2; x2:=(r-sqrt(delta))/2;
xuli(x1); xuli(x2);
end
else write(f2,r:0:5,' ');
end;
{*********************************}
BEGIN clrscr;
assign(f1,'SOTHUC.INP'); reset(f1);
assign(f2,'SOTHUC.OUT'); rewrite(f2);
readln(f1,r);
xuli(r);
close(f1); close(f2);
END.
2.3.5. Suy luận toán học
Bài toán: Cho số nguyên dương N (N>1). Hãy viết tất cả những phân số tối giản
nhỏ hơn 1 có mẫu nhỏ hơn hoặc bằng N theo thứ tự tăng dần.

Input: Đọc dữ liệu từ tệp Faray.inp gồm số nguyên N.
Output: Ghi dữ liệu vào tệp Faray.out
Gồm: Nhiều dòng, mỗi dòng gồm hai số nguyên dương biểu thị tử và mẫu
cả một phân số.
Ví dụ:
Faray.inp
Faray.out
4
14
13
12
23
34
Thuật tốn
Nếu dùng hai vịng lặp lồng nhau để tìm tử và mẫu của các phân số, sau đó
sắp xếp lại theo thứ tự tăng dần thì cách làm đó khá lâu và tốn bộ nhớ.
Do đó tơi giới thiệu một thuật toán đã được nhà toán học người Anh là
Faray tìm ra.
Với N=4 thì dãy phân số tìm được.
Nhận thấy: Phân số ở giữa có tử và mẫu theo thứ tự bằng tổng các tử và
mẫu của hai phân số ở hai bên.
Ví dụ: hoặc
Từ nhận xét đó nhà tốn học người Anh đã đưa thuật tốn để tìm tất cả các phân
số như sau:
Bước 1: Bắt đầu bằng hai phân số và
14


Bước 2 : Ta lấy tổng của tử và mẫu của hai phân số kề nhau trong dãy được
tử và mẫu của một phân số mới. Nếu mẫu của phân số này nhỏ hơn hoặc bằng N

thì ta đặt phân số mới này vào dãy ở giữa hai phân số ban đầu. Lặp lại Bước 2
cho đến khi không làm được nữa. Cuối cùng khi ghi ra ta bỏ đi hai phân số và
là được dãy phân số cần tìm.
Dãy phân số thành lập như trên luôn là dãy tăng và ta khơng phải kiểm tra
tính tối giản của các phân số mà các phân số mới thêm vào luôn tối giản.
Ví dụ với N=4
Lúc đầu ta có hai phân số và
Lần thứ 1: Thêm phân số vào dãy do và 2<4 được dãy mới:
Lần thứ 2: Thêm được hai phân số và vào dãy được dãy mới:
Lần thứ 3: Lập được các phân số
nhưng ta chỉ thêm được vào dãy hai
phân số
do có mẫu bằng 4,cịn hai phân số kia có mẫu bằng 5>4. Lúc này dãy
mới là:
Đến đây ta không thể làm tiếp được nữa,dãy phân số cần tìm là:
Với thuật tốn trên ta sẽ cài đặt 1 chương trình đệ quy để làm bước thứ 2.
Chương trình:
Program Phan_so;
uses crt;
const fi='Faray.inp';
fo='Faray.out';
var t1,m1,t2,m2,n:word; g:text;
{***************************************}
procedure nhap;
var f:text;
begin assign(f,fi); reset(f);
readln(f,n);
close(f);
assign(g,fo); rewrite(g);
end;

{***************************************}
procedure viet(t1,m1:word);
begin
if t1>0 then writeln(g,t1,' ',m1);
end;
{***************************************}
procedure xuli(t1,m1,t2,m2:word);
begin
if m1+m2<=n then
begin
xuli(t1,m1,t1+t2,m1+m2);
xuli(t1+t2,m1+m2,t2,m2);
15


end

else viet(t1,m1);

end;
{****************************************}
procedure main;
begin nhap;
t1:=0; m1:=1;
t2:=1; m2:=1;
xuli(t1,m1,t2,m2); close(g);
end;
{******************************************}
BEGIN
clrscr; main;

END.
Dãy phân số tìm được có thể rất lớn, nhất là với N>100 vì vậy khơng thể
ghi ra file được. Để khắc phục điều này ta có thể viết nhiều phân số trên 1 dòng.
Nhưng cách này cũng chỉ giải pháp tạm thời. Bài tốn sẽ hay hơn nếu khơng bắt
viết hết tồn bộ dãy phân số mà chỉ yêu cầu viết 1 hay vài phân số của dãy, lúc
đó phải thêm vào một biến dem để ghi nhận vị trí của 1 phân số trong dãy.
2.3.6. Định lý cơ bản của số học
Mọi số nguyên dương đều có thể biểu diễn duy nhất thành tích của các số
nguyên tố.
Hệ quả: Mọi số tự nhiên N>1 đều có thể biễu diễn duy nhất dưới dạng
chuẩn tắc
trong đó ki là số nguyên dương và pi là các số nguyên tố với p1 < p2 < … < ps
Ta có các kết luận sau:
- Số các ước của N là:
- Tổng các ước của một số
Bài toán: Cho một số nguyên dương N (2các thừa số nguyên tố.
Input: Đọc dữ liệu từ tệp NGUYENTO.INP gồm N
Output: Ghi dữ liệu vào tệp NGUYENTO.OUT
Gồm: Nhiều dòng, mỗi dòng ghi thừa số cùng số mũ.
Ví dụ:
NGUYENTO.IN NGUYENTO.OUT
P
236
2^2
59^1
Thuật tốn:
Dùng một mảng để lưu lũy thừa. Mảng này có giá trị các phần tử ban đầu
đều bằng 0. Cho i chạy từ 2 đến Nếu n chia hết cho i thì tăng a[i] lên 1.
16



Khi in kiểm tra: Nếu a[i] >0 thì in i^a[i].
Chương trình
Const fi='NGUYENTO.INP';
fo='NGUYENTO.OUT';
Var n, i,s,j : longint;
a:array[2..100000]of longint;
f1,f2:text;
BEGIN
Assign(f1,fi);Reset(f1);
Assign(f2,fo);Rewrite(f2);
Read(f1,n);
i:=2;a[2]:=0;
While n<>1 do
begin
While n mod i<>0 do
begin
i:=i+1; a[i]:=0;
end;
a[i]:=a[i]+1; n:=n div i;
end;
For j:=2 to i do
If a[j]>0 then writeln(f2,j,'^',a[j]);
Close(f1);
Close(f2);
END.
2.3.7. Nguyên lý Dirile
Nếu xếp nhiều hơn n+1 đối tượng vào n cái hộp thì tồn tại ít nhất một hộp
chứa không ít hơn hai đối tượng

Bài toán: Cho số nguyên dương K và chữ số a (a>0). Tìm một số nguyên
dương nhỏ nhất chỉ gồm các chữ số a và 0 chia hết cho K.
Input: Đọc dữ liệu từ tệp CHIAHET.INP
Gồm: K, a (K ≤ 30000)
Output: Ghi dữ liệu vào tệp CHIAHET.OUT là Số cần tìm.
Ví dụ:
CHIAHET.INP CHIAHET.OUT
31
111
Thuật tốn:
Với bài này ta áp dụng ngun lí Dirile để giải. Ta thành lập K số mỗi số
gồm lần lượt 1,2,3,…,K số a.
Tức là: Số thứ nhất là a. Số thứ hai là aa. Số thứ ba là aaa…
Nếu trong K số này có 1 số chia hết cho K thì ghi nhận và kết thúc. Nếu
khơng thì K số này khi chia cho K sẽ nhận 1 trong K−1 số dư từ 1 đến K−1. Như
17


vậy theo ngun lí Dirile sẽ có ít nhất hai trong K số có cùng số dư khi chia cho
K, hiệu của chúng sẽ chia hết cho K đồng thời hiệu hai số này chỉ gồm các chữ
số a và 0.
Để giải quyết bài tốn một cách nhanh chóng ta phải nghĩ cách làm giảm
bớt cơng sức tìm kiếm số dư của một số bất kì trong K số được thành lập như
trên.
Dùng một mảng du: array[1..max] of word để lưu số dư của các số khi chia
cho K, một biến du10 để lưu số dư của 10 i khi chia cho K. Ta sẽ cập nhật du10
sau mỗi lần tăng i như sau: du10:=du10*10 mod k. Do đó số dư của số thứ i khi
chia cho K sẽ là: du[sl]:=(du10*a mod k + du[sl-1]) mod k.
Chương trình:
uses crt;

const fi='CHIAHET.INP';
fo='CHIAHET.OUT';
max=32000;
var du : array[1..max] of word;
sl,k,a : word;
{****************************************}
procedure nhap;
var f:text;
begin
fillchar(du,sizeof(du),0);
assign(f,fi);reset(f);
read(f,k,a); close(f);
end;
{****************************************}
function kt(sl:word;var vt:word):boolean;
var i:word;
begin kt:=true; vt:=0;
for i:=1 to sl-1 do
if du[i]=du[sl] then
begin vt:=i; exit; end;
kt:=false;
end;
{****************************************}
procedure xuli;
var vt:word; du10:longint; g:text;
begin sl:=1;
du[1]:=a mod k; du10:=1;
if du[1]>0 then
begin
repeat inc(sl); du10:=du10*10 mod k;

du[sl]:=(du10*a mod k + du[sl-1]) mod k;
18


if du[sl]=0 then begin vt:=0; break; end;
until kt(sl,vt);
end
else vt:=0;
assign(g,fo); rewrite(g);
for du10:=vt+1 to sl do write(g,a);
for du10:=1 to vt do write(g,0);
close(g);
end;
{****************************************}
procedure main;
begin
nhap; xuli;
end;
{*****************************************}
BEGIN
clrscr; main;
END.
2.4. Hiệu quả của sáng kiến kinh nghiệm đối với hoạt động giáo dục, với
bản thân, đồng nghiệp và nhà trường.
Sau quá trình áp dụng đề tài nghiên cứu trong việc bồi dưỡng học sinh giỏi
môn tin học 11 ở trường THPT Nông Cống II tôi đã thu được kết quả rất khả
quan. Học sinh đã nâng cao được tính tư duy sáng tạo, vận dụng linh hoạt lập
trình tốt mối liên hệ giữ tốn học và tin học. Từ đó học sinh có thể vận dụng tốt
các định lý và suy luận tốn học trong lập trình giải bài tốn trên máy tính.
Tơi đã áp dụng cách thức bồi dưỡng này qua các khóa học. Tùy thuộc vào

khả năng và trình độ của từng học sinh để sửa đổi bổ sung cho hợp lý. Thực sự
tôi thấy đã có hiệu quả trong việc học tập của các em, cụ thể các năm tôi hướng
dẫn đội tuyển thi học sinh giỏi cấp tỉnh đều đạt giải 100%, cụ thể:
Năm học 2013 – 2014: Đạt 1 giải nhì và 1 giải ba
Năm học 2014 – 2015: Đạt 2 giải ba.
Năm học 2015 – 2016: Đạt 2 giải ba.
Qua việc bồi dưỡng học sinh giỏi tơi thấy bản thân có nhiều kinh nghiệm,
bài học quý báu về chuyên môn. Không ngừng ở đó, tơi vẫn phải tiếp tục học
hỏi kinh nghiệm qua các tài liệu học, qua các đồng nghiệp bạn bè ở trường,
trong và ngoài tỉnh, qua các lớp học Online để tiếp tục nâng cao chất lượng dạy
học môn tin ở nhà trường, trong huyện và trong tỉnh.
3. KẾT LUẬN, KIẾN NGHỊ
3.1. Kết luận
Thông qua đề tài :“Sử dụng một số định lý và suy luận toán học để lập
trình giải một số bài tốn bồi dưỡng học sinh giỏi Tin học”.
19


Các em đã từng bước hình thành kỹ năng cơ bản trong lập trình và thực
hiện việc thiết kế bài toán một cách thành thạo hơn, làm tiền đề để học sinh lập
trình tốt các ngơn ngữ lập trình nâng cao khác.
Học sinh, giáo viên tạo được sự liên hệ giữa mơn tốn học và tin học qua
đó phát triển tư duy logic. Việc áp dụng đề tài vào bồi dưỡng học sinh giúp học
sinh có động lực và yêu thích hơn đối với mơn học lập trình. Qua đó giúp các
em có đam mê CNTT có định hướng tốt trong tương lai.
Qua các tiết dạy bồi dưỡng học sinh giỏi cũng giúp cho giáo viên nắm bắt
được những nhược điểm của học sinh hay mắc phải, những phần kiến thức học
sinh thường nhầm lẫn để củng cố, sửa đổi, bổ sung kịp thời cho các em giúp các
em hiểu rõ từng vấn đề đang vướng mắc trong quá trình thực hiện và học tập.
3.2. Kiến nghị

Để giúp học sinh u thích lập trình có nhiều điều kiện rất mong được sự
quan tâm của nhà trường cùng các ngành có liên quan giúp đỡ về cơ sở vật chất.
Nhà trường cần trang bị thêm một số tranh ảnh, tài liệu phục vụ cho môn
học để việc dạy và học ngày càng hiệu quả hơn.
Nhà trường cần tổ chức nhiều hơn các buổi trao đổi phương
pháp giảng dạy cho toàn thể cán bộ giáo viên.
Trên đây là một số kinh nghiệm, biện pháp mà tơi đã rút ra được trong q
trình dạy học, trao đổi với đồng nghiệp và đã áp dụng để bồi dưỡng học sinh khá
giỏi. Tuy nhiên còn nhiều yếu tố khách quan, chủ quan và vẫn còn nhiều mặt
hạn chế. Rất mong được sự đóng góp ý kiến của đồng nghiệp để tơi có thể hồn
chỉnh hơn đề tài này, có thêm hành trang phục vụ chuyên mơn của mình ngày
càng tốt hơn trong những năm học tới, góp phần nâng cao chất lượng dạy và
học.
Xin chân thành cảm ơn!
XÁC NHẬN CỦA THỦ TRƯỞNG Thanh Hóa, ngày 02 tháng 5 Năm 2021
ĐƠN VỊ
Tôi xin cam đoan đây là SKKN của
mình viết, khơng sao chép nội dung của
người khác.
NGƯỜI THỰC HIỆN ĐỀ TÀI

Hoàng Thị Yến

20


TÀI LIỆU THAM KHẢO
1. Sách giáo khoa tin học 11 - Hồ Sĩ Đàm, NXB Giáo dục.
2. Sách giáo viên Tin học 11 - Hồ Sĩ Đàm, NXB Giáo dục.
3. Tài liệu bồi dưỡng cán bộ quản lí và giáo viên về dạy học và kiểm tra, đánh

giá kết quả học tập của học sinh theo định hướng năng lực.
4. Sáng tạo trong thuật tốn và lập trình (Tập 1) – Nguyễn Xuân Huy, NXB
Giáo dục.
5. Giải một bài toán trên máy tính như thế nào (Tập 2) – Hồng Kiếm, NXB
Giáo dục.
6. Tài liệu tập huấn bồi dưỡng học sinh giỏi Sở giáo dục và đào tạo Thanh Hóa.
7. Tài liệu toán học và tin học trong nhà trường.
8. Một số tài liệu trên mạng Internet.

21



×