program HSG1;
// Hàm kiểm tra một số có phải là số nguyên tố hay không
function LaSoNguyenTo(n: integer): boolean;
var
i: integer;
begin
if n < 2 then
LaSoNguyenTo := false
else
begin
LaSoNguyenTo := true;
for i := 2 to trunc(sqrt(n)) do
begin
if n mod i = 0 then
begin
LaSoNguyenTo := false;
break;
end;
end;
end;
end;
// Hàm kiểm tra một số có phải là số đối xứng hay không
function LaSoDoiXung(n: integer): boolean;
var
reverse, temp, original: integer;
begin
original := n;
reverse := 0;
while n > 0 do
begin
temp := n mod 10;
reverse := reverse * 10 + temp;
n := n div 10;
end;
LaSoDoiXung := original = reverse;
end;
// Hàm tính ước chung lớn nhất của hai số
function UCLN(a, b: integer): integer;
var
temp: integer;
begin
while b <> 0 do
begin
temp := a mod b;
a := b;
b := temp;
end;
UCLN := a;
end;
// Hàm tính bội chung nhỏ nhất của hai số
function BCNN(a, b: integer): integer;
begin
BCNN := (a * b) div UCLN(a, b);
end;
// Hàm chính
var
p, q, N, i, count: integer;
thuong: real;
begin
// Nhập vào các số nguyên dương p, q, N
write('Nhap vao so nguyen duong p: ');
readln(p);
write('Nhap vao so nguyen duong q: ');
readln(q);
write('Nhap vao so nguyen duong N: ');
readln(N);
// Tính và in ra ước chung lớn nhất và bội chung nhỏ nhất của p và q
writeln('Uoc chung lon nhat cua ', p, ' va ', q, ' la: ', UCLN(p, q));
writeln('Boi chung nho nhat cua ', p, ' va ', q, ' la: ', BCNN(p, q));
// Tính và đếm số lượng các số nguyên tố và đối xứng trong đoạn [p, q]
count := 0;
for i := p to q do
begin
if LaSoNguyenTo(i) and LaSoDoiXung(i) then
count := count + 1;
end;
writeln('So luong so nguyen to va doi xung trong doan [', p, ', ', q, '] la: ', count);
// Tính và in ra chữ số thứ N trong phần thập phân của thương số khi chia p cho q
thuong := p / q;
writeln('Chu so thu ', N, ' trong phan thap phan cua thuong p/q la: ', trunc(thuong * power(10, N)) mod 10);
end.