Tải bản đầy đủ (.pdf) (74 trang)

MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8

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 (804.77 KB, 74 trang )

MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8
I. Bài tập về số chính phương (biến đơn):
1. Cho số nguyên n, kiểm tra n có phải là số chính phương không?
a. Ý tưởng: Dựa trên định nghĩa số chính phương: là bình phương của một số
tự nhiên.
- Ta có:
0 = 0.0,

,

,

,

,

- Nhận xét: Số chính phương là số có phần thập phân của căn bậc 2 là 0.
- Như vậy, để viết chương trình ta sử dụng hàm sqrt() để lấy căn bậc 2,
hàm frac () để lấy phần thập phân.
b. Chương trình tham khảo:
Program CP;
Var n:longint;
Begin
Write (‘nhap n:’);
Readln (n);
If (frac(sqrt(n))=0) and (n>=0) then write (n, ‘la so CP’) else write
(n, ‘ko la so CP’);
Readldn
End.
2. In ra số chính phương nhỏ hơn 100.
a. Ý tưởng:


Để kiểm tra lần lượt các số chính phương nhỏ hơn 100 thì ta sẽ kiểm tra lần
lượt các số từ 0 đến 99 có phải là số chính phương không, bằng câu lệnh for
… to … do
b. Chương trình tham khảo:
Program CP;
Var i:longint;
Begin
For i:=0 to 99 do
If frac(sqrt(i))=0 then write (i,’ ‘);
Readldn


End.
3. Nhập vào số nguyên n. In ra số chính phương nhỏ hơn n.
a. Ý tưởng:
- Để tìm các số chính phương nhỏ hơn n thì chúng ta sẽ kiểm tra lần lượt
các số từ 0 đến n có phải là số chính phương không, bằng câu lệnh for …
to … do.
b. Chương trình tham khảo:
Program CP;
Var i:longint;
Begin
For i:= 0 to n do
If frac(sqrt(i))=0 then write (i);
Readldn
End.
4. In ra số chính phương có hai chữ số.
a. Ý tưởng:
Để kiểm tra lần lượt các số chính phương có hai chữ số thì chúng ta sẽ kiểm tra
lần lượt các số từ 10 đến 99 có phải là số chính phương không, bằng câu lệnh

for … to … do
b. Chương trình tham khảo:
Program CP;
Var i:longint;
Begin
For i:=10 to 100 do
If frac(sqrt(i))=0 then write (i, ‘ ‘);
Readldn
End.
5. In ra số chính phương là số chẵn nhỏ hơn 100.
a. Ý tưởng:
- Ví dụ: 4,16,36,….
- Để giải bài toán ta cần xác định 2 điều kiện phù hợp với 2 thuật toán:
+ thuật toán số chính phương


+ Kiểm tra số chính phương có phải là số chẵn không. Nếu là số chẵn thì
in ra.
- Để tìm các số chính phương nhỏ hơn 100 thì chúng ta sẽ kiểm tra lần lượt
các số từ 0 đến 99 có phải là số chính phương không, bằng câu lệnh for
… to … do.
- Kiểm tra số chính phương là số chẵn bằng cách kiểm tra số đó có chia hết
cho 2 không. Nếu số đó chia hết cho 2 là số chính phương chẵn, in ra.
b. Chương trình tham khảo:
Program CP;
Var i:longint;
Begin
For i:= 0 to 99 do
If (frac(sqrt(i))=0) and (i mod 2 =0 ) then write (i,’ ‘);
Readldn

End.
6. Nhập vào 2 số nguyên a,b (akhoảng a,b.
a. Ý tưởng:
- Lấy ví dụ: nhập a= 10, b = 49
KQ: 16,25,36,49
- Để kiểm tra lần lượt các số chính phương nằm trong khoảng a,b thì chúng
ta sẽ kiểm tra lần lượt các số từ a+1 đến b-1 có phải là số chính phương
không, bằng câu lệnh for … to … do. Với a,b nhập vào từ bàn phím.
b. Chương trình tham khảo:
Program CP;
Var I,n:longint;
Begin
Write (‘nhap a,b: ‘);
Readln (a,b);
For i:=a+1 to b-1 do
If frac(sqrt(i))=0 then write (i);
Readldn
End.


7. Nhập vào số nguyên n, in ra số chính phương lớn nhất, nhỏ hơn n.
a. Ý tưởng:
- Lấy ví dụ:
Nhập n = 60
KQ: 49
- Nếu n-1 <0 thì không có số chính phương lớn nhất, nhỏ hơn n. Ngược lại,
kiểm tra từ n-1, n-2, n-3,…. đến khi nào gặp số chính phương thì dừng,
sau đó in ra kết quả.
- Vì số vòng lặp không xác định được bao nhiêu lần nên ta sử dụng vòng

lặp không xác định repeat … until … (hoặc while … do).
b. Chương trình tham khảo:
Program CP;
Var i,n:longint;
Begin
Write (‘nhap n‘);
Readln (n);
If n – 1 <0 then write (‘khong co’) else
Repeat
n:=n-1;
until frac(sqrt(n))=0;
write (n);
Readldn
End.
8. Nhập vào số nguyên n, in ra số chính phương nhỏ nhất, lớn hơn n.
a. Ý tưởng:
- Lấy ví dụ:
Nhập n = 80
- Kiểm tra từ n+1, n+2, n+3,…. đến khi nào gặp số chính phương thì dừng,
sau đó in ra kết quả.
- Vì số vòng lặp không xác định được bao nhiêu lần nên ta sử dụng vòng
lặp không xác định repeat … until … (hoặc while … do).


b. Chương trình tham khảo:
Program CP;
Var i,n:longint;
Begin
Write (‘nhap n‘);
Readln (n);

Repeat n:=n+1
until frac(sqrt(n))=0;
write (n);
Readldn
End
9. Nhập số nguyên n, in ra 3 số chính phương liên tiếp lớn hơn hoặc bằng
n.
a. Ý tưởng:
- Lấy ví dụ: n = 10 => 16, 25, 36
- Kiểm tra từ n, n+1, n+2,… có phải số chính phương không, nếu là số
chính phương thì cộng vào biến đếm lần lượt 1 đơn vị, đến khi biến đếm
bằng 3 thì dừng và in kết quả.
- Vì số vòng lặp không xác định được bao nhiêu lần nên ta sử dụng vòng
lặp không xác định repeat … until … (hoặc while … do).
b. Chương trình tham khảo:
Program CP;
Var n,dem:longint;
Begin
Dem:=0;
Write (‘nhap n‘);
Readln (n);
If frac(sqrt(n)) = 0 then
Begin
dem:=dem+1;
Write (n,’ ‘);
End;
Repeat
n:=n+1;
If frac(sqrt(n)) = 0 then
Begin

dem:=dem+1;
Write (n,’ ‘);
End;
until dem=3;


Readldn
End.
II. Bài tập về mảng 1 chiều
1. Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử. In ra các
phần tử chính phương.
a. Ý tưởng:
- Lấy ví dụ:
2 3 4 5 6 => 4
1 2 3 4 5 => 1 4
1 3 4 5 1 => 1 4 1
1 1 1 1 1 => 1 1 1 1 1
3 3 3 3 3 => khong co phan tu la so chinh phương
3 5 6 7 8 => khong co phan tu la so chinh phuong
- Nhập 1 dãy số nguyên a gồm n phần tử.
- Kiểm tra các phần tử của dãy a. Nếu phần tử nào là số chính phương thì
in phần tử đó ra.
b. Chương trình tham khảo:
Var a:array[1..50] of longint;
Dem,n,i: longint;
Begin
Read (n);
For i:=1 to n do
Read(a[i],’ ‘);
Dem:=0;

For i:=1 to n do
If frac(sqrt(a[i]))=0 then
begin
write (a[i],’ ‘); dem:=dem+1;
end;
if dem=0 then write (‘khong co phan tu la so chinh phuong’);
Readln.
End.


2. Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử. In ra vị
trí các phần tử là số chính phương.
a. Ý tưởng:
- Lấy ví dụ:
3 4 5 7 9 => 2 và 5
5 2 3 4 5 => 4
2 3 4 5 4 => 3 5
4 4 4 4 4 => 1 2 3 4 5
3 3 3 3 3 => khong co phan tu la so chính phương
3 5 7 3 5 => khong co phan tu la so chinh phuong
- Nhập 1 dãy số nguyên a gồm n phần tử.
- Kiểm tra các phần tử của dãy a. Nếu phần tử nào là số chính phương thì
in ra vị trí của phần tử đó.
b. Chương trình tham khảo:
Var a:array[1..50] of longint;
Dem,n,i: longint;
Begin
Read (n);
Write (‘nhap mang a: ‘);
For i:=1 to n do

Read(a[i],’ ‘);
Dem:=0;
For i:=1 to n do
If frac(sqrt(i)) = 0 then
Begin
write (i,’ ‘); dem :=dem+1;
end;
if dem = 0 then write (‘ko co phan tu la so chinh phuong’);
Readln.
End.
3. Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử. In ra các
phần tử là số chính phương và vị trí của nó.
a. Ý tưởng:


- Lấy ví dụ:
- 3 4 5 7 9 => 4 vi tri 2, 9 vi tri 5
- 5 2 3 4 5 => 4 vi tri 4
- 2 3 4 5 4 => 4 vi tri 3, 4 vi tri 5
- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri 4, 4 vi tri 5
- 3 3 3 3 3 => khong co phan tu la so chính phương
- 3 5 7 3 5 => khong co phan tu la so chinh phuong
- Nhập 1 dãy số nguyên a gồm n phần tử.
- Kiểm tra các phần tử của dãy a. Nếu phần tử nào là số chính phương thì
in phần tử đó và vị trí của nó.
b. Chương trình tham khảo:
Var a:array[1..50] of longint;
Dem,n,i: longint;
Begin
Read (n);

For i:=1 to n do
Read(a[i],’ ‘);
Dem:=0;
For i:=1 to n do
If frac(sqrt(i)) = 0 then
Begin
writeln (a[i],’vi tri ‘,i); dem:=dem+1;
end;
if dem = 0 then write (‘khong co phan tu la so chinh phuong);
Readln.
End.
4. Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử. In ra
phần tử chính phương lớn nhất trong dãy.
a. Ý tưởng:
- Lấy ví dụ:
2 3 7 5 9 => 9
2 1 4 5 9 => 9
4 4 4 4 => 4


3 5 6 7 => khong co so chinh phuong
- Tìm kiếm số chính phương
- So sánh từng phần tử là số chính phương trong mảng, tìm ra số lớn nhất.
bằng cách lấy phần tử max là 0, so sánh max với các phần tử chính
phương còn lại, phần tử nào lớn hơn max thì gán max là phần tử đó. In
kết quả là max.
b. Chương trình tham khảo:
Var a:array [1..50] of longint;
Max,i,n:longint;
Begin

Read (n);
For i := 1 to n do read (n);
Max:=0;
For i:=1 to n do
If frac(sqrt(a[i]))=0 and (a[i] > max) then max:=a[i];
If frac(sqrt(max)) = 0 then Write (max);
Readln.
End.
5. Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử. In ra
phần tử là số chính phương nhỏ nhất trong dãy.
a. Ý tưởng:
- Lấy ví dụ:
2 4 7 5 7 => 4
2 1 4 5 9 => 1
4 4 4 4 => 4
3 5 6 7 => khong co so chinh phuong
- So sánh từng phần tử trong mảng, tìm ra phần tử nhỏ nhất. bằng cách lấy
phần tử thứ nhất là min, so sánh min với các phần tử còn lại, phần tử nào


nhỏ hơn min thì gán min là phần tử đó. Kiểm tra min là số chính phương
thì in kết quả là min.
b. Chương trình tham khảo:
Var a:array [1..50] of longint;
Min,i,n:longint;
Begin
Read (n);
For i := 1 to n do read (n);
Min:=a[1];
For i:=1 to n do

If frac(sqrt(a[i]))=0 and (a[i] < min) then min:=a[i];
If frac(sqrt(min)) = 0 then Write (min);
Readln.
End.
6. Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử. In ra
phần tử là số chính phương lớn nhất trong dãy và vị trí của nó.
a. Ý tưởng:
- Lấy ví dụ:
2 3 7 5 9 => 9 vi tri 5
2 1 4 5 9 => 9 vi tri 5
4 4 4 4 => 4
3 5 6 7 => khong co so chinh phuong
- Tìm kiếm số chính phương
- So sánh từng phần tử là số chính phương trong mảng, tìm ra số lớn nhất.
bằng cách lấy phần tử max là 0, so sánh max với các phần tử chính
phương còn lại, phần tử nào lớn hơn max thì gán max là phần tử đó. In
kết quả là max và vị trí.
b. Chương trình tham khảo:


Var a:array [1..50] of longint;
Max,i,n:longint;
Begin
Read (n);
For i := 1 to n do read (a[i]);
Max:=0;
For i:=1 to n do
If frac(sqrt(a[i]))=0 and (a[i] > max) then max:=a[i];
For i:=1 to n
If (a[i] = max) and (frac(sqrt(max)) = 0) then

Write (max,’ ‘, ‘vi tri’,’ ‘,i);
Readln.
End.
7. Nhập vào mảng a gồm n phần tử, in ra phần tử là số chính phương xuất hiện
nhiều nhất trong mảng.
Chương trình tham khảo:
var a:array [1..50] of longint;
n,i,j,max,dem:longint;
begin
read (n);
for i:=1 to n do read (a[i]);
max := 0;
for i:=1 to n do
if frac(sqrt(a[i])) = 0 then
begin
dem :=0;
for j:= i to n do
if a[i] = a[j] then dem:=dem+1;


if dem > max then max:= dem;
end;
if max = 0 then write ('khong co ptu xh nhieu nhat')
else
for i:=1 to n do
if frac(sqrt(a[i])) = 0 then
begin
dem:=0;
for j:=i to n do
if a[i] = a[j] then dem:=dem+1;

if dem > max then max:=dem;
if dem = max then begin
writeln (max); write (a[i],' ');
end; end;
Readln;
Readln;
End.
8. Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử. Sắp xếp
mảng theo thứ tự tăng dần.
a. Ý tưởng:
- Lấy ví dụ: 93742 => 2 3 4 7 9
74833 => 3 3 4 7 8
11111 => 1 1 1 1 1
00000 => 0 0 0 0 0
b. Chương trình tham khảo:
Var a:array [1..50] of longint;
Max,i,n,tg:longint;
Begin
Read (n);


For i := 1 to n do read (a[i]);
For i:=i to n-1 do
Begin
For j:=i+1 to n do
If a[j] < a[i] then
begin
tg:=a[i]; a[i]:=a[j]; a[j] :=tg;
end;
for i:=1 to n do

write (a[i],’ ‘);
Readln.
End.
9. Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử. Sắp xếp
các số chính phương theo thứ tự tăng dần, các số còn lại vẫn giữ nguyên
vị trí.
a. Ý tưởng:
- Lấy ví dụ:
2 1 9 7 3 4 => 2 1 4 7 3 9
1 1 1 1 1 1 => 1 1 1 1 1 1
0 0 0 0 0 0 => 0 0 0 0 0 0
1 2 3 4 5 6 => 1 2 3 4 5 6
9 1 4 16 4 1 => 1 1 4 4 9 16
- Tìm các phần tử là số chính phương, so sánh chúng với nhau. Đổi chỗ để
được trật tự đúng.
b. Chương trình tham khảo:
Var a:array [1..50] of longint;
J,i,n,tg:longint;
Begin
Read (n);
For i := 1 to n do read (a[i]);
For i:=1 to n-1 do
Begin
If frac(sqrt(a[i])) = 0 then


For j:=i+1 to n do
If a[j] < a[i] then
begin
tg:=a[i]; a[i]:=a[j]; a[j] :=tg;

end;
end;
for i:=1 to n do
write (a[i],’ ‘);
Readln.
End.
10.Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử. Sắp xếp
mảng theo thứ tự tăng dần số chính phương 1 hàng, các số còn lại 1
hàng.
a. Ý tưởng:
- Lấy ví dụ:
2 1 9 7 3 4 => 1 4 9___ 2 3 7
1 1 1 1 1 1 => 1 1 1 1 1 1
0 0 0 0 0 0 => 0 0 0 0 0 0
1 2 3 4 5 6 => 1 4 ___ 2 3 5 6
9 1 4 16 4 1 => 1 1 4 4 9 16
- Sắp xếp các phần tử của dãy theo thứ tự tăng dần, in lần lượtcác phần tử
là số chính phương và các phần tử còn lại
b. Chương trình tham khảo:
Var a:array [1..50] of longint;
Max,i,n,tg:longint;
Begin
Read (n);
For i := 1 to n do read (a[i]);
For i:=1 to n-1 do
For j:=i+1 to n do
If a[j] < a[i] then
begin
tg:=a[i]; a[i]:=a[j]; a[j] :=tg;



end;
for i:=1 to n do if frac(sqrt(a[i])) = 0 then write (a[i],’ ‘);
writeln;
for i:=1 to n do if frac(sqrt(a[i])) <> 0 then write (a[i],’ ‘);
Readln.
End.
11.Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử. Chèn số k
vào vị trí đầu dãy.
a. Ý tưởng:
- Lấy ví dụ:
2 3 4 5 6 7 => 9 2 3 4 5 6 7
- Đưa các phần tử trong mảng a lui về sau 1 đơn vị, sau đó chèn số k vào vị
trí đầu tiên của dãy.
- In kết quả.
b. Chương trình tham khảo:
Var a:array[1..50] of longint;
I,n,k: longint;
Begin
Read (n);read (k);
For i:=1 to n do read (a[i]);
For i:=n+1 downto 2 do
A[i]:=a[i-1];
A[1]:=k;
For i:=1 to n+1 do
Write (a[i], ‘ ‘);
Readln;
Readln;
End.
12.Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử. Chèn số k

vào vị trí cuối cùng của dãy.
a. Ý tưởng:
- Lấy ví dụ:


2 3 4 5 6 7 => 2 3 4 5 6 7 9
- Giữ nguyên các phần tử của dãy, sau đó chèn số k vào vị trí cuối cùng của
dãy. In kết quả.
b. Chương trình tham khảo:
Var a:array[1..50] of longint;
I,n: longint;
Begin
Read (n); read (k);
For i:=1 to n do read (a[i]);
For i:=1 to n+1 do a[n+1]:=k;
For i:=1 to n+1 do write (a[i], ‘ ‘);
Readln;
Readln;
End.
13.Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử. kiểm tra
số k, nếu số k là số chính phương thì chèn số k vào vị trí đầu dãy, ngược
lại thì chèn vào cuối dãy.
a. Ý tưởng:
- Lấy ví dụ:
3 3 4 5 6 7 => 9 2 3 4 5 6 7
4 6 3 7 8 1 => 4 6 3 7 8 1 5
- Kiểm tra số k có phải là số chính phương không,
- nếu số k là số chính phương thì chèn số k vào vị trí đầu dãy, ngược lại thì
chèn vào cuối dãy.
- In kết quả.

b. Chương trình tham khảo:
Var a:array[1..50] of longint;
I,n,k: longint;
Begin
Read (n);read (k);
For i:=1 to n do read (a[i]);
If frac(sqrt(k)) = 0 then


begin
For i:=n+1 downto 2 do
A[i]:=a[i-1];
A[1]:=k;
End;
If frac(sqrt(k)) <> 0 then
begin
For i:=1 to n+1 do
A[n+1]:=k;
End;
For i:=1 to n+1 do
Write (a[i], ‘ ‘);
Readln;
Readln;
End.
14.Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử và số
nguyên k, thay thế tất cả các số chính phương trong dãy bằng số k.
a. Ý tưởng:
- Lấy ví dụ: k = 0
3 4 5 6 7 => 3 0 5 6 7
4 5 6 7 9 => 0 5 6 7 0

2 3 5 7 8 => 2 3 5 7 8
- Tìm lần lượt các phần tử là số chính phương của dãy, rồi thay thế bằng số
nguyên k.
- In kết quả.
b. Chương trình tham khảo:
Var a:array[1..50] of longint;
I,n,k: longint;
Begin
Read (n);read (k);
For i:=1 to n do read (a[i]);
For i:=1 to n do
If frac(sqrt(a[i])) = 0 then a[i]:=k;
For i:=1 to n do
Write (a[i], ‘ ‘);


Readln;
Readln;
End.
15.Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử và số
nguyên k, thay thế số chính phương lớn nhất trong dãy bằng số k.
a. Ý tưởng:
- Lấy ví dụ: k=0
2 3 7 5 9 => 2 3 7 5 0
4 4 9 4 4=> 4 4 0 4 4
4 4 4 4 => 0 0 0 0
3 5 6 7 => 3 5 6 7
- Tìm kiếm số chính phương lớn nhất
- Thay thế số chính phương lớn nhất bằng số nguyên k
b. Chương trình tham khảo:

Var a:array [1..50] of longint;
Min,i,n,k:longint;
Begin
Read (n); read (k);
For i := 1 to n do read (a[i]);
Min:=a[1];
For i:=1 to n do
If (frac(sqrt(a[i]))=0) and (a[i] < min) then min:=a[i];
If frac(sqrt(min)) = 0 then
For i:=1 to n do if a[i] = min then a[i]:=k;
For i:=1 to n do
Write (a[i],’ ‘);
Readln.
End.


16.Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử và số
nguyên k, thay thế số chính phương lớn nhỏ nhất trong dãy bằng số k.
a. Ý tưởng:
- Lấy ví dụ: k=0
2 3 7 5 9 => 2 3 7 5 0
4 4 9 4 4=> 0 0 9 0 0
4 4 4 4 => 4 4 4 4
3 5 6 7 => 3 5 6 7
- Tìm kiếm số chính phương nhỏ nhất
- Thay thế số chính phương nhỏ nhất bằng số nguyên k
b. Chương trình tham khảo:
var a:array [1..50] of longint;
min,i,n,k,dem:longint;
begin

read (n); read (k);
for i:=1 to n do read (a[i]);
min := a[1]; dem:=0;
for i:=1 to n do
if (frac(sqrt(a[i])) = 0) and (a[i] <= min) then
begin
min :=a[i];
dem:=dem+1;
end;
if dem=n then write ('khong co cp min') else
for i:=1 to n do
if a[i] = min then a[i]:=k;
if frac(sqrt(min)) = 0 then
for i:=1 to n do if dem <> n then


write (a[i],' ');
readln;
readln;
end.
17. Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử và số
nguyên k, thay thế số chính phương xuất hiện nhiều nhất trong dãy
bằng số k.
a. Ý tưởng:
- Lấy ví dụ: k=0
2 1 1 1 9 9 => 2 0 0 0 9 9
2 2 1 1 4 4 => 2 2 0 0 0 0
1 1 1 1 1 1 => 0 0 0 0 0 0
- Đếm số phần tử chính phương xuất hiện nhiều nhất.
- Thay thế các phần tử đó bằng số k.

b. Chương trình tham khảo:
var a:array [1..50] of longint;
n,i,j,max,dem,k,z:longint;
begin
read (n);
read (k);
for i:=1 to n do read (a[i]);
max := 0;
for i:=1 to n do
if frac(sqrt(a[i])) = 0 then
begin
dem :=0;
for j:= i to n do
if a[i] = a[j] then dem:=dem+1;


if dem > max then max:= dem;
end;
if max = 1 then write ('khong co ptu xh nhieu nhat')
else
for i:=1 to n do
if frac(sqrt(a[i])) = 0 then
begin
dem:=0;
for j:=i to n do
if a[i] = a[j] then dem:=dem+1;
if dem > max then max:=dem;
if dem = max then
begin
writeln (max); writeln (a[i],' '); z:=a[i];

end;
for i:=1 to n do if a[i] = z then
a[i]:=k;
for i:=1 to n do write (a[i],' ');
Readln;
Readln;
End.
III.

Bài tập về số hoàn hảo:

1. Nhập vào số nguyên n, tìm ước của n.
a. Ý tưởng:
- Lấy ví dụ: 6 có ước là 1,2,3,6
12 có ước là 1,2,3,4,6,12
Nhận xét: ước của n là n chia hết cho ước.


b. Chương trình tham khảo:
Program timuoc;
Var i,n:longint;
Begin
For i:=1 to n do
If n mod i = 0 then write (i);
Readln;
End.
2. Nhập vào số nguyên n, tìm tổng các ước của n.
a. Ý tưởng:
- Lấy ví dụ: 6 có ước là 1,2,3,6. Tổng = 12
12 có ước là 1,2,3,4,6,12. Tổng = 28

Nhận xét: Để tìm tổng các ước thì đầu tiên ta sẽ tìm ước của số đó rồi tính
tổng các ước.
b. Chương trình tham khảo:
Program timuoc;
Var i,n,tong:longint;
Begin
Readln (n);
Tong:=0;
For i:=1 to n do
If n mod i = 0 then tong:=tong+i;
Write (tong);
Readln;
End.
3. Nhập vào số nguyên n, tìm tổng các ước thực sự của n.
a. Ý tưởng:
- Lấy ví dụ: 6 có ước thực sự là 1,2,3.
Nhận xét: ước thực sự của n là n chia hết cho ước, không có n.
b. Chương trình tham khảo:
Program timuoc;
Var i,n,tong:longint;
Begin


Readln (n);
Tong:=0;
For i:=1 to n-1 do
If n mod i = 0 then write (i);
Readln;
End.
4. Nhập vào số nguyên n, kiểm tra n có phải là số hoàn hảo không?

a. Ý tưởng:
- Lấy ví dụ: 6 = 1+2+3
Nhận xét: số hoàn hảo là số có tổng các ước thực sự bằng chính nó.
- Để kiểm tra n có phải là số hoàn hảo không? Ta sẽ tìm ước thực sự của n
rồi cộng các ước thực sự lại, nếu tổng các ước thực sự bằng n thì n là số
hoàn hảo.
b. Chương trình tham khảo:
Program sohoanhao;
Var i,n,tong:longint;
Begin
Readln (n);
Tong:=0;
For i:=1 to n-1 do
If n mod i = 0 then tong:=tong+i;
If tong=n then write (n, ‘la so hoan hao’);
Readln;
End.
5. In ra số hoàn hảo nhỏ hơn 100.
a. Ý tưởng:
- số hoàn hảo là số có tổng các ước thực sự bằng chính nó.
- Vì tìm số hoàn hảo nhỏ hơn 100 nên ta sẽ sử dụng vòng lặp xác định for
…to … do đi từ 1 đến 100.
- Kiểm tra các số trong khoảng từ 1 đến 100 có số hoàn hảo không, nếu số
nào là số hoàn hảo thì in ra.
b. Chương trình tham khảo:
Program sohoanhao;


Var i,j,tong:longint;
Begin

For i:=1 to 100 do
begin
Tong:=0;
For j:=1 to i-1 do
If n mod i = 0 then tong:=tong+j;
If tong=i then write (i);
Readln;
End.
 6, 28
6. In ra số hoàn hảo có hai chữ số.
a. Ý tưởng:
- số hoàn hảo là số có tổng các ước thực sự bằng chính nó.
- Vì tìm số hoàn hảo có hai chữ số nên ta sẽ sử dụng vòng lặp xác định for
…to … do đi từ 10 đến 100.
- Kiểm tra các số trong khoảng từ 10 đến 100 có số hoàn hảo không, nếu số
nào là số hoàn hảo thì in ra.
b. Chương trình tham khảo:
Program sohoanhao;
Var i,j,tong:longint;
Begin
For i:=10 to 100 do
begin
Tong:=0;
For j:=1 to i-1 do
If n mod i = 0 then tong:=tong+j;
If tong=i then write (i);
Readln;
End.
 28
7. In ra số hoàn hảo là số chẵn nhỏ hơn 100.

a. Ý tưởng:
- số hoàn hảo là số có tổng các ước thực sự bằng chính nó.


- Vì tìm số hoàn hảo nhỏ hơn 100 nên ta sẽ sử dụng vòng lặp xác định for
…to … do đi từ 1 đến 100.
- Kiểm tra các số trong khoảng từ 1 đến 100 có số hoàn hảo không, nếu số
nào là số hoàn hảo và chia hết cho 2 thì in ra.
b. Chương trình tham khảo:
Program sohoanhao;
Var i,j,tong:longint;
Begin
For i:=1 to 100 do
begin
Tong:=0;
For j:=1 to i-1 do
If n mod i = 0 then tong:=tong+j;
If (tong=i) and (i mod 2 = 0) then write (i);
Readln;
End.
 6, 28
8. In ra số hoàn hảo có hai chữ số là số chẵn.
a. Ý tưởng:
- số hoàn hảo là số có tổng các ước thực sự bằng chính nó.
- Vì tìm số hoàn hảo có hai chữ số nên ta sẽ sử dụng vòng lặp xác định for
…to … do đi từ 10 đến 100.
- Kiểm tra các số trong khoảng từ 10 đến 100 có số hoàn hảo không, nếu số
nào là số hoàn hảo và chia hết cho 2 thì in ra.
b. Chương trình tham khảo:
Program sohoanhao;

Var i,j,tong:longint;
Begin
For i:=10 to 100 do
begin
Tong:=0;
For j:=1 to i-1 do
If n mod i = 0 then tong:=tong+j;
If (tong=i) and (i mod 2 = 0) then write (i);


×