Tải bản đầy đủ (.doc) (33 trang)

SKKN chuyên đề về số nguyên tố trong bồi dưỡng học sinh giỏi môn 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 (194.04 KB, 33 trang )

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
lậpXÃ
– Tự
do-CHỦ
Hạnh
phúc VIỆT NAM
CỘNGĐộc
HÒA
HỘI
NGHĨA
Độc lập – Tự do- Hạnh phúc

ĐỀ TÀI:

ĐỀ VỀ SỐ NGUYÊN TỐ TRONG
ĐỀCHUYÊN
TÀI:
BỒI
DƯỠNGPHÁP
HỌCDẠY
SINH
GIỎI
ÁP DỤNG
PHƯƠNG
HỌC
THEO GÓC
TRONG MÔN HÓA HỌC NHẰM PHÁT HUY TÍNH
TÍCH CỰC HỌC TẬP CỦA HỌC SINH

Họ và tên: Dương Thùy Mai
Chức


viên Thị Hoa Lý
Họ vàvụ:
tên:Giáo
Nguyễn
Đơn
công
: Trường
THPT
Chứcvịvụ:
Tổtác
trưởng
chuyên
mônNinh Châu
Đơn vị công tác : Trường THPT Ninh Châu

Quảng Ninh,
Ninh, tháng
tháng 15 năm
năm 2019
2018
Quảng


CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập – Tự do- Hạnh phúc
Độc lập – Tự do- Hạnh phúc

ĐỀ TÀI:


ĐỀ TÀI:

ÁP
DỤNG PHƯƠNG
PHÁP
DẠY HỌC
GÓC
CHUYÊN
ĐỀ VỀ SỐ
NGUYÊN
TỐ THEO
TRONG
HỌC
SINH
GIỎI
TRONG BỒI
MÔNDƯỠNG
HÓA HỌC
NHẰM
PHÁT
HUY TÍNH
TÍCH CỰC HỌC TẬP CỦA HỌC SINH

Tháng 5 / 2018
Tháng 1 / 2019


MỤC LỤC
1. PHẦN MỞ ĐẦU...................................................................................................1
1.1 Lí do chọn đề tài..............................................................................................1

1.2 Điểm mới của đề tài........................................................................................1
2. NỘI DUNG...........................................................................................................2
2.1 Cơ sở lí luận....................................................................................................2
2.2 Thực trạng của vấn đề.....................................................................................2
2.3. Nội dung và giải pháp thực hiện ....................................................................3
2.3.1 Bài toán gốc: “ Kiểm tra tính nguyên tố của một số nguyên dương ”..3
2.3.2 Các dạng bài toán về số nguyên tố..........................................................6
Bài toán 1: Liệt kê các số nguyên tố trong đoạn từ [2,N]..................6
Bài toán 2: Số siêu nguyên tố...............................................................8
Bài toán 3: Dãy số đặc biệt................................................................12
Bài toán 4: Dãy con tăng nguyên tố..................................................14
Bài toán 5: Phân tích 1 số ra tích hoặc tổng các số nguyên tố........17
Bài toán 6: Phân tích thừa số nguyên tố...........................................19
Bài toán 7: Số nguyên tố mersen.......................................................23
Bài toán 8: Dãy nguyên tố..................................................................26
3. PHẦN KẾT LUẬN.............................................................................................29
3.1. Ý nghĩa, phạm vi áp dụng của đề tài............................................................29
3.2. Kiến nghị, đề xuất........................................................................................29
TÀI LIỆU THAM KHẢO.......................................................................................30


1. PHẦN MỞ ĐẦU
1.1 Lí do chọn đề tài.
Trong chương trình tin học lớp 11, học sinh được tiếp cận với ngôn ngữ lập
trình Pascal, một loại ngôn ngữ thuộc nhóm ngôn ngữ lập trình bậc cao. Đây là một
ngôn ngữ không những chặt chẽ về mặt cú pháp mà còn chặt chẽ về mặt cấu trúc
dữ liệu. Chính vì vậy mà việc tiếp cận với ngôn ngữ lập trình Pascal là cơ hội để
học sinh rèn luyện tính tư duy logic, làm việc và giải quyết vấn đề có tính hệ
thống.
Trong quá trình giảng dạy ở trên lớp, Giáo viên chúng ta cần truyền cảm hứng

tới học sinh để học sinh có sự đam mê, yêu thích bộ môn tin học hơn để từ đó học
sinh có nhu cầu tìm tòi học hỏi về bộ môn này. Trong công tác bồi dưỡng học sinh
giỏi cũng vậy, mỗi giáo viên đều có những phương pháp bồi dưỡng riêng của
mình, nhưng đều cùng hướng đến một mục đích là để học sinh dễ nắm bắt được
thuật toán và nắm vững chắc những kiến thức cơ bản để vận dụng vào giải quyết
các bài toán nâng cao. Trong chương trình tin học lớp 10, khi tìm hiểu về thuật
toán, chúng ta cũng đã làm quen với thuật toán kiểm tra một số nguyên dương có
phải là số nguyên tố hay không. Và Thầy, cô giáo chúng ta cũng nhận thấy rằng
trong các dạng bài bồi dưỡng học sinh giỏi thì có rất nhiều bài toán về số nguyên
tố. Tuy nhiên, qua quá trình giảng dạy cho thấy, đa số các em đều hiểu được khái
niệm số nguyên tố nhưng lại khó khăn trong việc xây dựng thuật toán cho bài toán
này, thậm chí những em thuộc đối tượng bồi dưỡng học sinh giỏi cũng chỉ đưa ra
được những ý tưởng giải quyết bài toán mà chưa tối ưu. Vậy nên muốn học sinh
thuộc đối tượng bồi dưỡng học sinh giỏi có tư duy tốt để giải các dạng bài về số
nguyên tố thì giáo viên chúng ta cần hướng cho học sinh có ý tưởng tốt và nắm
chắc phương pháp giải bài toán cơ bản nhất, từ đó xâu chuổi các dạng bài có liên
quan với nhau hay nói cách khác là dạy từ cơ bản đến nâng cao theo từng chuyên
đề.
Xuất phát từ cơ sở trên, qua quá trình bồi dưỡng học sinh giỏi hằng nam tôi
đã xây dựng sáng kiến kinh nghiệm “Chuyên đề về số nguyên tố trong bồi dưỡng
học sinh giỏi môn tin học”.
1.2 Điểm mới của đề tài
Trên cơ sở nhận thức, tìm hiểu và phân tích, sáng kiến này đưa ra các bài toán
về số nguyên tố để xây dựng thuật toán và chương trình giải quyết các bài toán đó.
Qua quá trình giảng dạy trên lớp, khi khảo sát học sinh về cách kiểm tra một số
nguyên dương có phải là số nguyên tố hay không thì đa số học sinh đều đưa ra
được các ý tưởng cho bài toán. Tuy nhiên các ý tưởng đó cho thấy các em mới chỉ
hình thành tư duy giải bài toán mà chưa quan tâm tới phạm vi giá trị dữ liệu được
4



dùng trong bài toán hoặc chỉ đưa ra cách giải mà chưa tối ưu. Chính vì vậy khi đi
xây dựng chương trình, các em sẽ gặp phải một số lỗi trong chương trình. Đề tài
này góp phần thúc đẩy hướng phát huy tính tích cực của học sinh, giúp học sinh có
tư duy lập trình, và nắm chắc kiến thức khi được giải quyết các bài toán theo
chuyên đề, góp phần nâng cao kiến thức và khả năng thực hành cho giáo viên,
trong việc dạy học và đặc biệt là ôn thi học sinh giỏi.
Hiệu quả và chất lượng trong dạy học phụ thuộc vào nhiều yếu tố. Tuy nhiên
việc giáo viên nhận thức vấn đề có sâu sắc, chính xác hay không, chuẩn bị kiến
thức có chu đáo hay không cũng như có phương pháp và kỹ thuật tốt để xử lý bài
toán là đóng vai trò hết sức quan trọng. Cách nhận thức, cách hiểu, phân tích và
đưa ra các chương trình cụ thể mà tôi đưa ra sau đây, hy vọng sẽ góp một phần nhỏ
định hướng để đồng nghiệp rút kinh nghiệm trong nhiệm vụ giảng dạy tốt môn Tin
học và thực hiện tốt việc ôn thi học sinh giỏi..

2. NỘI DUNG
2.1 Cơ sở lí luận
Ngôn ngữ lập trình Pascal là ngôn ngữ lập trình có cấu trúc, nó chặt chẽ về
mặt cú pháp mà còn chặt chẽ về mặt dữ liệu, là một tập con của ngôn ngữ máy
tính. Đây là một dạng ngôn ngữ được chuẩn hóa. Chính vì vậy, khi xây dựng các
chương trình trên ngôn ngữ này cần phải tuân thủ vào bộ nhớ và cấu trúc dữ liệu.
Thông thường trong những dạng bài học sinh giỏi thì phạm vi giá trị dữ liệu của
biến được sử dụng trong chương trình và số lượng biến sử dụng trong chương trình
là rất phức tạp, học sinh cần có những phương pháp xử lý tốt để đảm bảo kết quả
khi chạy chương trình.
Như vậy, việc đưa ra phương pháp và kỹ thuật xử lý dữ liệu lớn trong lập
trình với Pascal để xử lý một số bài toán khi phạm vị dữ liệu vượt quá phạm vi của
Pascal, giúp cho học sinh và giáo viên có hướng xử lý tốt trong học lập trình và bồi
dưỡng học sinh giỏi.
2.2 Thực trạng của vấn đề

* Điều kiện của bộ môn Tin học: SGK Tin học 11 biên soạn với tinh thần
truyền cho học sinh có được tư duy lập trình. Nhưng trong việc ôn thi học sinh giỏi
thì cần cụ thể trong lập trình trên môi trường Pascal hoặc Free Pascal. Như vậy
việc dạy học cho học sinh có chút khác biệt so với việc ôn thi học sinh giỏi.
* Điều kiện của Nhà trường: Tình trạng chung của các trường THPT trong
tỉnh nói riêng và cả nước nói chung, trang thiết bị của nhà trường còn nhiều thiếu
5


thốn, thời gian ôn luyện học sinh giỏi cũng chưa được nhiều.
* Điều kiện của giáo viên: Nhà trường có 03 giáo viên tin học đều đạt chuẩn,
tuổi đời trẻ, có năng lực, nhưng ý thức học hỏi để nâng cao trình độ chuyên môn
của bản thân còn chưa thực sự tích cực.
* Điều kiện học sinh: Hầu hết học sinh đều là con em ở nông thôn. Nhưng
do kinh tế địa phương những năm gần đây phát triển mạnh, các dịch vụ Internet và
kinh doanh máy tính trên địa bàn cũng phát triển nên học sinh ít nhiều đã được tiếp
cận máy tính và Internet. Mặt khác, đây là môn học mới lại được ứng dụng nhiều
trong thực tế đời sống. Vì vậy, học sinh cũng khá hứng thú và có ý thức với môn
học nên trong nhiều tiết học các em đều hăng say xây dựng bài và tìm hiểu thực tế
đối với môn học. Tuy nhiên, đây là môn học khó đồng thời lại liên quan đến rất
nhiều lĩnh vực khoa học tự nhiên, xã hội nên việc tiếp cận của học sinh cũng tương
đối khó. Kết quả học tập của môn Tin học và kết quả của học sinh giỏi chưa cao.
Kết quả bồi dưỡng học sinh giỏi
Năm học 2015-2016 có 2 giải KK
Năm học 2016-2017 có 2 giải KK
Năm học 2017-2018 có 1 giải nhì, 1 giải ba và 1 giải khuyến khích
2.3. Nội dung và giải pháp thực hiện .
Trước hết tôi đã đưa ra bài toán như sau:
Bài toán gốc: “ Kiểm tra tính nguyên tố của một số nguyên dương ”.
Đây là bài toán cơ bản trong sách giáo khoa tin học lớp 10 mà học sinh đã

tìm hiểu về thuật toán của bài toán.
Ý tưởng: Một số nguyên dương N là số nguyên tố nếu nó có đúng 2 ước số khác
nhau là 1 và chính nó. Từ đó ta suy ra
- Nếu N=1 thì N không là số nguyên tố
- Nếu 1- Nếu N  4 và không có ước số trong phạm vi từ 2 đến phần nguyên căn bậc 2 của
N thì N là số nguyên tố.
Chứng minh: Tại sao N không có các ước từ 2 đến phần nguyên căn bậc 2 của N
thì N là số nguyên tố.
Vì nếu N>1 không phải là số nguyên tố, ta luôn có thể tách n=k1 x k2 mà
2 k1 k2 n  1 Vì k1 k1 k1 k 2 n nên k1  n
Do đó, việc kiểm tra với k từ 2 đến n-1 là không cần thiết mà chỉ cần kiểm tra có
tồn tại ước từ 2 đến phần nguyên căn bậc 2 của N.
6


Từ đó ta có thuật toán sau:
Thuật toán mô tả theo cách liệt kê như sau:
Bước 1: Nhập số nguyên dương N;
Bước 2: Nếu N = 1 thì thông báo N không nguyên tố rồi kết thúc;
Bước 3: Nếu N < 4 thì thông báo N là nguyên tố rồi kết thúc;
Bước 4: i  2;
Bước 5: Nếu i > [ N ] thì thông báo N là nguyên tố rồi kết thúc;
Bước 6: Nếu N chia hết cho i thì thông báo N không nguyên tố rồi kết thúc;
Bước 7: i  i + 1 rồi quay lại bước 5.
Dưới đây là ví dụ mô phỏng việc thực hiện thuật toán trên.

Với N = 29 ( �
� 29� 5)



Với N = 45 ( �
� 45� 6 )

I

2

3

4

5

N/i

29/2

29/3

29/4

29/5

Chia
hết
không?

6


Không Không Không Không

a) 29 là số nguyên tố

I

2

3

N/i

45/2

45/3

Chia
hết
không?

Chia hết
Không

b) 45 không là số nguyên tố

Trên cơ sở thuật toán ta tiến hành cài đặt thuật toán cho bài toán gốc như sau:
Chương trình 1 :
Function nt(N: longint): boolean;
Var
k, M: integer;

Begin
If N=1 then begin nt:= false; exit end;
If (N=2) or (N=3) then begin nt:=true; exit end;
M:=trunc(sqrt(N));
For k:= 2 to M do
If ( N mod k =0) then begin nt:=false; exit ; end;
nt:=true;
end;
7


Đây là chương trình con kiểm tra 1 số nguyên dương bất kỳ có phải là số
nguyên tố ?
Hàm nt(N) trên tiến hành kiểm tra lần lượt từng số nguyên k trong đoạn từ 2 đến
phần nguyên căn bậc 2 của N. để cải tiến cần giảm thiểu số các số cần kiểm tra.
Thay vì kiểm tra các số k ta sẽ chỉ kiểm tra các số k có tính chất giống tính chất
của số nguyên tố. Vậy tính chất của số nguyên tố như thế nào ?
Tính chất số nguyên tố:
Trừ số 2 và số 3 các số nguyên tố có dạng 6k 1 ( vì các số có dạng 6k 2 thì chia
hết cho 2, 6k  3 thì chia hết cho 3).
Từ đó ta có chương trình con: Kiểm tra 1 số nguyên dương bất kỳ có phải là số
nguyên tố ? áp dụng tính chất số nguyên tố như sau:
Chương trình 2:
function nt(N:longint):boolean;
var k,m,i:longint;
begin
if (N=2) or (N=3) then begin nt:=true; exit; end;
if( (N=1) or (N mod 2=0) or (N mod 3 =0)) then
begin


nt:=false; exit; end;

k:= -1;
M:=trunc(sqrt(N));
repeat
inc(k,6);
if (N od k =0) or (n mod (k+2) = 0) then break;
until k>M
if k>Mthen nt:=true
else nt:=false;
end;
Như vậy để có thể giải quyết các bài toán về số nguyên tố trong lập trình với dữ
liệu lớn ta đi theo hướng xây dựng chương trình cho bài toán gốc với sự lựa chọn
chương trình 2.
Với cách viết chương trình cho bài toán gốc với chương trình dạng 2. Ta có
thể sử dụng dữ liệu với số nguyên dương N là rất lớn không chỉ là kiểu dữ liệu
longint mà thay vào đó là dữ liệu kiểu int64 cụ thể như sau:
8


function nt(N:int64):boolean;
var k,m,i:longint;
begin
if (N=2) or (N=3) then begin nt:=true; exit; end;
if( (N=1) or (N mod 2=0) or (N mod 3 =0)) then
begin

nt:=false; exit; end;

k:= -1;

M:=trunc(sqrt(N));
repeat
inc(k,6);
if (N od k =0) or (n mod (k+2) = 0) then break;
until k>M
if k>Mthen nt:=true
else nt:=false;
end;

2.3.2 Các dạng bài toán về số nguyên tố
Bài toán 1: Viết chương trình liệt kê các số nguyên tố trong đoạn từ [2,N]
Dữ liệu vào: Tệp văn bản nguyento.inp chứa duy nhất số nguyên dương N
Kết quả: Ghi vào tệp văn bản nguyento.out các số nguyên tố, mỗi số cách nhau ít
nhất 1 kí tự trống. Ghi trên cùng 1 dòng.
Ý tưởng bài toán này như sau:
-Xây dựng hàm nguyên tố..
- Xây dựng chương trình con liệt kê các số nguyên tố trong đoạn từ 2 đến phần
nguyên N . Bằng cách sử dụng lời gọi hàm nt(i). Nếu hàm nt(i) (trong đó i nhận
giá trị từ 2 đến N) nếu hàm nhận giá trị đúng thì giá trị i được ghi vào tệp write(f2,
i,’ ‘).
Thông qua đoạn chương trình:
For i:=2 to N do
If nt(i) then write(f2, i, ‘ ‘);
9


Chương trình cụ thể với bài toán 1:
const fi='nguyento.inp';
fo='nguyento.out';
var n,m, i:longint;

f1,f2:text;
procedure doctep;
begin
assign(f1,fi); reset(f1);
assign(f2,fo); rewrite(f2);
read(f1,n);
end;
function nt(n:int64):boolean;
var k, M:longint;
begin
if (n=2) or (n=3) then begin nt:=true; exit; end;
if (n=1) or (n mod 2=0) or (n mod 3=0) then begin nt:=false; exit ; end;
M:=trunc(sqrt(n));
K:=-1;
Repeat
Inc(k,6);
if (n mod k=0) or (n mod (k+2)=0) then begin break;
until k>M;
if k>m then nt:=true else nt:=false;
end;
procedure xuly;
begin
for i:=2 to n do if nt(i) then write(f2,i,' ');
end;
procedure dongtep;
begin
close(f1); close(f2);
10



end;
begin
doctep;
xuly;
dongtep;
end.
Bài toán 2:

Số siêu nguyên tố

Hãy viết chương trình đọc dữ liệu vào là một số nguyên N (0kết quả các số siêu nguyên tố có N chữ số và số lượng của chúng.
Dữ liệu vào: Tệp văn bản SNT.INP chứa duy nhất số nguyên dương N
Kết quả: Ghi vào tệp SNT.OUT
- Dòng 1: Ghi các số siêu nguyên tố có N chữ số
- Dòng tiếp theo ghi số lượng các số siêu nguyên tố.
SNT.INP

SNT.OUT

5

23333 23339 23399 23993 29399 31193 31379
37337 37339 37397 59393 59399 71933 73331
73939
Co 15 so sieu nguyen to

Số siêu nguyên tố:
Là số nguyên tố mà khi bỏ một số tùy ý các chữ số bên phải của nó thì
phần còn lại vẫn tạo thành một số nguyên tố.

Ví dụ: 37337 là một số siêu nguyên tố có 5 chữ số vì 3733,373,37,3 cũng là các số
nguyên tố.
Ý tưởng của bài toán như sau:
- Xây dựng hàm số nguyên tố.
- Xây dưng hàm kiểm tra số i có phải là số siêu nguyên tố hay không.
Cụ thể ta xây dựng hàm kiểm tra siêu nguyên tố như sau:
Nếu nt(i):=false thì SNT:=False ;
Nếu nt(i)=true thì tiến hành giảm giá trị của i bằng cách chia nó cho 10 (i:= i div
10) và lại quay lại kiểm tra i cho đến khi i giảm xuống i=0 then snt:=true;
11


Chương trình con về kiểm tra một số nguyên bất kỳ có phải là số siêu nguyên tố
hay không? như sau:
function snt(i:longint):boolean;
begin
snt:=false;
repeat
if nt(i)=false then exit
else
i:= i div 10;
until i=0;
snt:=true;
end;
Ở chương trình con kiểm tra một số nguyên bất kỳ có phải là số siêu nguyên
tố. Ta đã sử dụng đến hàm kiểm tra một số nguyên dương có phải là số nguyên tố
thông qua lời gọi nó. Như vậy với bài toán về số siêu nguyên tố nếu ta xây dựng
được chương trình con kiểm tra một số nguyên bất kỳ là số nguyên tố hay không?
Thì dễ dàng xây dựng được chương trình con là số siêu nguyên tố.
- Xây dựng chương trình con thủ tục ghi vào tệp các số siêu nguyên tố đồng thời

ứng với mỗi số là siêu nguyên tố thì đếm .
- Ý tưởng ghi các số siêu nguyên tố vào tệp:
+ Trước hết tìm giá trị đầu và giá trị cuối của số có n chữ số
Gtd:=1; gtc:=1;
For i:=1 to n-1 do gtd:=gtd*10;
Gtc:=(gtd*10)-1;
+ Sau khi tìm được giá trị đầu và giá trị cuối thì tiến hành kiểm tra các số có n chữ
số trong khoảng từ GTD đến GTC. Nếu là số siêu nguyên tố thì ghi vào tệp và
đồng thời đếm.
Thể hiện qua đoạn lệnh sau:
For i:=gtd to gtc do
If snt(i) then begin write(f2, i,’ ‘); inc(dem); end;
Xây dựng cụ thể chương trình con ghi vào tệp các số siêu nguyên tố đồng thời ứng
với mỗi số là siêu nguyên tố thì đếm:
12


procedure xulytep;
var
gtd,gtc:longint;
dem:integer;
begin
gtd:=1; gtc:=1; dem:=0;
for i:=1 to n-1 do gtd:=gtd*10;
gtc:=gtd*10; dec(gtc);
for i:=gtd to gtc do
if snt(i) then
begin
write(f2,i,' '); inc(dem);
end;

writeln(f2); write(f2, 'co ',dem,'so sieu nguyen to');
end;
Chương trình cụ thể với bài toán 2:
Const fi='nguyento.inp';
fo='nguyento.out';
Var n,m, i:longint;
f1,f2:text;
Procedure doctep;
begin
assign(f1,fi); reset(f1);
assign(f2,fo); rewrite(f2);
read(f1,n);S
end;
Function nt(n:longint):boolean;
var k,m,i:longint;
begin
13


if (n=2) or (n=3) then begin nt:=true; exit; end;
if( (n=1)or (n mod 2=0)or (n mod 3 =0) )then begin nt:=false; exit; end;
k:=-1;
m:=trunc(sqrt(n));
repeat
inc(k,6);
if (n mod k =0) or (n mod (k+2) = 0) then break;
until k>m;
if k>m then nt:=true
else nt:=false;
end;

Function snt(i:longint):boolean;
begin
snt:=false;
repeat
if nt(i)=false then exit
else
i:= i div 10;
until i=0;
snt:=true;
end;
Procedure xuly;
var
gtd,gtc:longint;
dem:integer;
begin
gtd:=1;
gtc:=1;
dem:=0;
for i:=1 to n-1 do gtd:=gtd*10;
gtc:=gtd*10;
14


dec(gtc);
for i:=gtd to gtc do
if snt(i) then
begin
write(f2,i,' ');
inc(dem);
end;

writeln(f2);
write(f2, 'co ',dem,'so sieu nguyen to');
end;
Procedure dongtep;
begin
close(f1);
close(f2);
end;
Begin
doctep; xuly; dongtep;
End.
Liên quan đến hàm nguyên tố còn có các bài toán về tính chất của một dãy số
Cụ thể bài toán sau:
Bài toán 3:

Dãy số đặc biệt

Dãy số A1,A2,...,An được gọi là dãy số đặc biệt nếu nó thỏa mãn các điều kiện sau
- Là dãy số giảm dần
- Với mỗi A thì A’ hoặc là số nguyên tố hoặc là ước của một trong các số từ
A1 đến Ai-1
Em hãy tìm dãy số đặc biệt dài nhất bắt đầu từ N.
Dữ liệu vào: Từ File văn bản DAYSO.INP là một số nguyên dương N
(N<10000)
Kết quả: Ghi ra File văn bản DAYSO.OUT là dãy số tìm được các số cách nhau
bởi dấu cách.
DAYSO.INP

DAYSO.OUT


12

12 11 7 6 5 4 3 2 1
15


Ý tưởng bài toán:
- Xây dựng hàm kiểm tra tính nguyên tố
- Tìm các số thỏa mãn điều kiện là số nguyên tố hoặc là ước của N ghi vào tệp
procedure xuly;
begin
write(f2,n,' ');
for j:=n-1 downto 1 do
if (N mod j =0) or (nt(j)) then write(f2,j,' ');
end;
Như vậy với dạng bài toán này chúng ta nghĩ ngay đến hàm nguyên tố.
Chương trình cụ thể với bài toán 3:
Const fi='DAYSO.INP';
fo='DAYSO.OUT';
Var f1,f2:text;
a:array[1..10000] of longint;
n,i,j:longint;
Procedure doctep;
begin
assign(f1,fi);

reset(f1);

while not eof(f1) do
read(f1,n);

assign(f2,fo); rewrite(f2);
end;
Function nt(n:int64):boolean;
var k,m,i:longint;
begin
if (n=2) or (n=3) then begin nt:=true; exit; end;
if( (n=1)or (n mod 2=0)or (n mod 3 =0) )then begin nt:=false; exit; end;
k:=-1;
16


m:=trunc(sqrt(n));
repeat
inc(k,6);
if (n mod k =0) or (n mod (k+2) = 0) then break;
until k>m;
if k>m then nt:=true
else nt:=false;
end;
Procedure xuly;
begin
write(f2,n,' ');
for j:=n-1 downto 1 do
if (N mod j =0) or (nt(j)) then write(f2,j,' ');
end;
Procedure dongtep;
begin
close(f1); close(f2);
end;
Begin

doctep;
xuly;
dongtep;
End.
Bài toán 4

DÃY CON TĂNG NGUYÊN TỐ

Cho 1 dãy N số nguyên dương. Dãy con tăng nguyên tố M phần tử là 1 dãy số có
dạng Ai1
Ai2 Ai3 …
Aim và thỏa điều kiện
i)

1 <= i1 < i2 < i3 < … < im <= n

ii)

Ai1 <= Ai2 <= Ai3 <= … <= Aim

iii)

Ai là số nguyên tố

iv)

Hãy tìm độ dài của dãy con tăng nguyên tố dài nhất
17



Dữ liệu nhập: vào từ file văn bản DAYCON.INP với định dạng như sau:
- Dòng đầu tiên là số N <= 1000 (tức là số phần tử của dãy số ban đầu)
- Dòng tiếp theo chứa N số nguyên là giá trị các phần tử của dãy số
(0<=A[i]<=100000)
Dữ liệu xuất: xuất ra file văn bản DAYCON.OUT
- Dòng 1: Số M tức phần tử của dãy con tăng nguyên tố dài nhất
- Dòng tiếp theo ghi ra giá trị của M phần tử của dãy con tăng dài nhất
DAYCON.inp

DAYCON.out

13

4

3 13 6 8 7 12 9 5 11 6 3 13 15

3 7 11 13

Ý tưởng bài toán như sau:
- Xây dựng hàm nguyên tố
- Xây dựng chương trình con tìm ra các phần tử của dãy là số nguyên tố đồng thời
các số thỏa mãn điều kiện giá trị sau lơn hơn giá trị trước. Vì vậy cần tìm được 1
dãy đơn điệu tăng lớn nhất.
Chương trình cụ thể với bài toán 4:
Program day_con_tang_nguyen_to;
Const fi='daycon.inp';
fo='daycon.out';
Var f1,f2:text;
i,n,j,t,csmax:integer;

a,b,c,d:array[0..1001] of integer;
Procedure nhapdulieu;
begin
assign(f1,fi); assign(f2,fo);
reset(f1); rewrite(f2);
readln(f1,n);
for i:=1 to n do read(f1,a[i]);
end;
18


Function nt(n:int64):boolean;
var k,m,i:longint;
begin
if (n=2) or (n=3) then begin nt:=true; exit; end;
if( (n=1)or (n mod 2=0)or (n mod 3 =0) )then begin nt:=false; exit; end;
k:=-1;
m:=trunc(sqrt(n));
repeat
inc(k,6);
if (n mod k =0) or (n mod (k+2) = 0) then break;
until k>m;
if k>m then nt:=true
else nt:=false;
end;
Procedure dongtep;
begin
close(f1); close(f2);
end;
Procedure qhd;

begin
b[csmax]:=1;
for i:=j downto 0 do begin
csmax:=j+1;
for t:=i+1 to j+1 do
if (a[t]>a[i])and(b[t]>b[csmax]) then csmax:=t;
b[i]:=b[csmax]+1;
c[i]:=csmax;
end;
write(f2,b[0]-2,' '); i:=c[0];
while i<>n+1 do begin
write(f2,a[i],' ');
19


i:=c[i];
end;
end;
Procedure thaotac;
begin
j:=0;
for i:=1 to n do if kt(a[i]) then begin inc(j); d[j]:=a[i]; end;
a[0]:=-32768; a[n+1]:=32767;
qhd;
end;
Begin
nhapdulieu;
thaotac;
dongtep;
End.

Bài toán 5:

Phân tích 1 số ra tích hoặc tổng các số nguyên tố.

Cho trước số tự nhiên N lập trình phân tích N thành tích các thừa số nguyên tố.
Dữ liệu: Vào File văn bản PTNT.INP chỉ chứa một số duy nhất N
Kết quả: Ghi vào file văn bản PTNT.OUT tích các thừa số nguyên tố
PTNT.INP

PTNT.OUT

18

2*3*3

Với dạng bài toán này ta có thể sử dụng hàm nguyên tố hoặc không sử dụng hàm
nguyên tố mà chỉ sử dụng tính chất của số nguyên tố
- Ý tưởng bài toán:
Xây dựng mô đun chương trình con phân tích một số N ra thừa số nguyên tố
bằng cách khởi gán giá trị ban đâu i:=2; tiến hành kiểm tra trong khi (n mod i =0)
thì thay đổi giá trị n:= n div i, đồng thời ghi giá trị i vào tệp.
Lưu ý khi ghi giá trị i vào tệp cần kiểm tra giá trị n. Nếu n=1 thì write(f2,i) ngược
lại ghi write(f2,i,'*').
Chương trình con như sau:
20


procedure thua_sont(n:integer);
Var m:integer;
Begin

m:=trunc(sqrt(n));
i:=2;
while i<=m do
begin
while n mod i=0 do
begin
n:=n div i;
if n=1 then write(f2,i) else write(f2,i,'*');
end;
i:=i+1;
end;
End;
Chương trình cụ thể với bài toán 5:
Const fi='PTNT.INP';
fo='PTNT.OUT';
Var
f1,f2:text;
i,j,n:integer;
Procedure doc_tep;
begin
assign(f1,fi); reset (f1);
assign(f2,fo); rewrite(f2);
readln(f1,n);
end;
Procedure thua_sont(n:integer);
var
m:integer;
begin
21



m:=trunc(sqrt(n));
i:=2;
while i<=m do
begin
while n mod i=0 do
begin
n:=n div i;
if n=1 then write(f2,i) else write(f2,i,'*');
end;
i:=i+1;
end;
end;
Procedure dong_tep;
begin
close(f1);
close(f2);
end;
begin
doc_tep;
thua_sont(n);
dong_tep;
end.
Với dạng bài toán này khi chúng ta đã xây dựng được mô đun chương trình con
phân tích số N ra thừa số nguyên tố thì ta cũng có thể phát triển bài toán dạng cao
hơn.
Bài toán 6:

Phân tích thừa số nguyên tố


Cho trước số tự nhiên N. Tìm và in ra tất cả các số tự nhiên từ 2 đến N là tích của
đúng 2 thừa số nguyên tố( có thể trùng nhau).
Dữ liêu: Vào file văn bản PTTS.INP chỉ chứa duy nhất số tự nhiên N
Kết quả: Ghi vào File PTTS.OUT các số tự nhiên là tích của đúng 2 thừa số
nguyên tố.
22


PTTS.INP

PTTS.OUT

20

4 6 9 10 14 15

-Ý tưởng bài toán như sau:
+ Xây dựng hàm nguyên tố của số tự nhiên N.
+ Xây dựng chương trình con hàm kiểm tra số tự nhiên N phân tích thành tích 2
thừa số nguyên tố.
function kt2(x:longint):boolean;
var i,y:longint;
begin
kt2:=false;
for i:=2 to x do
begin
if nt(i) and (x mod i=0) then y:=x div i;
if nt(y) then kt2:=true;
end;
end;

Chương trình cụ thể với bài toán 6:
Program Bailam2;
Const fi='PTTS.INP';
fo='PTTS.OUT';
Var f1,f2:text;
i:longint;
n:byte;
Procedure nhap_dl;
begin
assign(f1,fi); assign(f2,fo);
reset(f1); rewrite(f2);
read(f1,n);
end;
23


Procedure dong_tep;
begin
close(f1); close(f2);
end;
Function nt(m:int64):boolean;
var k:longint;
begin
if(m=2) or (m=3) then begin nt:=true; exit; end;
if (m=1) or (m mod 2=0) or (m mod 3=0) then begin nt:=false; exit; end;
k:=-1;
while k<=trunc(sqrt(m)) do
begin
inc(k,6);
if (m mod k=0) or (m mod (k+2)=0) then break;

end;
if K>trunc(sqrt(m)) then nt:=true else nt:=false;
end;
Function kt2(x:longint):boolean;
var i,y:longint;
begin
kt2:=false;
for i:=2 to x do
begin
if nt(i) and (x mod i=0) then y:=x div i;
if nt(y) then kt2:=true;
end;
end;
Procedure xu_ly;
var i:integer;
begin
for i:=2 to n do
24


if kt2(i) then write(f2,i,' ');
end;
Begin
nhap_dl;
Xu_ly;
dong_tep;
End.
Với dạng bài toán trên độ khó tăng dần khi yêu cầu phân tích một số N ra tích
của 3 thừa số nguyên tố, 4 thừa số nguyên tố,....
- Ý tưởng phân tích số N ra 3 thừa số nguyên tố ta tiến hành xây dựng hàm hàm

như sau:
Duyệt các số i nhận từ 2 đến (N div 2). Nếu (N mod i=0) và i là số nguyên tố thì N
thay đổi giá trị( n:= n div i) , đồng thời biến đếm tăng lên inc(dem);
Ra khỏi vòng lặp nếu dem=3 thì hàm nhận giá trị True.
Lưu ý khi sử dụng vòng lặp nên chọn dạng for lùi khi kiểm tra các phần tử i nhận
từ ( ndiv 2 xuống đến 2)
Chương trình con như sau.
Function kt(x:int64):boolean;
var z,dem,i,y:longint;
begin
kt:=false;
y:=x;
z:=y div 2;
dem:=0;
for i:=z downto 2 do begin
while nt(i) and (x mod i=0) do begin x:=x div i; inc(dem);
if (x=1) and (dem=3) then break; end;
if dem=3 then begin kt:=true; exit; end;
end;
end;

25


×