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

Bồi dưỡng kỹ năng giải bài tập về số nguyên tố dành cho học sinh lớp 11 trường THPT tĩnh gia 2

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 (182.1 KB, 27 trang )

A. PHẦN MỞ ĐẦU
I. Lí do chọn đề tài.
Hiện nay trong lí luận dạy học nói chung và lí luận dạy học môn tin học
nói riêng đề cập khá nhiều phương pháp và kỹ thuật dạy học: phương pháp thảo
luận, phương pháp đặt câu hỏi, phương pháp chia nhóm …
Các cách thiết kế bài giảng hiện nay nhằm mục đích áp dụng phương
pháp hiện đại để bồi dưỡng cho học sinh năng lực ham muốn học hỏi, tư duy
sáng tạo, năng lực tự giải quyết vấn đề, rèn luyện và phát triển năng lực tự học
sáng tạo, nghiên cứu, nghĩ và làm việc một cách tự chủ… Đồng thời để thích
ứng với sự phát triển tư duy của học sinh trong xã hội mới và tiếp cận với các
công nghệ tiên tiến trong xã hội, trên thế giới. Bên cạnh đó, trong các kỹ thuật
dạy học mới, vai trò của người thầy có sự thay đổi là: “hướng dẫn học sinh biết
tự mình tìm ra hướng giải quyết những vấn đề nảy sinh trong quá trình học tập,
biết cách làm việc độc lập, làm việc tập thể. Thầy là người định hướng, là người
cố vấn giúp học sinh tự đánh giá, cũng như giúp học sinh luôn đi đúng con
đường tìm hiểu, lĩnh hội kiến thức…”.
Xuất phát từ thực tiễn giảng dạy tại trường THPT Tĩnh Gia 2 tôi thấy
rằng, để đạt hiệu quả cao trong mỗi phần học, tiết học cần có cách thiết kế bài
giảng cho phù hợp với nội dung kiến thức; phương pháp, phương tiện dạy học
phải phù hợp với từng đối tượng học sinh. Để qua mỗi phần học, tiết học thì học
sinh thích thú với kiến thức mới, qua đó hiểu được kiến thức đã học trên lớp,
đồng thời học sinh thấy được tầm quan trọng của vấn đề và việc ứng dụng của
kiến thức trước hết để đáp ứng những yêu cầu của môn học, sau đó là việc ứng
dụng của nó vào các công việc thực tiễn trong đời sống xã hội.
Trong thời đại thông tin bùng nổ ngày nay, việc lập được các chương trình
tự hoạt động cho máy tính, máy gia dụng là cần thiết. Và để làm được việc đó
cần có một quá trình nghiên cứu, học tập về ngôn ngữ lập trình lâu dài, qua đó
nhà lập trình có thể chọn một ngôn ngữ lập trình thích hợp. Tuy nhiên mọi thứ
điều có điểm khởi đầu của nó, với học sinh việc học Pascal là khởi đầu cho việc
1



tiếp cận ngôn ngữ lập trình bậc cao, qua đó giúp các em hình dung được sự ra
đời, cấu tạo, hoạt động cũng như lợi ích của các chương trình hoạt động trong
máy tính, các máy tự động…Qua đó giúp các em có thêm một định hướng, một
niềm đam mê về tin học, về nghề nghiệp mà các em chọn sau này. Đồng thời
Pascal là một ngôn ngữ có cấu trúc thể hiện trên 3 yếu tố: Cấu trúc về mặt dữ
liệu, cấu trúc về mặt lệnh, cấu trúc về mặt chương trình.
Trong quá trình dạy đội tuyển học sinh giỏi tỉnh, tôi nhận thấy rằng trong
chương trình phổ thông dạng bài toán về số nguyên tố xuất hiện với tần suất cao.
Ngay từ lớp 10 khi tìm hiểu về thuật toán học sinh đã làm quen về thuật toán số
nguyên tố. Tuy nhiên ở lớp 10 chúng ta chỉ mới tìm hiểu sơ bộ về số nguyên tố.
Khi bồi dưỡng đội tuyển học sinh giỏi giáo viên và học sinh cần đi sâu vào
chuyên đề này ở các dạng bài toán biến hóa khác nhau
Xuất phát từ cơ sở trên tôi đã chọn Đề tài “Bồi dưỡng kĩ năng giải bài tập
về số nguyên tố dành cho học sinh lớp 11 trường Trung học phổ thông Tĩnh Gia
2”
II. Mục đích đề tài
Từ thuật toán cơ bản trong SGK tin học 10 ở bài số 4: “Bài toán và thuật
toán” phát triển sâu về chuyên đề “Bồi dưỡng kĩ năng giải bài tập về số nguyên
tố dành cho học sinh lớp 11 trường Trung học phổ thông Tĩnh Gia 2” trong
giảng dạy học sinh phổ thông và đặc biệt dùng trong bồi dưỡng học sinh giỏi
nhằm hướng dẫn học sinh giải quyết các bài toán về dạng số nguyên tố.
III. Nhiệm vụ đề tài
Phát triển và đi sâu về chuyên đề số nguyên tố thông qua thuật toán cơ
bản trong sách giáo khoa lớp 10 và 11 để giải quyết bài toán: Kiểm tra tính
nguyên tố của số nguyên N.
IV. Đối tượng nghiên cứu.
Học sinh khối 11 và đặc biệt là học sinh tham gia bồi dưỡng học sinh giỏi
trường và tỉnh tại trường THPT Tĩnh Gia 2 .
V. Phương pháp nghiên cứu .

2


- Kết hợp thực tiễn giáo dục ở trường THPT Tĩnh Gia 2 .
- Có tham khảo các tài liệu về ngôn ngữ lập trình Pascal, một số đề thi
HSG trường và tỉnh và tài liệu về sáng kiến kinh nghiệm.
B. NỘI DUNG
I. Thực trạng vấn đề
Tôi là giáo viên thường được nhà trường phân công dạy lớp chọn và đứng
đội tuyển thi học sinh giỏi tỉnh, trong quá trình giảng dạy một thực tế gặp phải
khi giải quyết các bài toán lập trình trên ngôn ngữ pascal với những ví dụ cơ bản
trong sách giáo khoa các em sẽ dễ giải quyết được. Tuy nhiên khi đưa ra các bài
toán với độ phức tạp cao hơn thì học sinh sẽ khó giải quyết. Vấn đề đặt ra ở đây
là từ bài toán toán cơ bản trong sách giáo khoa nếu chúng ta hướng dẫn cho học
sinh giải quyết với nhiều cách giải khác nhau và trên cơ sở các cách giải đó để
vận dụng giải quyết các bài toán phức tạp hơn .
Trải qua quá trình dạy học nhiều năm và bồi dưỡng học sinh giỏi tôi đã
đúc rút được kinh nghiệm khi giải quyết các bài toán phức tạp cần chia nhỏ bài
toán đó ra thành các mô đun, mỗi mô đun là 1 chương trình con giải quyết 1 việc
nào đó, đồng thời biết phân luồng các dạng bài toán tương ứng với các mảng để
học sinh dễ giải quyết.
II. Biện pháp thực hiện
Để giải quyết vấn đề trên tôi thực hiện qua 2 bước chính:
Bước 1: giúp học sinh hiểu rõ nội dung chính về lí thuyết số nguyên tố làm kiến
thức nền tảng để giải các dạng bài tập vận dụng.
Bước 2: giảng dạy giúp học sinh nhận biết, lập trình để giải quyết các dạng bài
tập vận dụng.
Sau đây tôi xin trình bày cách thực hiện các bước trên:
II.1. Nội dung chính về lí thuyết số nguyên tố
Trong tin học lớp 10 học sinh đã làm quen với một số thuật toán trong đó

có thuật toán “ Kiểm tra tính nguyên tố của một số nguyên dương ”

3


Như vậy chúng ta nhận thấy rằng thuật toán về số nguyên tố là một trong
những thuật toán thường gặp trong các bài toán. Nhất là khi bồi dưỡng học sinh
giỏi thì chúng ta lại thấy bài toán số nguyên tố được vận dụng rất nhiều trong
các bài toán khó.
Ý tưởng: Ta nhớ lại định nghĩa: 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ừ định nghĩa đó 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ố.
Chỉ cần chứng minh
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. Từ đó ta có thuật toán sau:
Thuật toán
a, Cách liệt kê
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.

4


Ghi chỳ
Biến i nhận giá trị nguyên thay đổi trong phạm vi từ 2 đến
N + 1 và dùng để kiểm tra N có chia hết cho i hay không



b, S khi
Nhập N

Đúng

N=1?
Sai
Đúng

N<4?
Sai

i 2

Thông báo N
là số nguyên
tố rồi kết
thúc


Đúng

i>?
Sai

i

Sai

i + 1

N chia hết
cho i ?
Đúng

Thông báo N
không là số NT
rồi kết thúc

Mụ phng vớ d thc hin thut toỏn
Vi N = 29 ( 29 = 5)
I

2

3

Vi N = 45 ( 45 = 6 )
4


5

6

I

2

3

N/i

29/2
29/3
29/4
29/5
N/i
45/2
45/3
Khụng Khụng Khụng Khụng
khụng
Chia ht
a) 29 l s nguyờn t
b) 45 khụng l s nguyờn t
Trờn c s thut toỏn tin hnh ci t thut toỏn nh sau:
Vit mụ un chng trỡnh con
Function nt(n: longint): boolean;

5



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;
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ố.
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)
Ta có mô đun chương trình con như sau
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 mod k =0) or (n mod (k+2) = 0) then break;

until k>m;
if k>m then nt:=true else nt:=false;
end;
6


Áp dụng chương trình con để giải quyết các dạng bài toán về số nguyên tố
II.2. Một số dạng bài toán về số nguyên tố
Dạng 1: Liệt kê các số nguyên tố trong đoạn từ [2,N] .
Cụ thể:
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ừ tệp nguyento.inp số nguyên N
Kết quả: Ghi ra tệp nguyento.out chứa các số nguyên tố, mỗi số cách nhau 1 kí
tự cách. Ghi trên cùng 1 dòng.
Ý tưởng bài toán này như sau:
-Xây dựng hàm kiểm tra số tính nguyên tố số nguyên N .
- Xây dựng chương trình con liệt kê các số nguyên tố trong đoạn từ 2 đế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, ‘ ‘);
Chương trình hoàn thiện như sau
const fi='nguyento.inp';
fo='nguyento.out';
var n,m, i:longint;
f1,f2:text;
procedure doctep;
begin
assign(f1,fi);

reset(f1);
read(f1,n);
assign(f2,fo);
rewrite(f2);
end;
7


function nt(n:longint):boolean;
var k, M:longint;
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;
procedure xulytep;
begin
for i:=2 to n do if nt(i) then write(f2,i,' ');
end;
procedure dongtep;
begin
close(f1);
close(f2);
end;
begin
doctep;
xulytep;

dongtep;
end.
Đây là một trong những dạng bài tập về số nguyên tố đơn thuần tuy nhiên khi
dữ liệu lớn, ta cần giải quyết bài toán này với mô đun chương trình con về số
nguyên tố ở thuật toán thứ 2 là dựa vào tính chất của số nguyên tố.
Cũng là ý tưởng như trên nhưng ở đây xây dựng hàm nguyên tô nt(N) dựa vào
tính chất của nó thì chương trình sẽ chạy nhanh hơn rất nhiều.
8


Ta có chương trình hoàn thiện như sau:
const fi='nguyento.inp';
fo='nguyento.out';
var n,m, i:longint;
f1,f2:text;
procedure doctep;
begin
assign(f1,fi);
reset(f1);
read(f1,n);
assign(f2,fo);
rewrite(f2);
end;
function nt(n:longint):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 xulytep;
begin
for i:=2 to n do if nt(i) then write(f2,i,' ');
9


end;
procedure dongtep;
begin
close(f1);
close(f2);
end;
begin
doctep;
xulytep;
dongtep;
end.
Dạng thứ 2: Số siêu nguyên tố.
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ố.
Bài toán 2:Hãy viết chương trình đọc dữ liệu vào là một số nguyên N (0và đưa ra kết quả các số siêu nguyên tố có N chữ số và số lượng của chúng.

Vào file SNT.INP chứa duy nhất chỉ số nguyên N
Kết quả: Ghi ra file SNT.OUT
- ghi các số siêu nguyên tố
- Số lượng các số siêu nguyên tố.
SNT.INP
5

SNT.OUT
23333 23339

23399 23993 29399

31193 31379
37337 37339 37397 59393 59399
71933 73331 73939
Co 15 so sieu nguyen to co 5 chu so

10


Ý tưởng của bài toán như sau:
- Xây dựng hàm kiểm tra so nguyên N có là số nguyên tố hay không
- Xây dưng hàm kiểm tra số i có phải là số siêu nguyên tố hay không
Ý tưởng như sau:
Lại một lần nữa sử dụng lời gọi hàm nt(i) trong chương trình con
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;
Chương trình con 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;
- Xây dựng chương trình con thủ tục đưa ra các số siêu nguyên tố và ghi vào tệp
đồng thời ứng với mỗi số là siêu nguyên tố thì đếm .
- Ý Tưởng
+ 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
11


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;
Thể hiện chương trình con sau
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 hoàn thiện cho bài toán :
const fi='nguyento.inp';
fo='nguyento.out';
var

n,m, i:longint;
f1,f2:text;

procedure doctep;
12



begin
assign(f1,fi);
reset(f1);
read(f1,n);
assign(f2,fo);
rewrite(f2);
end;
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 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;
13



snt:=true;
end;
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;
procedure dongtep;
begin
close(f1);
close(f2);
end;
begin

doctep;
xulytep;
dongtep;
end.
14


Dạng 3: Tính chất của dãy số
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
12
Ý tưởng bài toán:

DAYSO.OUT
12 11 7 6 5 4 3 2 1

- Xây dựng một 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 ghitep;
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 toán này chúng ta nghĩ ngay đến hàm nguyên tố
Chương trình hoàn thiện như sau:
const fi='DAYSO.INP';
fo='DAYSO.OUT';
var f1,f2:text;
a:array[1..10000] of longint;

15


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: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 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 ghitep;
begin
write(f2,n,' ');
for j:=n-1 downto 1 do
if (N mod j =0) or (nt(j)) then write(f2,j,' ');
16


end;
procedure dongtep;
begin
close(f1);
close(f2);
end;
begin
doctep;
ghitep;
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ố (số nguyên tố là số chỉ có đúng 2 ước số là 1 và
chính nó)

Hãy tìm độ dài của dãy con tăng nguyên tố dài nhất
Dữ liệu nhập: vào từ file 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)
- Các 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 DAYCON.OUT

- Số đầu tiên là số M tức phần tử của dãy con tăng nguyên tố dài nhất
- M dòng sau ghi ra giá trị các phần tử của dãy con tăng dài nhất
DAYCON.inp

DAYCON.out
17


13

4

3 13 6 8 7

3 7 11 13

12 9 5
11 6 3 13
15
Ý 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.
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;
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;
18


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],' '); i:=c[i];
end;
end;
procedure thaotac;
19


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.
Dạng 4: Phân tích 1 số ra tích hoặc tổng các số nguyên tố.

Bài toán 5: 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 PTNT.INP chỉ chứa một số duy nhất N
Kết quả: Ghi vào file 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,'*'). Mô đun chương trình như sau
procedure thua_sont(n:integer);
var m:integer;
begin

20


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 hoàn thiện
const fi='PTNT.INP';
fo='PTNT.OUT';
var

f1,f2:text;
i,j,n:integer;

procedure doc_tep;
begin
assign(f1,fi);
assign(f2,fo);
reset (f1);
rewrite(f2);
readln(f1,n);
end;
procedure thua_sont(n:integer);
var

m:integer;

begin
m:=trunc(sqrt(n));
21



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: 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 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
20
-Ý tưởng bài toán như sau:

PTTS.OUT
4 6 9 10 14 15

+ Xây dựng hàm kiểm tra tính 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 hoàn thiện
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:longint):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;
24


begin
for i:=2 to n do
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ừ ( n div 2 xuống đến 2)
Mô đun chương trình con như sau.
function kt(x:longint):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;
25


×