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

Tính nguyên tố của một số nguyên và sử dụng tính nguyên tố để giải quyết một số bài toán

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 (116.25 KB, 19 trang )

MỤC LỤC
TRANG
1. MỞ ĐẦU......................................................................................................2
1.1
1.2
1.3
1.4

Lý do chọn đề tài..............................................................................2
Mục đích nghiên cứu........................................................................2
Đối tượng nghiên cứu.......................................................................3
Phương pháp nghiên cứu..................................................................3

2. NỘI DUNG CỦA SÁNG KIẾN KINH NGHIỆM....................................3
2.1. Cơ sở lý luận của sáng kiến kinh nghiệm.................................................3
2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm...................3
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 đề...................................................................................4
2.3.1 Kiểm tra tính nguyên tố của một số nguyên dương..…………….....4
2.3.2 Phân tích một số thành tích các thừa số nguyên tố ………..……….6
2.3.3 Một số ví dụ…………………………………………………………7
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...................................17
3. KẾT LUẬN, KIẾN NGHỊ..........................................................................17
1. Kết luận...................................................................................................17
2. Kiến nghị.................................................................................................17

1


1. MỞ ĐẦU


1.1 Lý do chọn đề tài:

Công nghệ thông tin của nước ta hiện nay đang rất phát triển đưa ra nhiều
triển vọng cho tất cả các ngành trong việc tin học hoá xã hội. Công nghệ tông tin
có ý nghĩa rất quan trọng đối với rất nhiều lĩnh vực của đời sống, máy tính hiện
nay cũng không còn xa lạ đối với mọi người. Trong ngành giáo dục hiện nay
cũng là một ngành đang đưa công nghệ thông tin vào ứng dụng trong việc dạy
và học.
Thực hiện Nghị quyết số 26/NQ-CP ngày 15/4/2015 của Chính phủ ban
hành Chương trình hành động thực hiện Nghị quyết số 36-NQ/TW ngày
01/7/2014 của Bộ Chính trị Ban Chấp hành Trung ương Đảng Cộng sản Việt
Nam về đẩy mạnh ứng dụng, phát triển công nghệ thông tin (CNTT) đáp ứng
yêu cầu phát triển bền vững và hội nhập quốc tế; thực hiện Quyết định số
1755/QĐ-TTg ngày 22/9/2010 của Thủ tướng Chính phủ phê duyệt Đề án “Đưa
Việt Nam sớm trở thành nước mạnh về công nghệ thông tin và truyền thông”;
thực hiện Chỉ thị số 16/CT-TTg ngày 04/5/2017 của Thủ tướng Chính phủ về
việc tăng cường năng lực tiếp cận cuộc Cách mạng công nghiệp lần thứ 4, Bộ
Giáo dục và Đào tạo hướng dẫn cơ chế đặc thù đào tạo các ngành thuộc lĩnh vực
CNTT trình độ đại học giai đoạn 2017-2020 để đáp ứng nhu cầu của thị trường
lao động và hội nhập quốc tế.
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 yê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 toá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 toán.
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 toán sẽ được giả quyết nhanh nếu chúng ta biết tính chất của các số và
áp dụng hợp lý. Với những lý do trên tôi chọn đề tài về “Tính nguyên tố của
một số nguyên và sử dụng tính nguyên tố để giải quyết một số bài toán”
1.2 Mục đích nghiên cứu.
Đưa ra tính nguyên tố của một số nguyên, các thuật toán cơ bản liên quan
đến số nguyên tố. Đưa ra một số bài toán có sử dụng tính nguyên tố của một số
nguyên để giải quyết. Qua các bài toán này giúp học sinh yêu thích việc tư duy
logic và thấy được sự kỳ diệu của các con số.
2


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 1.
1.4 Phương pháp nghiên cứu
Phương pháp phân tích thuật toán, kiểm tra đánh giá năng lực học sinh,
phát triển tư duy logic. Một số tài liệu tham khảo và tìm kiếm thông tin trên
internet.
2. Nội dung sáng kiến
2.1. Cơ sở lí luận của sáng kiến kinh nghiệm.
- Nghị quyết số 44/NQ-CP, ngày 09/6/2014 Ban hành chương trình hành
động của chính phủ thực hiện nghị quyết số 29-NQ/TW ngày 04/11/2013 Hội
nghị lần thứ 8 Ban chấp hành Trung ương khóa XI về đổi mới căn bản, toàn diện
giáo dục và đào tạo, đáp ứng yêu cầu công nghiệp hóa trong điều kiện kinh tế thị
trường định hướng xã hội chủ nghĩa và hội nhập quốc tế xác định “Đổi mới hình
thức, phương pháp thi, kiểm tra và đánh giá kết quả giáo dục theo hướng đánh
giá năng lực của người học; kết hợp đánh giá cả quá trình với đánh giá cuối kỳ

học, cuối năm học theo mô hình của các nước có nền giáo dục phát triể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ảu 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”
+ 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 hoá, khái quát hoá…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ó.
2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm.
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.
Quá trình thực hiện đề tài tại trường THPT Nông Cống 1 tôi có một số
thuận lợi và khó khăn sau:
2.2.1. Thuận lợi:
* Nhà trường:
- Ban giám hiệu nhà trường luôn đạo điều kiện tốt nhất để giáo viên và
học sinh học tập.
- Nhà trường đã đầu tư một phòng thực hành tin với 24 máy tính xách tay
để cho các em đam mê lập trình và đội tuyển học sinh giỏi học tập.
- Được sự giúp đỡ, tạo điều kiện của tổ nhóm chuyên môn Toán – Tin.
3


* Học sinh:
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.

2.2.2. 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:
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:
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 yê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.
Tư tưởng học để thi đại học vẫn còn nặng trong học sinh nên thời gian
học dành cho sự đam mê môn tin học là không đủ.
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 đề.
Khái niệm số nguyên tố (prime number): Số nguyên tố là số nguyên dương
chỉ chia hết cho 1 và chính nó. Từ đó suy ra số một không phải là một số nguyên
tố (có rất nhiều em mới học lập trình nhầm số 1 là số nguyên tố). Một kết quả
khác cũng không kém quan trọng được rút ra đó là số 2 là số nguyên tố đầu tiên
(nhỏ nhất) và cũng là số số nguyên tố chẵn duy nhất.
2.3.1 Kiểm tra tính nguyên tố của số nguyên dương.
a. Kiểm tra tính nguyên tố của một số nguyên dương
Để kiểm tra một số nguyên dương N có là số nguyên tố hay không ta
kiểm tra xem N có tồn tại số nguyên k sao cho k là ước của N hay không? Nếu
tồn tại số nguyên k thì N không phải số nguyên tố ngược lại N là số nguyên tố.
Ta có thể tìm số k bằng cách lấy N chia cho các số từ 2 cho đến N-1. Nếu N
không phải số nguyên tố thì N có thể phân tách N= với vì nên . Do đó ta chỉ

cần kiểm tra k từ 2 đến mà không cần kiểm tra từ 2 đến N-1.
Ta có đoạn chương trình sau:
function ngto(n:longint):boolean;
var k :longint;
begin
if n=1 then exit(false);
4


for k:=2 to trunc(sqrt(n)) do
if (n mod k=0) then exit(false); exit(true);
end;
Hàm ngto(n) kiểm tra lần lượt các nguyên trong đoạn để giảm thiểu số cần
kiểm tra ta có nhận xét: Để kiểm tra số N là số nguyên tố hay không ta kiểm tra
xem có tồn tại số nguyên tố k () mà k là ước của N. Nếu tồn tại k thì N không
phải số nguyên tố ngược lại thì N là số nguyên tố. Để tránh việc phải kiểm tra k
có phải là số nguyên tố hay không ta có thể dựa vào một trong hai tính chất đơn
giản của số nguyên tố sau:
1. Trừ 2 các số nguyên tố đều lẻ.
2. Trừ số 2, 3 các số nguyên tố có dạng
Do vậy kiểm tra số N có phải là số nguyên tố hay không ta chỉ cần kiểm tra
xem N có chia hết cho số 2, số 3 và các số có dạng trong khoảng
Ta có đoạn chương trình sau:
function ngto(n:longint):boolean;
var k,sqrt_n:longint;
begin
if (n=2)or(n=3) then exit(true);
if (n=1) or (n mod 2=0) or (n mod 3=0) then exit(false);
sqrt_n:=trunc(sqrt(n));
k:=-1;

repeat
inc(k,6);
if (n mod k=0)or(n mod (k+2)=0) then break;
until k>sqrt_n;
exit(k>sqrt_n);
end;
b. Liệt kê các số nguyên tố trong đoạn
Ta có thể dùng hàm ngto(n) để kiểm tra lần lượt các số trong đoạn
Đoạn chương trình:
For i := 2 to N do
If ngto(i) then write(i);
Cách này là cách đơn giản nhưng chạy chậm nên ta cải tiến bằng cách sử dụng
sàng nguyên tố. Cách làm được thực hiện như sau:
Trước tiên xóa số 1 ra khỏi tập số nguyên tố. Số tiếp theo là số 2 là số
nguyên tố ta xóa tất cả các số là bội của 2. Số đầu tiên sau số 2 không bị xóa là
số 3 ta lại xóa tất cả các số là bội của 3…thuật toán tiếp tục đến khi gặp số
nguyên tố lớn hơn thì dừng lại. Các số chưa bị xóa là các số nguyên tố.
Ta có đoạn chương trình sau:
Const max=10000;
Procedure sangngto(N:longint);
5


Var i,j: longint
A: array[1..max] of byte;
Begin
fillchar(a,sizeof(a),0);
for i:=2 to trunc(sqrt(N)) do
if a[i]=0 then
begin

j:=i*i;
while j<=N do
begin
a[j]:=1;
j:=j+i;
end;
end;
for i:=2 to N do
if a[i]=0 then writeln(i);
end;
2.3.2 Phân tích một số thành tích các thừa số nguyên tố.
Theo đị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 .
Ta có bài toán: Cho một số nguyên dương N (2thành tích các thừa số nguyên tố.
Ví dụ:
Bai.inp
Bai.out
168
2^3
3^1
7^1
Thuật toá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.
Khi in kiểm tra: Nếu a[i] >0 thì in i^a[i].
Chương trình

Const fi='bai.inp';
fo='bai.out';
Var n, i,s,j : longint;
a:array[2..100000]of longint;
f1,f2:text;
BEGIN
6


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.
Khi N được phân tích thành thừa số nguyên tố như sau:
Ta có các kết luận sau:

1. Số các ước của N là:
2. Tổng các ước của một số
2.3.3 Một số ví dụ.
Dựa vào tính chất nguyên tố của một số nguyên dương và việc phân tích
một số thành tích của các thừa số nguyên tố tối có một sô bài tập sau:
Bài toán 1: Số gần nguyên tố
Chúng ta đều biết số nguyên tố là số nguyên dương mà chỉ có duy nhất 2
ước phân biệt. Mạnh luôn thích những cái đặc biệt và mới mẻ, và anh ra đưa ra 1
định nghĩa mới “Số gần nguyên tố” – là các số nguyên dương mà có đúng 3 ước
phân biệt.
Yêu cầu: Cho 1 mảng có n phần tử, hãy cho biết có bao nhiêu phần tử trong
mảng là số gần nguyên tố.
Dữ liệu vào: Từ file văn bản BAI1.INP
- Dòng đầu tiên: Số tự nhiên n (1 ≤ n ≤ 106) là số phần tử của mảng.
- Dòng tiếp theo: Gồm n số nguyên dương x[i] (1 ≤ x[i] ≤ 109).
Dữ liệu ra: Ghi ra file văn bản BAI1.OUT: Số phần tử trong mảng là số gần
nguyên tố.
7


Ví dụ:
BAI1.INP
3
456

BAI1.OUT
1

Thuật toán:
Đối với bài toán này nếu chúng ta duyệt lần lượt để tìm các ước của X thì

sẽ rất chậm và không đủ thời gian theo yêu cầu. Do vậy ta thấy rằng nếu X mà
được phân tích thành tích các thừa số nguyên tố thì tổng các ước là . Theo đề
bài thì số gần nguyên tố chỉ có đúng 3 ước do đó X chỉ có thể phân tích thành .
Vậy X là số gần nguyên tố thì X phải là một số chính phương.
Chương trình:
var f1,f2:text;
i,j,d,kq,n: longint;
function ngto(k:longint):boolean;
var j1:longint;
kt:boolean;
begin
j1:=2;kt:=false;
if k>1 then
begin
while (j1<=sqrt(k)) and (k mod j1<>0) do inc(j1);
if j1> sqrt(k) then kt:=true;
end;
ngto:=kt;
end;
begin
assign(f1,'bai1.inp'); reset(f1);
assign(f2,'bai1.out'); rewrite(f2);
readln(f1,n);kq:=0;
for j:=1 to n do
begin
read(f1,i);
d:=trunc(sqrt(i));
if (sqr(d)=i) and ngto(d) then inc(kq);
end;
write(f2,kq);

close(f1);
close(f2);
end.
Bài toán 2: Phân tích
8


Phân tích N! thành tích của các thừa số nguyên tố
Ví dụ: 15! = 211.36.53.72.11.13.
Thuật toán:
Ta sẽ tìm cách phân tích n! ra thừa số nguyên tố. Các ước số nguyên tố
của n! chỉ nằm trong phạm vi từ 2 đến n, do đó ta duyệt qua tất cả các số nguyên
tố trong phạm vi này. Với số nguyên tố p, số mũ của nó trong biểu diễn nguyên
tố của n! bằng công thức:
Trong đó [n/p] ký hiệu phần nguyên của n/p, nói cách khác trong ngôn
ngữ Pascal [n/p] bằng n div p. Công thức trên được giải thích như sau: [n/p] là
số lượng số từ 1 đến n chia hết cho p, [n/p 2] là số lượng số từ 1 đến n chia hết
cho p2,... mỗi số này đều đóng góp một thừa số nguyên tố p phân biệt cho n!.
Ví dụ, với N = 15, p = 2 và kí hiệu : là phép chia nguyên, ta tính được
15 : 2 = 7; 7 : 2 = 3; 3 : 2 = 1; 1 : 2 = 0. Do đó k = 7+3+1+0 = 11.
Với N=15, p = 5 ta tính được 15 : 5 = 3; 3 : 5 = 0. Do đó k = 3+0 = 3.
Với N=15, p = 7 ta tính được 15 : 7 = 2; 2 :7 = 0. Do đó k = 2+0 = 2.
Với N=15, p = 11 ta tính được 15 : 11 = 1; 1 : 5 = 0. Do đó k = 1+0 = 1.
Với N=15, p = 13 ta tính được 15 : 13 = 1; 1 : 5 = 0. Do đó k = 1+0 = 3.
Như vậy 15! = 211.53.72.11.13.
Chương trình:
function ngto(n: longint): boolean;
var i: longint;
begin
nguyento:=false;

for i:=2 to trunc(sqrt(n)) do
if n mod i = 0 then exit;
ngto:=true;
end;
var
n,i,j,a: longint;
begin
readln(n);
for i:=2 to n do if ngto(i) then
begin
a:=0;
j:=i;
while (j<=n) do
begin
a:=a+n div j;
j:=j*i;
end;
9


write(i,'^',a,'.');
end;
readln
end.
Bài toán 3: SỐ ƯỚC
Cho số nguyên dương N. Giai thừa của N, kí hiệu là N!, là tích của các số
tự nhiên từ 1 đến N. Gọi T là số lượng ước lớn hơn 1 của N!. Ví dụ với N = 4, ta
có 4! = 24. Như vậy 4! có 7 ước lớn hơn 1 là: 2, 3, 4, 6, 8, 12, 24.
Yêu cầu: Cho N, hãy xác định T.
Dữ liệu: Vào từ file văn bản SOUOC.INP trong đó chứa duy nhất số N (N <45,

trong đó 50% số test có N <20).
Kết quả: Ghi ra file văn bản SOUOC.OUT số T tìm được.
Ví dụ:
SOUOC.INP
SOUOC.OUT
4
7
Thuật toán:
Tương tự thuật toán bài trên.
Chương trình
function ngto(n: longint): boolean;
var i: longint;
begin
nguyento:=false;
for i:=2 to trunc(sqrt(n)) do
if n mod i = 0 then exit;
ngto:=true;
end;
var
n,i,j,a,d: longint;
f1,f2:text;
begin
assign(f1,'souoc.inp'); reset(f1);readln(f1,n);
assign(f2,'souoc.out'); rewrite(f2);
d:=1;
for i:=2 to n do if ngto(i) then
begin
a:=0;
j:=i;
while (j<=n) do

begin
a:=a+n div j;
j:=j*i;
end;
10


d:=d*(a+1);
end;
writeln(f2,d-1);
Close(f1);
Close(f2);
end.
Bài toán 4: Số chữ số 0 tận cùng.
Cho N giai thừa. Hãy cho biết N! có tận cùng bao nhiêu chữ số 0.
Thuật toán:
Tương tự thuật toán của bài 2. Tuy nhiên khi phân tích N! ra tích của các
thừa số nguyên tố ta chỉ quan tâm đến 5p mà thôi. Số chữ số 0 tận cùng của N!
chính là số mũ của số 5 trong phân tích.
Ví dụ: 15!= 211.53.72.11.13. thì số chữ số 0 tận cùng bằng 3.
Đoạn chương trình:
Function tc(N:longint): longint;
Var a, j: byte;
Begin
j:=5;
while (j<=n) do
begin
a:=a+n div j;
j:=j*5;
end;

tc:=a;
end;
Bài toán 5: Không chứa chính phương
Một số nguyên gọi là không chứa chính phương nếu nó không chia hết
cho bất ký số nguyên nào dạng x2 với x > 1.
Yêu cầu: Cho số nguyên n (1 ≤ n ≤ 10 13). Hãy tìm ước lớn nhất không chứa
chính phương của n. Lưu ý là 1 và n cũng là ước của n.
Dữ liệu vào: Vào từ file văn bản CP.INP gồm nhiều tests, mỗi test cho trên một
dòng chứa số nguyên n.
Dữ liệu ra: Đưa ra file văn bản CP.OUT, kết quả mỗi test đưa ra trên một dòng.
CP.INP
CP.OUT
9
3
20
10
Thuật toán:
11


- Nếu làm bài toán này theo đúng định nghĩa của bài đưa ra (hay làm theo
cách tự nhiên) thì chỉ qua được những test nhỏ.
- Để giải quyết triệt để bài toán tìm ước không chứa chính phương của N
ta phân tích N thành tích các thừa số nguyên tố, ước lớn nhất thỏa mãn yêu cầu
của bài là tích các thừa số nguyên tố.
Ví dụ N=2i3j5k thì ước lớn nhất không chứa chính phương là 2.3.5
Chương trình:
Const max=10000;
function ngto(n: longint): boolean;
var i: longint;

begin
nguyento:=false;
for i:=2 to trunc(sqrt(n)) do
if n mod i = 0 then exit;
ngto:=true;
end;
var
n,i,j,a: longint;
f1,f2: Text;
us:int64;
nt: array[1..max] of longint;
begin
Assign(f1,’CP.INP’); Reset(f1);
Assign(f2,’CP.OUT’); Rewrite(f2);
Readln(f1,n);
for i:=2 to sqrt(N) do if ngto(i) then
begin
a:=0;
j:=i;
while (j<=n) do
begin
a:=a+n div j;
j:=j*i;
end;
nt[i]:=a;
us:=us*i;
end;
Write(f2,us);
Close(f1);
Close(f2);

end.
Bài toán 6: Nguyên tố tương đương
12


Hai số tự nhiên được gọi là Nguyên tố tương đương nếu chúng có chung
các ước số nguyên tố. Ví dụ các số 75 và 15 là nguyên tố tương đương vì cùng
có các ước nguyên tố là 3 và 5. Cho trước hai số tự nhiên N, M.
Yêu cầu: Hãy viết chương trình kiểm tra xem các số này có là nguyên tố
tương đương với nhau hay không.
Dữ liệu vào: trong file văn bản BAI3.INP:
- gồm nhiều dòng, mỗi dòng ghi 2 số N và M cách nhau bởi dấu cách
(0<=N,M<=106)
Dữ liệu ra: Ghi vào File BAI2.OUT
- gồm nhiều dòng, mỗi dòng ghi số 1 nếu N và M là 2 số nguyên tố tương
đương, ngược lại ghi số 0.
BAI6.INP
75 15
8 27

BAI6.OUT
1
0

Chương Trình
var f1,f2:text;
i,d,x,y:int64;
function ucln(a,b:int64):int64;
var tg:int64;
begin

while b<>0 do
begin tg:=a mod b; a:=b;b:=tg;end;
ucln:=a;
end;
begin
assign(f1,'bai6.inp');reset(f1);
assign(F2,'bai6.out');rewrite(f2);
readln(f1,x,y);
d:=ucln(x,y);
i:=2;
while d>1 do
if d mod i<>0 then inc(i)
else
begin while d mod i=0 do d:=d div i;
while x mod i=0 do x:=x div i;
while y mod i=0 do y:=y div i;
end;
if x*y=1 then write(f2,'co') else write(f2,'khong');
close(f1);close(f2);
end.
13


Bài toán 7: Bài toán cổ
Tương truyền rằng, ngày xưa có một mưu sĩ thấy dân chúng quá nghèo
khổ nên ông ta đã đến thách đố đánh cờ cùng nhà vua nhằm lấy thóc trong kho
đem phân phát cho dân nghèo. Nhà vua ra điều kiện nếu đánh thua nhà vua thì
mưu sĩ sẽ bị chém đầu, ngược lại mưu sĩ sẽ được trọng thưởng bằng vật chất.
Nếu đánh thắng cờ với nhà vua, mưu sĩ chỉ xin một điều đó là trong mỗi ô cờ
gồm 8x8 ô thì lần lượt bỏ vào ô thứ 1: 1 hạt thóc, ô thứ 2: 1x2 hạt thóc, ô thứ 3:

1x2x3 hạt thóc,… cho đến ô cuối cùng. Nhà vua nghe qua rất khoái chí và đồng
ý ngay. Sau lần đấu cờ đó nhà vua đã mất rất nhiều kho lương thực cho dân
nghèo.
Do bản tính hiếu thắng của nhà vua, ông vẫn tiếp tục thách đấu với những
tay cao thủ cờ khác trong thiên hạ nhưng bây giờ rút kinh nghiệm ông chỉ xuất
trong kho ra bây giờ không phải là thóc nữa mà là vàng. Nguyên tắc để nhận
được vàng sau khi đánh thắng nhà vua như sau:
Mỗi ô trong bàn cờ có một số. Con số này được gán vào như sau:
- Ô số 1:
1
- Ô số 2:
1x2 = 2
- Ô số 3:
1x2x3 = 6


- Ô số 10
1x2x3x….x10 = 3 628 800


- Ô số 21
1x2x3x….x21 = 51 090 942 171 709 440 000


Số vàng nhận được chính là con số khác không đầu tiên kể từ hàng đơn vị lên
phía trước của ô mà đối thủ sẽ chọn. Ví dụ, chọn ô số 10 thì sẽ được 8 lạng
vàng, ô số 21 sẽ được 4 lạng vàng,…
Đối thủ chỉ được chọn mỗi lần một ô để nhận vàng. Không được phép chọn các
ô bé hơn 6.
Bàn cờ dùng thi đấu là bàn cờ 8x8, nhưng bàn cờ để chọn vàng là NxN (1 ≤ N

≤10 000), các ô được đánh số liên tục từ 1đến N.
Yêu cầu: Em hãy viết chương trình để giúp đấu thủ nọ nhận được vàng
theo các yêu cầu nói trên.
Dữ liệu vào: có nhiều dòng liên tiếp nhau, trên mỗi dòng chứa một số
nguyên không âm, đó là thứ tự ô mà đấu thủ đó chọn.
Dữ liệu ra: 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 có nội dung: chữ số đầu tiên là ô số mà đấu thủ nọ chọn, tiếp theo là
một mũi tên “->” và cuối cùng là chữ số khác không cuối cùng của ô số đó (theo
các nguyên tắc trên).
Ví dụ:
BAI7.INP
BAI7.OUT
26
26 -> 4
125
125 -> 8
3125
3125 -> 2
14


9999

9999 -> 8

Thuật toán:
Thuật giải của bạn Việt Hưng (Hà Tây, 2002) cho phép mở rộng giới hạn
của n đến hàng chục vạn và nếu bạn muốn, có thể tiếp tục mở rộng đến hàng
triệu.
Ý tưởng chính của Việt Hưng nằm ở công thức: 2 x 5 = 10 (hai lần năm là

mười). Thật vậy, ta biết:
n! = 1.2.3...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ố nguyên 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.
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 luôn 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 hoà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.
Theo thí dụ trên ta có m mod 4 = 8 mod 4 = 0, do đó chữ số cuối của 2m
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 toá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;
15


Chương trình:
function find(n: longint): longint;
var m: longint;
{m – hieu so cac thua so 2 và thua so 5}
i,k,c: longint;
begin {k – ket qua trung gian}
k := 1; m := 0;
find := k;
if (n <= 1) then exit;
d := 0;
for i := 2 to n do
begin
c := i;
while c mod 2 = 0 do
begin
m := m+1; c := c div 2;
end;
while c mod 5 = 0 do
begin
m := m-1; c := c div 5;
end;

k := (k*(c mod 10)) mod 10;
end;
case (m mod 4) of
0: c := 6;
1: c := 2;
2: c := 4;
3: c := 8;
end;
find := (k*c) mod 10;
end;
Var f1,f2:text;
N:longint;
BEGIN
Assign(f1,’bai7.inp’); reset(f1);
Assign(f2,’bai7.out’); rewrite(f2);
Readln(f1,n);
Write(f2,find(n));
Close(f1);
Close(f2);
END.

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.
Trong quá trình dạy học nhất là ôn luyện đội tuyển HSG tôi đã á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 I đã thu được kết quả rất khả quan.
Việc áp dụng đề tài này vào dạy đội tuyển học sinh giỏi giúp các em phát

triển tư duy, có sự liên hệ logic giữa môn toán học và tin học.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 2012-2013: Đạt 3 giải (1 ba, 2 khuyến khích)
Năm 2013-2014: Đạt 2 giải (1 nhì, 1 khuyến khích)
Năm 2015-2016: Đạt 2 giải (1 nhì, 1 ba)
Năm 2016-2017: Đạt 2 giải
3. KẾT LUẬN, KIẾN NGHỊ
1. Kết luận
Thông qua đề tài: “Tính nguyên tố của một số nguyên và sử dụng tính
nguyên tố để giải quyết một số bài toán”.
Học sinh, giáo viên tạo được sự liên hệ giữa môn số 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.
2. Kiến nghị
Để tạo được nguồn lao động trẻ có chất lượng cao trong ngành công nghệ
thông tin thì ngay trong khi học THPT việc đầu tư cơ sở vật chất và áp dụng
công nghệ vào giảng dạy là rất quan trọng. Do vậy tôi kiến nghị các cấp, các
ngành có cơ chế tạo điều kiện xây dựng cơ sở vật chất và thời lượng chương
trình để phát triển môn lập trình trong trường THPT.
Trên đây là một số kinh nghiệm của tôi khi dạy chương trình tin học 11 và
bồi dưỡng học sinh giỏi. Đề tài của tôi vẫn đang còn nhiều vấn đề cần hoàn thiện
rất mong sự góp ý của đồng nghiệp và các thầy cô giáo có kinh nghiệm để đề tài
thực sự có hiệu quả trong giảng dạy.

17


Xin chân thành cảm ơn.
Nông Cống, Ngày 05/05/2019

Xác nhận của thủ trưởng đơn vị

Tôi xin cam đoan đây là SKKN của mình
viết, không sao chép nội dung người khác.
NGƯỜI THỰC HIỆN ĐỀ TÀI

Vũ Anh Minh

18


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. Cơ sở lý thuyết và kỹ thuật giải toán olympic – Bùi Trọng Kiên, NXB Đại
học Quốc gia Hà Nội.
3. Sáng tạo trong thuật toán và lập trình (Tập 1) – Nguyễn Xuân Huy, NXB
Giáo dục
4. 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
5. Tài liệu chuyên quyển 1 – Hồ Sĩ Đàm (chủ biên), Đỗ Đức Đông, Lê Minh
Hoàng, Nguyễn Thanh Hùng – NXB Giáo dục Việt Nam
6. Một số tài liệu trên mạng Internet.

19



×