Chương trình 1:
Tạo ra tệp SNT-BYTE.DAT trên đĩa, gồm các số nguyên tố loại nhỏ kiểu Byte, tức là trong khoảng 0 đến 255.
{Không cần phải uses crt vì chương trình này không dùng đến bàn phím và màn hình}
var f : file of byte;
n : byte;
function LaSNT(n:word):boolean;
var k:word;
begin
if (n=2) or (n=3) then LaSNT:=true
else
if (n mod 2=0) or (n<=1) then LaSNT:=false
else
begin
k:=3;
while (n mod k>0) and (k<=sqrt(n)) do k:=k+2;
if n mod k=0 then LaSNT:=false
else LaSNT:=true
end;
end;
BEGIN
assign(f,'snt-byte.dat');
rewrite(f);
for n:=2 to 255 do
if LaSNT(n) then write(f,n);
close(f);
END.
Chương trình 2.
Xuất ra bảng số nguyên tố nhỏ hơn 255, lấy từ Tệp SNT-BYTE.DAT đã có sẵn trên đĩa, tức là sau khi chạy chương trình 1.
Uses crt;
var f : file of byte;
n : byte;
BEGIN
Clrscr;
assign(f,'snt-byte.dat');
reset(f);
while not(EOF(f)) do {EOF(f) là đầu đọc/ghi đang áp vào dấu hiệu chấm hết tệp}
begin
read(f,n);
write(n,’, ’);
end;
close(f);
END.
Chương trình 1 cải tiến, đề phòng tệp mà mình định tạo ra đã có rồi, thì thận trọng hỏi lại xem có viết đè đi hay không theo ý muốn của người sử dụng:
Uses crt; {Chương trình này không dùng đến bàn phím và màn hình}
var f : file of byte;
n : byte;
Function LaSNT(n:byte):boolean;
---- chép lại như cũ ----
BEGIN
assign(f,'snt-byte.dat');
{$I-}
Reset(f);
If IOResult=0 then {Mã lỗi = 0 tức là mở được tệp, tức là tệp đã tồn tại rồi}
Begin
Writeln(‘Tệp SNT-Byte.dat đã tồn tại. Có tạo mới đè tệp cũ đi không?-(C/K)’);
if readkey in [‘K’,’k’] then exit;
End;
{$I+}
rewrite(f);
for n:=2 to 255 do
if LaSNT(n) then write(f,n);
close(f);
END.
Chương trình 2 cải tiến, đề phòng tệp mà mình định tạo ra không có trên đĩa, do chưa tạo ra hoặc la đã bị xóa hay hỏng do virus phá hỏng, cần báo lỗi và thoát:
Uses crt;
var f : file of byte;
n : byte;
BEGIN
Clrscr;
assign(f,'snt-byte.dat'); {Để thí nghiệm, thay chữ dat bằng chữ txt xem nhé!}
{$I-}
reset(f);
if IOResult<>0 then {Mã lỗi <> 0 tức là tệp có lỗi...’}
begin
Writeln(‘Tệp không mở được. Gõ một phím để thoát!’);
Readkey;
exit;
end;
{$I+}
while not(EOF(f)) do
begin
read(f,n);
write(n,’, ’);
end;
close(f);
END.
Chương trình 3.
Viết ra số nguyên tố thứ k, nhập từ bàn phím. {Để đơn giản không kiểm tra lỗi tệp}
Uses crt;
var f : file of byte;
n : byte;
k : integer; {Khai bao kieu lon hon de de so sanh}
BEGIN
Clrscr;
assign(f,'snt-byte.dat');
reset(f);
Repeat
Write(‘Ban xem số nguyên tố thứ mấy? ‘);
Readln(k); {Neu ta khai bao k kieu byte, ti khi k=257, may se tu cho k=2}
If (k<1) or (k>filesize(f)) then
Begin
Writeln(‘Khong duoc!’);
continue;
end;
Seek(f,k-1);
{STT các phần tử của tệp tính từ 0, nên để đến SNT thứ k phải seek(f,k-1)}
read(f,n);
writeln(‘So nguyen to thu ‘,k,’ la ‘,n);
writeln(‘Co tiep tục khong?-(C/K) ‘);
until (readkey=’K’) or (readkey=’k’);
close(f);
END.
Chương trình 4.
Sử dụng tệp số nguyên tố SNT-BYTE.DAT đã có sẵn trên đĩa để giản ước phân số m/n. {Để đơn giản không kiểm tra lỗi tệp}
Thuật toán:
Như mình đã học số học là: Nếu tử số và mẫu số cùng chia hết cho thừa số nguyên tố thì cùng chia cho thừ số đó. Cứ làm mãi như vậy với một số nguyên tố đến khi không cùng chia hết cho nó nữa thì lại xét đến số nguyên tố tiếp theo. “Cuộc hội ngộ nào rồi cũng đến hồi kết thúc!”. Công việc sẽ dừng khi số nguyên tố mang ra thử lại lớn hơn tử số hoăc mẫu số. Tóm lại thuật toán như sau:
Bước 1. Nhập tử số và mẫu số. Mở tệp SNT-BYTE.DAT ra để đọc dữ liệu từ đầu.
Bước 2. Đọc ra số nguyên tố p. (Chú ý là đọc một cái là đầu đọc tự đọng nhích sang phần tử tiếp).
Bước 3. Chừng nào tử số và mẫu số cùng chia hết cho p thì còn lấy tử số và mẫu số chia cho p.
Bước 4. Nếu tử số và mẫu số còn lớn hơn p thì quay về Bước 2, trái lại hiển hiên là thực hiện bước 5.
Bước 5. Viết đáp số: tử số mới / mẫu số mới và hết nếu không muốn làm tiếp nữa.
Uses crt;
var f : file of byte;
m,n,p : byte;
BEGIN
Clrscr;
assign(f,'snt-byte.dat');
Repeat
Write(‘Nhập tử số và mẫu số = ‘);
Readln(m,n);
reset(f); {Mở để đọc từ đầu tệp}
repeat
read(f,p);
while (m mod p=0) and (n mod p=0) do
begin
m:=m div p;
n:=n div p;
end;
until (m<p) or (n<p);
writeln(‘Dap so: ‘,m,’/‘,n);
writeln(‘Có tiếp tục không?-(C/K) ‘);
until (readkey=’K’) or (readkey=’k’);
close(f);
END.
Chương trình 5.
Sử dụng tệp số nguyên tố SNT-BYTE.DAT đã có sẵn trên đĩa để rút gọn căn bậc hai của m. {Để đơn giản không kiểm tra lỗi tệp}
Thuật toán:
Như mình đã học số học là: Nếu số trong căn chia hết cho bình phương của một số nguyên tố thì có thể đưa ra ngoài căn số nguyên tố đó, để lại trong căn số mới nhỏ đi… . Cứ làm mãi như vậy với một số nguyên tố đến khi không cùng chia hết cho nó nữa thì lại xét đến số nguyên tố tiếp theo. “Cuộc hội ngộ nào rồi cũng đến hồi kết thúc!”. Công việc sẽ dừng khi số nguyên tố mang ra thử lại lớn hơn tử số hoăc mẫu số. Tóm lại thuật toán như sau:
Bước 1. Nhập tử số và mẫu số. Mở tệp SNT-BYTE.DAT ra để đọc dữ liệu từ đầu.
Bước 2. Đọc ra số nguyên tố p. (Chú ý là đọc một cái là đầu đọc tự đọng nhích sang phần tử tiếp).
Bước 3. Chừng nào tử số và mẫu số cùng chia hết cho p thì còn lấy tử số và mẫu số chia cho p.
Bước 4. Nếu tử số và mẫu số còn lớn hơn p thì quay về Bước 2, trái lại hiển hiên là thực hiện bước 5.
Bước 5. Viết đáp số: tử số mới / mẫu số mới và hết nếu không muốn làm tiếp nữa.
Uses crt;
var f : file of byte;
T,N,p : byte; {T là trong, N là ngoài}
BEGIN
Clrscr;
assign(f,'snt-byte.dat');
Repeat
Write(‘Nhập số trong căn = ‘);
Readln(T);
reset(f); {Mở để đọc từ đầu tệp}
repeat
read(f,p);
while (T mod (p*p)=0) do
begin
N:=N*p;
T:=T div (p*p);
end;
until (sqrt(T)<p);
writeln(‘Dap so: ‘,N,#251,n); {#251 là dấu căn}
writeln(‘Có tiếp tục không?-(C/K) ‘);
until (readkey=’K’) or (readkey=’k’);
close(f);
END.
Nhiệm vụ còn lại của bạn là phối hợp các chương trình nêu trên lại thành một chương trình duy nhất nhờ một Thu tục Menu thích hợp. Ngoài ra, bạn phải mở rộng phạm vi của tệp số nguyên tố trên thành SNT-WORD.DAT hay SNT-LONG.DAT để chứa được các số nguyên tố trong khoảng 0..65535 hay 0..2147483647. Đồng thời đưa vào thêm các bài toán mới, chẳng hạn như: Phân tích một số tụ nhiên thành thừa số nguyên tố,…
Sau khi cố gắng bắt máy giải quyết bài toán này, bạn có thể tham khảo mã nguồn của tôi, với cỡ số nguyên tố thuộc kiểu word: SNT.RAR. (Trong này đã chứa cả mã file exe và pas). Nhớ là phải tự mình rèn luyện đã nhé!