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

SKKN kĩ năng lập trình giải các bài toán về số nguyên tố

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 (228.95 KB, 25 trang )

SỞ GIÁO DỤC ĐÀO TẠO THANH HÓA

TRƯỜNG THPT HOẰNG HÓA 2

SÁNG KIẾN KINH NGHIỆM

TÊN ĐỀ TÀI
NÂNG CAO KĨ NĂNG LẬP TRÌNH GIẢI CÁC BÀI TỐN
VỀ SỐ NGUN TỐ CHO HỌC SINH LỚP 11

Người thực hiện :

Nguyễn Thị Hòa

Chức vụ:

Giáo viên

SKKN thuộc lĩnh vực : Tin học

THANH HÓA, NĂM 2021


MỤC LỤC
Trang
1. MỞ ĐẦU

1.1.




do

chọn

đề

tài

1
1.2.

Mục

đích

nghiên

cứu

Đối

tượng

nghiên

cứu

1
1.3.
1

1.4.

Phương

pháp

nghiên

cứu

2
2. NỘI DUNG SÁNG KIẾN KINH NGHIỆM

2.1.



sở



luận

của

sáng

kiến

kinh


nghiệm

2
2.1.1. Khái niệm số nguyên tố ........................................................................................ 2
2.1.2. Những lưu ý về số nguyên tố …………………................................................. 2
2.1.3. Các phương pháp kiểm tra số nguyên tố ……………………...……......... 3
2.1.3.1 Phương pháp kiểm tra số nguyên tố theo định nghĩa
..................................................................................................................................

3
2.1.3.2 Phương pháp sử dụng thuật toán Sàng nguyên tố
của

Eratosthenes

.............................................................................................................................

3
2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm ….……... 4


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


đề

5
2.3.1. Hướng dẫn học sinh một số bài tập sử dụng hàm kiểm tra
số

nguyên

tố

theo

định

nghĩa

........................................................................................................................................

4
2.3.2. Hướng dẫn học sinh một số bài tập sử dụng thuật toán
Sàng nguyên tố của Eratosthenes

...................................................................................................................................

10
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



18
3. KẾT LUẬN, KIẾN NGHỊ

3.1.

Kết

luận

Kiến

nghị

19
3.2.
19

nhà


trường

.


1. MỞ ĐẦU
1.1. Lí do chọn đề tài
Chương trình tin học lớp 11 là nội dung tương đối khó với đa số học
sinh. Các em được làm quen với các thuật ngữ mới trong ngơn ngữ lập trình,
các loại cấu trúc dữ liệu, ứng dụng ngơn ngữ lập trình để giải quyết các bài
toán thực tế trong cuộc sống. Trong đó, có rất nhiều bài tốn liên quan tới các
bài tập về tư duy toán học như : số nguyên tố, số chính phương, số hồn hảo,
số đẹp, số phong phú…. đem lại hứng thú học tập cho học sinh, đặc biệt là với
đối tượng học sinh khá, giỏi.
Từ rất lâu, các bài toán số học đã làm say mê nhiều người u tốn học
và cả những người lập trình viên. Một trong những bài tốn số học đó là bài
toán về số nguyên tố. Đây là một bài toán trung tâm của số học, nó đã chiếm
mất khoảng thời gian hàng nghìn năm của các nhà tốn học trong các thời đại.
Những bài tốn về số ngun tố ln có mặt trong các bài thi, các đề thi chọn
học sinh giỏi ở tất cả các cấp học và ở hầu hết các nước trên thế giới. Còn
trong thực tế ngồi xã hội thì số ngun tố được áp dụng rộng rãi trong
hệ mật mã công nghệ thông tin, làm tăng tính bảo mật trong quân sự,
ngoại giao... Khi lập trình giải quyết những bài tốn về số ngun tố địi hỏi
học sinh cần có kiến thức cơ bản về tốn học, đồng thời phải có khả năng tư
duy phân tích yêu cầu và kĩ năng sử dụng thành thạo ngơn ngữ lập trình.
Trong q trình giảng dạy nhiều năm tơi nhận thấy một số bài tốn lập
trình liên quan tới số nguyên tố có rất nhiều ứng dụng trong thực tế, đồng thời
rèn luyện kĩ năng lập trình và khả năng tư duy cho học sinh. Do đó, qua q
trình đúc rút kinh nghiệm, tơi mạnh dạn đề xuất sáng kiến kinh nghiệm :“Nâng
cao kĩ năng lập trình giải các bài toán về số nguyên tố cho học sinh lớp 11”.

1.2. Mục đích nghiên cứu
- Nghiên cứu các các bài toán, các phương pháp kiểm tra số nguyên tố.
- Ứng dụng lập trình pascal vào những bài tốn cụ thể để giải quyết vấn
đề.
- Giúp học sinh biết cách viết một chương trình có cấu trúc để giải một bài
tốn trên máy tính.
1.3. Đối tượng nghiên cứu
- Các khái niệm cơ bản, tính chất của số nguyên tố.
- Các phương pháp kiểm tra số nguyên tố
- Một số bài tốn cụ thể trong thực tế có áp dụng số nguyên tố.
- Tìm hiểu khả năng vận dụng của từng đối tượng học sinh mỗi lớp dạy về
lập trình các bài tốn để có phương pháp giảng dạy phù hợp.
1


1.4. Phương pháp nghiên cứu
- Tìm hiểu các khái niệm, định nghĩa, tính chất về số ngun tố trong tốn học.
- Tìm hiểu một số thuật tốn kiểm tra số nguyên tố.
- Chọn lọc một số bài tập điển hình liên quan tới số nguyên tố để minh
họa, hướng dẫn học sinh luyện tập và thực hành.
- Thu thập thông tin kết quả học tập về khả năng lập trình một số bài toán
liên quan tới số nguyên tố ở một số lớp giảng dạy để có sự so sánh, đối chiếu
thực nghiệm kết quả thực hiện của đề tài.
- Tham khảo một số tư liệu trên internet và tài liệu của đồng nghiệp.
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.
2.1.1. Khái niệm số nguyên tố:
Một số tự nhiên lớn hơn 1 và khơng có ước tự nhiên nào khác ngồi 1 và
chính nó được gọi là số ngun tố. Đơn giản có thể hiểu rằng: Với một số tự
nhiên lớn hơn 1, nếu như ngoài chữ số 1 và bản thân nó ra thì nó khơng chia

hết cho số nào khác nữa.
Một số tự nhiên lớn hơn 1 và có nhiều hơn hai ước số (1 và chính nó) gọi là
hợp số.
Ước số tự nhiên khác 1 và chính nó của một số tự nhiên gọi là ước thực sự.
Từ đó ta có định nghĩa khác về số nguyên tố: số tự nhiên lớn hơn 1 được gọi là
số nguyên tố nếu nó khơng có ước thực sự.
Ví dụ 2; 3; 5; 7; 11; 13;... là những số nguyên tố.
4; 6; 8; 9; 10 ; 12;... là những hợp số.
2.1.2. Những lưu ý về số nguyên tố:
- Số 0 và số 1 không phải số nguyên tố cũng không phải là hợp số.
- Số 2 vừa là số nguyên tố nhỏ nhất vừa là số nguyên tố chẵn duy nhất.
- Không thể giới hạn số lượng số nguyên tố, hay tập hợp các số nguyên
tố là vô hạn.
- Hai số nguyên tố nhân với nhau thì tích của chúng khơng thể là một số
chính phương.
- Ước tự nhiên nhỏ nhất (khác số 1) của một số tự nhiên là một số nguyên tố.
- Ước bé nhất (là số dương khác 1) của một hợp số a nào đó là một số
nguyên tố không vượt quá căn bậc hai của số a.
- Một số số nguyên tố đặc biệt :
+ Số nguyên tố nhỏ nhất có 1 chữ số là số 2;
+ Số nguyên tố nhỏ nhất có 2 chữ số là số 11;
+ Số nguyên tố nhỏ nhất có 3 chữ số là số 101;
+ Số nguyên tố lớn nhất có 2 chữ số là số 97;
+ Số nguyên tố lớn nhất có 3 chữ số là 997.
2


2.1.3. Các phương pháp kiểm tra số nguyên tố:
2.1.3.1 Phương pháp kiểm tra số nguyên tố theo định nghĩa:
Ý tưởng của thuật toán: Thuật toán kiểm tra số nguyên dương x có phải

là nguyên tố là sẽ kiểm tra nếu x = 1 thì khơng phải là số ngun tố, nếu x>1
thì kiểm tra tất cả các số nguyên từ 2 đến phần nguyên căn bậc hai của x (trong
Pascal tức là hàm trunc(sqrt(x)) ), nếu x không chia hết cho số nào trong
khoảng đó thì x là số ngun tố. Ngược lại nếu x chia hết cho bất kì một số nào
trong khoảng đó thì x khơng phải là số nguyên tố. Với phương pháp này ta
dùng hàm để kiểm tra như sau :
function

ngto(x: longint): boolean;

var
i: longint;
begin
if x=1 then begin ngto := false; break; end;
if x>1 then
begin
ngto:= true;
for i:= 2 to trunc(sqrt(x)) do
if x mod i = 0 then
begin
ngto:= false;
break;
end;
end;
end;

2.1.3.2 Phương pháp sử dụng thuật toán Sàng nguyên tố của Eratosthenes:
Ý tưởng của thuật toán: Sàng nguyên tố là thuật tốn do Eratosthenes
đưa ra để tìm các số ngun tố. Thuật tốn thích hợp cho bài tốn tìm tất cả các
số nguyên tố trong khoảng [a, b] mà đặc biệt hiệu quả khi khoảng cách giữa a,

b là rất lớn.
Thuật toán thực hiện bằng cách lặp lại đánh dấu là tổng hợp (nghĩa là
không phải là số nguyên tố) bội số của mỗi số nguyên tố, bắt đầu bằng số
nguyên tố đầu tiên, 2. Các bội số của một số nguyên tố đã cho được tạo thành
một chuỗi các số bắt đầu từ số nguyên tố đó, với chênh lệch khơng đổi giữa
chúng bằng số ngun tố đó. Đây là điểm khác biệt chính của sàng với việc sử
dụng phân chia thử nghiệm để kiểm tra tuần tự từng số ứng cử viên để phân
chia theo từng nguyên tố.
Nguyên lí hoạt động của sàng là vào mỗi lần duyệt, ta chọn một số
nguyên tố và loại ra khỏi sàng tất cả các bội của số nguyên tố đó mà lớn hơn số
đó. Sau khi duyệt xong, các số cịn lại trong sàng đều là số nguyên tố. Để tìm
các số không phải số nguyên tố chỉ cần dựa vào các số nguyên tố ban đầu, số 2
là số nguyên tố thì các số là bội của 2 chắc chắn không phải là số nguyên tố, số
3


3 là số nguyên tố thì tất cả các số là bội của 3 đều bị loại bỏ, cứ như vậy những
số được giữ lại là các số nguyên tố.
Ban đầu, nhà tốn học Eratosthenes sau khi tìm ra thuật toán, đã lấy lá cọ
và ghi tất cả các số từ 2 cho đến 100. Ông đã chọc thủng các hợp số và giữ
nguyên các số nguyên tố. Bảng số ngun tố cịn lại trơng rất giống một cái
sàng. Do đó, nó có tên là sàng Eratosthenes.
Để tìm các số nguyên tố nhỏ hơn hoặc bằng số tự nhiên N bằng sàng
Eratosthenes, ta làm như sau:


Bước 1: Tạo 1 danh sách các số tự nhiên liên tiếp từ 2 đến n: (2, 3, 4,...,
n).




Bước 2: Giả sử tất cả các số trong danh sách đều là số nguyên tố. Trong
đó, p = 2 là số nguyên tố đầu tiên.



Bước 3: Tất cả các bội số của p: 2p, 3p, 4p,... sẽ bị đánh dấu vì khơng
phải là số ngun tố.



Bước 4: Tìm các số cịn lại trong danh sách mà chưa bị đánh dấu và phải
lớn hơn p và nhỏ hơn hoặc bằng căn bậc 2 của n . Nếu khơng cịn số nào,
dừng tìm kiếm. Ngược lại, gán cho p giá trị bằng số nguyên tố tiếp theo và
quay lại bước 3.

Khi giải thuật kết thúc, tất các số chưa bị đánh dấu trong danh sách là các
số nguyên tố cần tìm.
Với phương pháp này ta sử dụng mảng kt có các phần tử là dữ liệu kiểu
Boolean sau đó dùng thủ tục để sàng lọc trên mảng một chiều như sau :
procedure
sangnt;
begin
fillchar(kt, sizeof(kt), true);
kt[1]:= false;
for i:=2 to trunc(sqrt(maxn)) do
if kt[i] then
for j:= 2 to maxn div i do
kt[i*j]:= false;
end;


2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm
Trên cơ sở nhiều năm được phân công giảng dạy khối lớp 11, trường
THPT Hoằng Hóa 2, tơi đã lưu lại kết quả học tập và sự tiến bộ của học sinh ở
mỗi năm học ở một số lớp để có sự đối chiếu và rút kinh nghiệm.
4


Bảng số liệu kết quả đạt được khi sử dụng kiến thức liên quan tới lập trình
giải các bài tập về số nguyên tố của học sinh lớp 11 năm học 2019 - 2020 khi
chưa thực hiện đề tài:
STT
1
2
3

Lớp
11A2
11A3
11A10

Sĩ số
44
42
48

Đạt yêu cầu Không đạt yêu cầu
56%
44%
68.5%

31.5%
78%
22%

* Ưu điểm:
+ Đa số học sinh đã hiểu khái niệm cơ bản về số nguyên tố.
+ Một số em học sinh đã biết cách xây dựng hàm để kiểm tra số nguyên tố .
* Nhược điểm:
+ Một số học sinh còn chưa biết cách sử dụng phương pháp kiểm tra số
nguyên tố trong Pascal phù hợp với từng bài toán cụ thể.
+ Các bài tập lập trình liên quan tới số nguyên tố phần lớn học sinh yếu,
kém khơng làm được, chỉ số ít học sinh khá giỏi hứng thú làm bài.
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 đề:
2.3.1 Hướng dẫn học sinh một số bài tập sử dụng hàm kiểm tra số nguyên
tố theo định nghĩa:
Bài tập 1: Kiểm tra nguyên tố
Kiểm tra số nguyên dương N có phải là số nguyên tố (2≤n≤106)
Dữ liệu vào: Vào từ file văn bản BAI1.INP gồm một số duy nhất N.
Dữ liệu ra: Đưa ra file văn bản BAI1.OUT kết quả là ‘YES’ nếu N là số nguyên
tố, ngược lại ghi ‘NO’.
BAI1.INP
37
1005

BAI1.OUT
YES
NO

Hướng dẫn: Bài toán này đơn giản chỉ cần kiểm tra cho một số nguyên N nên

ta chỉ cần đọc dữ liệu từ tệp và dùng hàm kiểm tra số nguyên tố.
Code tham khảo:
const fi='bai1.inp';
fo='bai1.out';
var
n,i,j: longint;
function

ngto(x: longint): boolean;
5


var
i: longint;
begin
if x=1 then begin ngto := false; break; end;
if x>1 then
begin
ngto:= true;
for i:= 2 to trunc(sqrt(x)) do
if x mod i = 0 then
begin
ngto:= false;
break;
end;
end;
end;
BEGIN
assign(input, fi); reset(input);
assign(output, fo); rewrite(output);

readln(n);
if ngto(i) then write(‘YES’)
else write(‘NO’);
close(input); close(output);
END.

Bài tập 2 : Tổng nguyên tố
( Bài 1 – Đề thi học sinh giỏi cấp tỉnh Thanh Hóa năm học: 2016 - 2017)
Cho số nguyên dương N (N ≤ 105).
Yêu cầu: Tìm số các cặp số nguyên dương x, y sao cho:
- x, y là 2 số nguyên tố.
- x+y=N
- x≤y
Dữ liệu vào: Vào từ file văn bản BAI1.INP gồm một số duy nhất N.
Kết quả: Đưa ra file văn bản BAI1.OUT một số là số các cặp số tìm được.
Ví dụ:
BAI1.INP
BAI1.OUT
10

2

Hướng dẫn: Bài tốn này ta cũng có thể dùng hàm kiểm tra nguyên tố để kiểm
tra số x và y. Tuy nhiên vì x + y = N nên ta kiểm tra số x và N-x, vì các cặp số
là đối xứng nhau nên ta chỉ cần kiểm tra x từ phạm vi 2 đến N div 2.
Code tham khảo:

const fi='bai1.inp';
fo='bai1.out';
var

n,i,j: longint;
function

res: longint;

ngto(x: longint): boolean;

var
i: longint;
begin
6


if x=1 then begin ngto := false; break; end;
if x>1 then
begin
ngto:= true;
for i:= 2 to trunc(sqrt(x)) do
if x mod i = 0 then
begin
ngto:= false;
break;
end;
end;
end;
BEGIN
assign(input, fi); reset(input);
assign(output, fo); rewrite(output);
readln(n);
res:=0;

for i:=2 to n div 2 do
if ngto(i) and ngto(n-i) then inc(res);
writeln(res);
close(input); close(output);
END.

Bài tập 3: Số siêu nguyên tố
Tại Vương quốc Byte xinh đẹp, mỗi người ln chọn cho mình một con
số, theo họ số nguyên tố là số mang lại sự may mắn và ai tìm được một số siêu
ngun tố cịn may mắn hơn nữa. Số siêu nguyên tố là một số nguyên tố mà
khi bỏ 1 số tùy ý các chữ số bên phải của nó thì phần cịn lại vẫn là 1 số nguyên
tố. Số 2333 là 1 số siêu nguyên tố vì 2333 là một số nguyên tố và 233, 23, 2
cũng là các số nguyên tố.
Dữ liệu vào: SNT.INP Chứa một số nguyên dương n (n ≤ 109)
Dữ liệu ra: SNT.OUT Nếu N là siêu nguyên tố ghi giá trị 1, ngược lại ghi giá
trị 0
Ví dụ:

Hướng dẫn: Sử dụng hàm nguyên tố để kiểm tra một số có phải là số nguyên
tố. Sau đó để kiểm tra số N có phải là một số siêu nguyên tố thì ta thực hiện
quá trình lặp, mỗi lần ta chia nguyên số đó cho 10, nếu số đó vẫn là số nguyên
tố thì ta thực hiện tiếp, đến khi N = 0, ngược lại trong quá trình lặp số N khơng
phải là số ngun tố thì q trình lặp sẽ dừng, khi đó N ≠ 0.
Code tham khảo:
7


const fi='SNT.INP';
fo='SNT.OUT';
var

N,i,j: longint;
function

ngto(x: longint): boolean;

var
i: longint;
begin
if x=1 then begin ngto := false; break; end;
if x>1 then
begin
ngto:= true;
for i:= 2 to trunc(sqrt(x)) do
if x mod i = 0 then
begin
ngto:= false;
break;
end;
end;
end;
function sieunt(n:integer):boolean;
var nt:boolean;
begin
nt:=true;
while snt(n) do n:=n div 10;
if n<>0 then nt:=false;
sieunt:=nt;
end;
BEGIN
assign(input, fi); reset(input);

assign(output, fo); rewrite(output);
readln(f1,N);
if sieunt(N)=true then write(‘1’)
else write(‘0’);
close(input); close(output);
END.

Bài tập 4: Tìm số
( Câu 1 - Đề thi học sinh giỏi Tỉnh Quảng Bình năm học 2012 – 2013)
Cho số nguyên dương X, khi đảo ngược trật tự các chữ số của X ta sẽ thu
được một số nguyên dương Y, Y được gọi là số đảo ngược của X.
Ví dụ: X = 613 thì Y = 316 là số đảo ngược của X.
Số nguyên dương Y được gọi là số nguyên tố nếu nó chỉ có hai ước số là 1
và chính nó, số 1 khơng phải là số ngun tố.
Cho hai số nguyên dương P và Q (1 ≤ P ≤ Q ≤ 2109; Q - P ≤ 105).
Yêu cầu: Hãy tìm tất cả các số nguyên dương X nằm thỏa mãn P ≤ X ≤ Q và số
đảo ngược của số X là số nguyên tố.
Dữ liệu vào: Cho trong file văn bản TIMSO.INP có cấu trúc như sau:
8


- Dòng 1: Ghi hai số nguyên dương P Q, hai số được ghi cách nhau ít
nhất một dấu cách.
Dữ liệu ra: Ghi ra file văn bản TIMSO.OUT trên nhiều dịng, mỗi dịng ghi
một số ngun X tìm được.
Ví dụ:
TIMSO.INP
TIMSO.OUT
10 19
11

13
14
16
17
Hướng dẫn: Sử dụng hàm nguyên tố để kiểm tra một số có phải là số nguyên
tố, để tạo ra số đảo ngược của số X sử dụng hàm MOD và DIV cho 10.
Code tham khảo:
Const fi='TIMSO.INP'; fo='TIMSO.OUT' ;
Var P,Q : longint;
function

ngto(x: longint): boolean;

var
i: longint;
begin
if x=1 then begin ngto := false; break; end;
if x>1 then
begin
ngto:= true;
for i:= 2 to trunc(sqrt(x)) do
if x mod i = 0 then
begin
ngto:= false;
break;
end;
end;
end;
Function Daoso(X:longint):longint;
Var S:longint;

Begin
S:=0;
While X>0 do
Begin
S:=S*10+ (X mod 10); X:=X div 10;
End;
Daoso:=S;
End;
BEGIN
assign(input, fi); reset(input);
9


assign(output, fo); rewrite(output);
Read(f,P,Q);
for j:=P to Q do
if ngto(Daoso(j)) then Writeln(f,j);
close(input); close(output);
END.

2.3.2. Hướng dẫn học sinh một số bài tập sử dụng thuật toán Sàng nguyên
tố của Eratosthenes:
Bài tập 5: Dãy số
Cho dãy số gồm có N số nguyên a1, a2, a3, …aN và một số nguyên dương
K. Yêu cầu: Hãy cho biết số lượng các phần tử có giá trị nhỏ hơn K là số nguyên
tố của dãy số trên.
Dữ liệu : Vào từ file Dayso.inp gồm: Dòng đầu tiên là hai số N và K. Dòng tiếp
theo lần lượt là N số nguyên của dãy số.
Kết quả: Ghi ra file Dayso.out gồm duy nhất số m là số lượng các phần tử của
dãy số thoả mãn yêu cầu đề bài.Giới hạn: 0 < n < 50000; 0 < k, (|ai| <= 106)

Ví dụ:

Dayso.inp
10 15
3 6 20 13 25 45 7 11 50 100

Dayso.out
4

Hướng dẫn: Với bài toán này, việc kiểm tra tính nguyên tố cho một dãy nhiều số
(0 < n < 50000), với số lượng lớn các phần tử cần kiểm tra nên nếu sử dụng hàm
kiểm tra nguyên tố cho từng số thì thời gian chạy chương trình sẽ lâu. Do đó ta
nên dùng thuật tốn sàng nguyên tố để giảm thời gian chạy chương trình.
Code tham khảo:
Const maxn=round(1e6);
Maxday=50000;
Var kt:array[1..maxn] of Boolean;
A:arr[1..maxday] of longint;
I, j , k, dem:longint;
Procedure sangnt;
Begin
Fillchar(kt,sizeof(kt), true);
Kt[1]:=false;
For i:=2 to trunc(sqrt(maxn) do
If kt[i] then
For j:=2 to maxn div i do kt[i*j]:=false;
End;
Begin
assign(f1,'Dayso.inp');reset(f1);
assign(f2,‘Dayso.out’);rewrite(f2);

readln(f1,n,k);
10


Dem:=0;
sangnt;
for i:= 1 to n do
begin
read(f1,a[i]);
If (kt[a[i]]=true) and (a[i]end;
write(f2,dem);
close(f1);close(f2);
end.

Bài tập 6 : Tìm số nguyên tố
( Bài 2 – Đề thi học sinh giỏi cấp tỉnh Thanh Hóa năm học: 2017-2018)
Tìm tất cả các số P lớn hơn M và nhỏ hơn N thỏa mãn các điều kiện sau:
+ Là số nguyên tố.
+ Tổng các chữ số của P phải chia hết cho k.
Dữ liệu vào: Từ tệp văn bản BAI2.INP: Gồm 3 số M, N, k (1 ≤ M,N,k ≤ 10 6)
(các số cách nhau ít nhất một dấu cách).
Dữ liệu ra: Ghi ra tệp văn bản BAI2.OUT gồm duy nhất 1 số là số lượng các
số thỏa mãn yêu cầu đầu bài.
Ví dụ:
BAI2.INP
BAI2.OUT
BAI2.INP
BAI2.OUT
2 35 2

6
1 10 11
0
Hướng dẫn: Trong bài này,cần tìm tất cả các số trong khoảng từ M+1 đến N-1
nên ta cũng phải sử dụng đến thuật toán sàng nguyên tố để kiểm tra nguyên tố cho
nhiều số. Việc tính tổng các chữ số của P ta sử dụng các hàm MOD và DIV cho
10.
Code tham khảo:
const fi='bai2.inp';
fo='bai2.out';
maxn=round(1e6);
var
m,n,k: longint;
res, i, j: longint;
kt: array[1.. maxn+1] of boolean;

Procedure sangnt;
Begin
Fillchar(kt,sizeof(kt), true);
Kt[1]:=false;
For i:=2 to trunc(sqrt(maxn) do
If kt[i] then
For j:=2 to maxn div i do kt[i*j]:=false;
End;
function tong(p: longint): longint;
begin
11


tong:=0;

while p>0 do
begin
tong:= tong + (p mod 10);
p:= p div 10;
end;
end;
BEGIN
assign(input, fi); reset(input);
assign(output, fo); rewrite(output);
readln(m,n,k);
sangnt;
res:=0;
for i:= m+1 to n-1 do
if (kt[i]=true) and (tong(i) mod k =0) then inc(res);
writeln(res);
close(input); close(output);
END.

Bài tập 7 Mật khẩu
( Bài 2 Đề thi học sinh giỏi Tỉnh Thanh Hóa năm học 2014 – 2015)
Là một người u thích số học cơ ta thường chọn mật khẩu P là một số
nguyên tố và đem giấu vào trong một xâu ký tự T sao cho P chính là số nguyên
tố có giá trị lớn nhất trong số các số nguyên tố được tạo từ các xâu con của T
(xâu con của một xâu ký tự T là một chuỗi liên tiếp các ký tự trong T).
Ví dụ: xâu T= “Test1234#password5426” chứa mật khẩu là 23 vì T chứa
các xâu con ứng với các số nguyên tố 2, 3, 23 và 5.
Yêu cầu: cho một xâu ký tự T có chiều dài khơng q 500 ký tự. Tìm mật khẩu
P đã dấu trong xâu T biết P có giá trị nhỏ hơn 10 5. Dữ liệu cho đảm bảo ln có
P.
Dữ liệu vào: vào từ file văn bản BAI2.INP gồm 1 dòng duy nhất là xâu T.

Kết quả: ghi ra file văn bản BAI2.OUT là số P tìm được.
Ví dụ:
BAI2.INP
BAI2.OUT
Test1234#password5426 23
Hướng dẫn: Với bài này học sinh chú ý đọc kỹ đề bài để lấy hết dữ kiện của
bài tốn. Xâu T có chiều dài khơng q 500 ký tự thì chúng ta có thể khai báo
một mảng có tối đa 500 phần tử kiểu char hoặc khai báo kiểu xâu ansistring
hoặc kiểu string (có thêm {$H+} lên đầu chương trình)
Vì bài tốn ln có đáp số và kết quả của bài tốn ln < 105 nên ta có
thuật toán đơn giản như sau : cho i chạy từ 105 - 1 về 2, nếu i là số nguyên tố và
12


số i có trong xâu thì in ra i và kết thúc ln chương trình. Để giảm độ phức tạp
của thuật tốn, chúng ta có thể sử dụng thuật tốn sàng nguyên tố để kiểm tra
tính nguyên tố của một số.
Code tham khảo:
const

fi='bai2.inp';
fo='bai2.out';
maxn= round(1e5);
var st: ansistring;
st1: string;
i,j: longint;
kt: array[1..maxn] of boolean;
procedure
sangnt;
begin

fillchar(kt, sizeof(kt), true);
kt[1]:= false;
for i:=2 to trunc(sqrt(maxn)) do
if kt[i] then
for j:= 2 to maxn div i do
kt[i*j]:= false;
end;
BEGIN
assign(input, fi); reset(input);
assign(output, fo); rewrite(output);
readln(st);
sangnt;
for i:= 100000-1 downto 2 do
if kt[i] then
begin
str(i,st1);
if pos(st1,st)<>0 then
begin
write(st1);
halt;
end;
end;
close(input);
close(output);
END.

Bài tập 8 : Số FIBONACI lớn nhất là nguyên tố
Dãy FIBONACI là dãy được xác định như sau: F(0) = 0; F(1) = 1 và F(n)
= F(n-1) + F(n-2) với n = 2, 3...
Cho số nguyên dương M (2

nhất là nguyên tố và nhỏ hơn M.
Ví dụ: Với M=10 thì các số FIBONACI nhỏ hơn M là: 0, 1, 1, 2, 3, 5, 8.
Số 5 là số nguyên tố lớn nhất trong các số FIBONACI nhỏ hơn M. Vậy cần đưa
ra màn hình dịng thơng báo kết quả: Số cần tìm là: 5.
Dữ liệu vào: FIBO.INP Chứa một số nguyên dương M (213


Dữ liệu ra: FIBO.OUT ghi kết quả số FIBONACI lớn nhất là nguyên tố và
nhỏ hơn M.
Ví dụ:
FIBO.INP

FIBO.OUT

10

5

Hướng dẫn: Với bài toán này ta sử dụng thủ tục sàng số nguyên tố, đồng thời sử
dụng thủ tục để sàng các số fibonaci. Sau đó kiểm tra các số từ M-1 giảm dần, nếu
số nào vừa là số fibonaci, vừa là số nguyên tố thì ghi ra kết quả tìm được.
Code tham khảo:
const

fi='fibo.inp';
fo='fibo.out';
maxn= round(2e8);
var f0,f1,f2,M,x:longint;
fb: array[1..maxn] of boolean;

kt: array[1..maxn] of boolean;
I,j: longint;
Procedure sangnt;
Begin
Fillchar(kt,sizeof(kt), true);
Kt[1]:=false;
For i:=2 to trunc(sqrt(maxn) do
If kt[i] then
For j:=2 to maxn div i do kt[i*j]:=false;
End;
procedure sang_fibo;
begin
fillchar(fb, sizeof(fb), false);
a[1]:= true;
f0:=1;
f1:=1;
while f2 <= round(2e8) do
begin
f2:=f0+f1;
if f2 <= maxn then
fb[f2]:= true;
f0:=f1;
f1:=f2;
end;
end;
BEGIN
assign(input, fi); reset(input);
assign( output, fo); rewrite(output);
readln(M);
sangnt;

sang_fibo;
14


x:=M-1;
while (kt(x)=false) or (fb(x)=false) do x:=x-1;
write(x)
close(input); close(output);
END.

Bài tập 9: 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 ln thích những cái đặc biệt và mới mẻ, và anh ta đư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 BAI3.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] ≤ 108).
Kết quả ra: Ghi ra file văn bản BAI3.OUT: Số phần tử trong mảng là số gần
nguyên tố.
Ví dụ:
BAI3.INP
3

BAI3.OUT
1

456

Hướng dẫn: “Số gần nguyên tố” – là các số nguyên dương mà có đúng 3 ước
phân biệt, do đó số gần ngun tố phải là bình phương của một số nguyên tố.
Trong bài này ta sẽ sử dụng hai mảng là kt1 dùng để sàng các số nguyên tố,
mảng kt2 để sàng và đánh dấu những số là bình phương của các số nguyên tố.
Code tham khảo:
const

fi='bai3.inp';
fo='bai3.out';
max1=round(1e4);
max2=round(1e8);
var i,j,dem,n:longint;
a:array[1..1000001] of longint;
kt1:array[1..max1] of boolean;
kt2: array[1..max2] of boolean;

15


procedure
sangnt;
begin
fillchar(kt1, sizeof(kt1), true);
kt1[1]:= false;
for i:=2 to trunc(sqrt(maxn)) do
if kt1[i] then
for j:= 2 to maxn div i do
kt1[i*j]:= false;
end;
procedure gannto;

begin
fillchar(kt2,sizeof(kt2),false);
for i:=2 to trunc(sqrt(maxn)) do
if kt1(i)=true then kt2[i*i]:=true;
end;
begin
assign(input,fi);reset(input);
assign(output,fo);rewrite(output);
readln(n);
for i:=1 to n do read(a[i]);
sangnt;
gannto;
for i:=1 to n do
if kt2[a[i]]=true then inc(dem);
writeln(dem);
close(input);close(output);
end.

Bài tập 10: Số nguyên tố lớn thứ nhì

(Bài 3- Hội thi giáo viên dạy giỏi cáp Tỉnh năm 2017- 2018, Sở Giáo dục và
Đào tạo Thanh Hóa)
Hơm nay trời bỗng dưng mưa to, Bờm khơng thể đi học được, vì nhà Bờm quá
xa trường. Nếu đi học Bờm sẽ bị ướt hết người nên Bờm quyết định lấy sách Tin học
lớp 11 ra để tự học. Ngồi học được một lúc, Bờm nghĩ ra một bài toán để ngày mai
lên lớp đố các bạn. Bài toán như sau: Cho một dãy số ngun khơng âm A 1, A2, A3,...,
AN-1, AN. Hãy tìm giá trị của số nguyên tố lớn thứ nhì của tất cả các số nguyên tố
được lấy từ dãy số trên. Để hiểu rõ hơn về số nguyên tố lớn thứ nhì thì Bờm lấy 2 ví
dụ sau:
+ Ví dụ 1: Xét dãy số gồm 6 số sau: 11, 2, 2, 4, 5, 7. Thì số nguyên tố lớn thứ

nhì là 7. Giải thích: dãy trên ta có các số nguyên tố là 2, 5, 7, 11; thì số nguyên tố lớn
nhất là 11, số nguyên tố lớn thứ nhì là 7.
+ Ví dụ 2: Dãy số nguyên gồm 4 số sau: 1, 2, 2, 0. Thì dãy số này khơng có số
ngun tố thứ nhì. Giải thích: Vì khơng có số nguyên tố nào nhỏ hơn 2.
Yêucầu: Các bạn hãy thử giải bài toán trên của Bờm.
Dữ liệu vào: Từ file văn bản BAI3.INP gồm
- Dòng đầu tiên chứa một số nguyên dương N. (N ≤ 106)

16


- Dịng thứ hai gồm N số ngun khơng âm A1, A2, A3,..., AN-1, AN. (Ai≤ 106, với mọi
i=1,2, ...N)
Dữ liệu ra: Ghi ra file văn bản BAI3.OUT là một số ngun là kết quả của bài tốn.
Nếu khơng có số nguyên tố lớn thứ nhì thì in ra số -1
Ví dụ:
BAI3.INP
6
11 2 2 4 5 7

BAI3.OUT
7

BAI3.INP
4
1220

BAI3.OUT
-1


Hướng dẫn: Dùng sàng các số nguyên tố để đánh dấu các số nguyên tố. Sử
dụng biến res ban đầu gán giá trị là -1; ta duyệt lần lượt các phần tử của dãy
số, nếu dãy số đó có số ngun tố thì biến res được thay thế bằng số nguyên
tố lớn nhất. Vì ta đang cần tìm số nguyên tố lớn thứ nhì nên ta loại số nguyên
tố lớn nhất và đánh dấu trên mảng kiểm tra ngun tố tại vị trí đó là False.
Biến res được gán lại là -1 và ta duyệt lại một lần nữa để tìm số nguyên tố lớn
nhất. Nếu lần này tìm được thì đó là số nguyên tố lớn thứ nhì.
Code tham khảo:

const fi ='bai3.inp';
fo ='bai3.out';
maxN= round(1e6);
var

a: array[0..maxn+1] of longint;
f: array[0..maxn+1] of boolean;
i,n: longint;
res: longint;

procedure
var

sangnt;

i,j: longint;

begin
for i:= 2 to maxn do f[i]:= true;
f[0]:= false;
f[1]:= false;

for i:=2 to trunc(sqrt(maxn)) do
if f[i] then
for j:= 2 to maxn div i do
f[i*j]:= false;
end;
BEGIN
17


assign(input, fi); reset(input);
assign(output, fo); rewrite(output);
readln(n);
sangnt;
res:=-1;
for i:=1 to n do
begin
read(a[i]);
if f[a[i]] then

if res
end;
for i:= 1 to n do
if res = a[i] then f[a[i]]:= false;
res:= -1;
for i:=1 to n do
if f[a[i]] then

if res

writeln(res);
close(output);
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.
Trong năm học 2020-2021 tơi đã ứng dụng đề tài nghiên cứu của mình đối
với một số lớp khối 11 ở trường THPT Hoằng Hóa 2 và đã tổng hợp số liệu về
kết quả đạt được của học sinh về kĩ năng sử dụng ngơn ngữ lậ trình Pascal khi
cài đặt giải một số bài toán liên quan tới số nguyên tố như sau:
STT
1
2
3

Lớp
11A2
11A3
11A10

Sĩ số
40
45
48

Đạt yêu cầu
83 %
89.5 %
92 %


Không đạt yêu cầu
17 %
10.5 %
8%

+ Đa số các em học sinh nắm được khái niệm và cách sử dụng các thuật toán
để cài đặt một số bài toán liên quan tới số nguyên tố. Các em đã biết cách ứng
dụng linh hoạt phù hợp với từng bài toán cụ thể.
Như vậy, việc hướng dẫn chi tiết các phương pháp để kiểm tra số nguyên
tố và ứng dụng cụ thể vào từng bài toán cụ thể đã giúp học sinh có tiến bộ rõ
rệt khi viết các chương trình cho một số bài tốn liên quan tới số nguyên tố.
Đồng thời nâng cao việc yêu thích mơn tin học đối với một bộ phận học sinh,
trong đó có một số em có khả năng tìm hiểu sâu hơn về các dạng bài toán lập
18


trình phức tạp, cần phải xây dựng chương trình có cấu trúc mà việc sử dụng
hàm và thủ tục làm cho chương trình trở nên đơn giản, dễ hiểu, dễ bổ sung,
chỉnh sửa, lựa chọn phương pháp cài đặt phù hợp với bài toán cần giải quyết.
3. KẾT LUẬN, KIẾN NGHỊ
3.1. Kết luận
Đối với đa số học sinh nội dung về lập trình giải quyết các bài tốn số
học là khá phức tạp, để học sinh hiểu rõ bản chất, biết cách ứng dụng để xây
dựng chương trình phù hợp với từng bài tốn là rất khó, địi hỏi các em phải
có kiến thức nhất định về mặt tốn học, đồng thời phải biết vận dụng phù hợp
với cách xây chương trình con cụ thể của ngơn ngữ lập trình mới có thể lập
trình cài đặt bài tốn đó một cách khoa học, rõ ràng. Do đó, để dạy tốt được
nội dung này người giáo viên cần phải sử dụng các phương pháp dạy học tích
cực thì mới nâng cao hiệu quả giảng dạy.
Với mỗi nội dung cần truyền đạt cho học sinh đòi hỏi người giáo viên

cần phải đầu tư suy nghĩ lựa chọn phương pháp dạy học là phù hợp nhất, các
bài tập liên hệ thực tế làm cho học sinh thấy hứng thú nhất và tạo động lực,
động cơ cao nhất để các em chiếm lĩnh tri thức.
Trong q trình giải các bài tốn liên quan tới số nguyên tố hiểu rõ bản
chất, vai trò của việc xây dựng chương trình sẽ giúp các em xây dựng những
chương trình phức tạp một cách khoa học, rõ ràng, là cơ sở cho việc nghiên
cứu chuyên sâu đặc biệt là đối với những học sinh khá giỏi.
3.2. Kiến nghị
Sau khi thực hiện đề tài này tôi xin mạnh dạn đưa ra một số đề xuất như
sau :
- Để học sinh thực sự hiểu rõ về nội dung chương trình, có khả năng rèn
luyện các bài tập bổ trợ thì cần tăng cường hơn nữa lượng thời lượng trong phân
phối chương trình để học sinh rèn luyện các dạng bài tập về chương trình giúp
học sinh nắm cấu trúc, cách sử dụng chương trình trong một số bài tập cụ thể.
- Sở giáo dục và đào tạo cần thường xuyên mở các lớp học chuyên đề về
đổi mới và nâng cao hiệu quả các phương pháp dạy học, đề các giáo viên có cơ
hội được chia sẻ các kinh nghiệm, các phương pháp dạy học hiệu quả cho đồng
nghiệp.
Trên đây là một số kinh nghiệm của tôi qua nhiều năm liền dạy ở khối
lớp 11, trường THPT Hoằng Hóa 2, cũng như tham khảo qua nhiều nguồn
thông tin, tư liệu khác nhau, rất mong được sự đóng góp của các đồng nghiệp
nhằm giúp đề tài của tơi được hồn thiện thêm.
19


XÁC NHẬN CỦA THỦ

Thanh Hóa, ngày 20 tháng 5 năm 2021

TRƯỞNG ĐƠN VỊ


Tôi xin cam đoan đây là sáng kiến kinh
nghiệm của mình viết, khơng sao chép
nội dung của người khỏc.

Ngi vit SKKN

Nguyễn Thị Hòa

20


DANH MỤC TÀI LIỆU THAM KHẢO
1. Tin học 11, Hồ Sĩ Đàm (chủ biên)- Hồ Cẩm Hà – Trần Đỗ Hùng –
Nguyễn Đức Nghĩa – Nguyễn Thanh Tùng – Ngô Ánh Tuyết, Nhà xuất
bản Giáo dục, 2009.
2. Bài tập Tin học 11, Hồ Sĩ Đàm Nguyễn Thanh Tùng, Nhà xuất bản Giáo
dục, 2008.
3. Sách giáo viên Tin học 11, Hồ Sĩ Đàm (chủ biên)- Hồ Cẩm Hà – Trần
Đỗ Hùng – Nguyễn Đức Nghĩa – Nguyễn Thanh Tùng – Ngô Ánh Tuyết,
Nhà xuất bản Giáo dục, 2009.
4. Tài liệu bồi dưỡng học sinh giỏi môn Tin học, Sở Giáo dục Đào tạo Thanh
Hóa.
5. />
21


DANH MỤC
CÁC ĐỀ TÀI SÁNG KIẾN KINH NGHIỆM ĐÃ ĐƯỢC HỘI ĐỒNG
ĐÁNH GIÁ XẾP LOẠI CẤP PHÒNG GD&ĐT, CẤP SỞ GD&ĐT VÀ

CÁC CẤP CAO HƠN XẾP LOẠI TỪ C TRỞ LÊN

Họ và tên tác giả:

Nguyễn Thị Hòa

Chức vụ và đơn vị công tác: Giáo viên Tin học - Trường THPT Hoằng Hóa
2

TT

1.

Tên đề tài SKKN

Rèn luyện kĩ năng sử dụng
cấu trúc lặp trong Pascal để

Kết quả
Cấp đánh
đánh giá
giá xếp loại
xếp loại
(Phịng, Sở,
(A, B,
Tỉnh...)
hoặc C)
Sở giáo dục
và đào tạo
Thanh Hóa


Năm học
đánh giá xếp
loại

B

2012 - 2013

C

2017 - 2018

giải một số bài toán truy hồi
cho học sinh lớp 11
2.

Sử dụng phương pháp dạy
học tích cực để nâng cao

Sở giáo dục
và đào tạo
Thanh Hóa

hiệu quả dạy học nội dung
chương trình con cho học
sinh lớp 11.

22



×