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

74
MT SBÀI TP PASCAL DÀNH CHO HC SINH GII TIN 8 I. Bài tp vschính phương (biến đơn): 1. Cho snguyên n, kim tra n có phi là schí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 mt stnhiên. - Ta có: 0 = 0.0, , , , , - Nhn xét: Schính phương là số có phn thp 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 () để ly phn thp phân. b. Chương trình tham kho: 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 schính phương nhỏ hơn 100. a. Ý tưởng: Để kim tra lần lượt các schính phương nhỏ hơn 100 thì ta skim tra ln lượt các st0 đến 99 có phi là schính phương không, bằng câu lnh 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

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

Page 1: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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

Page 2: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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

Page 3: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

+ 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 (a<b) in ra các số chính phương nằm trong

khoả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.

Page 4: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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).

Page 5: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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;

Page 6: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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.

Page 7: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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:

Page 8: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

- 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

Page 9: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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

Page 10: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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:

Page 11: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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;

Page 12: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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);

Page 13: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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

Page 14: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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;

Page 15: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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ụ:

Page 16: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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

Page 17: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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], ‘ ‘);

Page 18: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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.

Page 19: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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

Page 20: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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;

Page 21: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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.

Page 22: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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

Page 23: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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;

Page 24: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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ó.

Page 25: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

- 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);

Page 26: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Readln;

End.

28

9. Nhập vào 2 số nguyên a,b (a<b) in ra các số hoàn hảo nằm trong khoảng

a,b.

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 nằm trong khoảng a,b nên ta sẽ sử dụng vòng lặp xác

định for …to … do đi từ a đến b.

- Kiểm tra các số trong khoảng từ a đến b 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

Read (a,b);

For i:=a to b 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.

10. Nhập vào số nguyên n, in ra số hoàn hảo lớn nhất, nhỏ hơn n.

a. Ý tưởng:

- Lấy ví dụ:

Nhập n = 60

KQ: 28

- Định nghĩa số hoàn hảo: số hoàn hảo là số có tổng các ước thực sự bằng

chính nó.

Page 27: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

- Kiểm tra ngược từ n trở về trước 1 đơn vị, đến khi nào gặp số hoàn hảo

thì in kết quả.

- Vòng lặp không xác định.

b. Chương trình tham khảo:

Program Nguyento;

Var i:longint;

Begin

Write (‘nhap n‘);

Readln (n);

Repeat n:=n-1;

Tong:=0;

For i:=1 to n-1 do

If n mod i = 0 then tong:=tong+i;

If tong=n then write (n);

until tong= n;

Readldn

End.

11. Nhập vào số nguyên n, in ra số hoàn hảo nhỏ nhất, lớn hơn n.

a. Ý tưởng:

- Lấy ví dụ:

Nhập n = 12

KQ: 28

- Định nghĩa số hoàn hảo: số hoàn hảo là số có tổng các ước thực sự bằng

chính nó.

- Kiểm tra ngược từ n trở lên 1 đơn vị, đến khi nào gặp số hoàn hảo thì in

kết quả.

- Vòng lặp không xác định.

b. Chương trình tham khảo:

Program Nguyento;

Var i:longint;

Begin

Write (‘nhap n‘);

Readln (n);

Repeat n:=n+1;

Page 28: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Tong:=0;

For i:=1 to n-1 do

If n mod i = 0 then tong:=tong+i;

If tong=n then write (n);

until tong= n;

Readldn

End.

IV. Bài tập về số nguyên tố:

1. Cho số nguyên n, kiểm tra n có phải là số nguyên tố không?

a. Ý tưởng:

- Định nghĩa số nguyên tố: số nguyên tố là số chỉ chia hết cho 1 và chính

nó, ngoại trừ số 0 và số 1.

- Nếu n =0 hoặc n=1 thì in ra n không phải là số nguyên tố.

- Thực tế, một số có thể chia hết từ 1 đến số đó chia 2, do đó ta sẽ lấy n

chia lần lượt cho các số từ 1 đến n div 2 và đếm ước. Nếu ước = 0 thì n là

số nguyên tố.

b. Chương trình tham khảo:

Program Nguyento;

Var i,n,uoc: longint;

Begin

Read (n);

If (n=0) or (n=1) then write (n, ‘ko la so nguyen to’) else

Begin

Uoc:=0;

For i:=2 to n div 2 do

If n mod i = 0 then uoc:=uoc+1;

If uoc = 0 then write (n, ‘la so nguyen to’) else write (n,’ko nguyento’);

End;

Readln;

Page 29: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

End.

2. In ra số nguyên tố nhỏ hơn 100.

a. Ý tưởng:

- Định nghĩa số nguyên tố: số nguyên tố là số chỉ chia hết cho 1 và chính

nó, ngoại trừ số 0 và số 1.

- Vì 0 và 1 ko là số nguyên tố nên ta sẽ tìm số nguyên tố từ 2 đến 100 và

sử dụng vòng lặp xác định for … to … do.

Đếm ước để tìm số nguyên tố bằng cách cho 1 vòng lặp j song song chạy

từ 2 đến số kiểm tra chia 2.Nếu ước bằng 0 thì in ra số nguyên tố.

b. Chương trình tham khảo:

Program Nguyento;

Var i,j,uoc: longint;

Begin

For i:=2 to 100 do

Begin

uoc:=0;

For j:=2 to i div 2 do

If i mod j = 0 then uoc:=uoc+1;

If uoc = 0 then writeln (i);

End;

Readln;

End.

3. In ra số nguyên tố có hai chữ số.

a. Ý tưởng:

- Định nghĩa số nguyên tố: số nguyên tố là số chỉ chia hết cho 1 và chính

nó, ngoại trừ số 0 và số 1.

- Vì 0 và 1 ko là số nguyên tố nên ta sẽ tìm số nguyên tố từ 2 đến 100 và

sử dụng vòng lặp xác định for … to … do.

Page 30: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Đếm ước để tìm số nguyên tố bằng cách cho 1 vòng lặp j song song chạy

từ 2 đến số kiểm tra chia 2.Nếu ước bằng 0 thì in ra số nguyên tố.

b. Chương trình tham khảo:

Program Nguyento;

Var i,j,uoc: longint;

Begin

For i:=10 to 100 do

Begin

uoc:=0;

For j:=2 to i div 2 do

If i mod j = 0 then uoc:=uoc+1;

If uoc = 0 then writeln (i);

End;

Readln;

End.

4. In ra số nguyên tố là số chẵn nhỏ hơn 100.

a. Ý tưởng:

* Tìm số nguyên tố:

- Định nghĩa số nguyên tố: số nguyên tố là số chỉ chia hết cho 1 và chính nó,

ngoại trừ số 0 và số 1.

- Vì 0 và 1 ko là số nguyên tố nên ta sẽ tìm số nguyên tố từ 2 đến 100 và sử

dụng vòng lặp xác định for … to … do.

Đếm ước để tìm số nguyên tố bằng cách cho 1 vòng lặp j song song chạy

từ 2 đến số kiểm tra chia 2.Nếu ước bằng 0 thì in ra số nguyên tố.

* Kiểm tra số đó có phải số chẵn không?

Số chẵn là số chia hết cho 2.

b. Chương trình tham khảo:

Program Nguyento;

Page 31: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Var i,j,uoc: longint;

Begin

For i:=2 to 100 do

Begin

uoc:=0;

For j:=2 to i div 2 do

If i mod j = 0 then uoc:=uoc+1;

If (uoc = 0) and (i mod 2 = 0) then writeln (i);

End;

Readln;

End.

5. In ra số nguyên tố có hai chữ số là số chẵn.

a. Ý tưởng:

- Tìm số nguyên tố có hai chữ số.

- Kiểm tra số nguyên tố vừa tìm có phải là số chẵn không?

b. Chương trình tham khảo:

Program Nguyento;

Var i,j,uoc,n: longint;

Begin

For i:=10 to 100 do

Begin

uoc:=0;

For j:=2 to i div 2 do

If i mod j = 0 then uoc:=uoc+1;

If (uoc = 0) and (i mod 2 = 0) then writeln (i);

End;

Readln;

End.

Page 32: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

6. Nhập số nguyên n, in ra các số nguyên tố nhỏ hơn n.

a. Ý tưởng:

- Tương tự tìm số nguyên tố nhỏ hơn 100.

b. Chương trình tham khảo:

Program Nguyento;

Var i,j,uoc: longint;

Begin

Read (n);

For i:=2 to n-1 do

Begin

uoc:=0;

For j:=2 to i div 2 do

If i mod j = 0 then uoc:=uoc+1;

If uoc = 0 then writeln (i);

End;

Readln;

End.

7. Nhập vào 2 số nguyên a,b (a<b) in ra các số nguyên tố nằm trong

khoảng a,b.

a. Ý tưởng:

- Vì cần tìm số nguyên tố trong khoảng a,b nên ta sẽ tìm từ a đến b và sử

dụng vòng lặp xác định for … to … do.

Đếm ước để tìm số nguyên tố bằng cách cho 1 vòng lặp j song song chạy

từ 2 đến số kiểm tra chia 2.Nếu ước bằng 0 thì in ra số nguyên tố.

b. Chương trình tham khảo:

Program Nguyento;

Var i,j,uoc: longint;

Begin

Page 33: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Read (a,b);

For i:=a to b do

Begin

uoc:=0;

For j:=2 to i div 2 do

If i mod j = 0 then uoc:=uoc+1;

If uoc = 0 then writeln (i);

End;

Readln;

End.

8. Nhập vào số nguyên n, in ra số nguyên tố lớn nhất, nhỏ hơn n.

a. Ý tưởng:

- Lấy ví dụ:

Nhập n = 60

KQ: 59

- Kiểm tra ngược từ n trở về trước 1 đơn vị, đến khi nào gặp số nguyên tố

thì 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 …

b. Chương trình tham khảo:

Program Nguyento;

Var i,n,uoc:longint;

Begin

Write (‘nhap n‘);

Readln (n);

Repeat n:=n-1;

Uoc=0;

For i:=2 to n div 2 do

If n mod i = 0 then uoc:=uoc+1;

If uoc=0 then write (n);

until uoc=0;

Readldn

Page 34: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

End.

9. Nhập vào số nguyên n, in ra số nguyên tố nhỏ nhất, lớn hơn n.

a. Ý tưởng:

- Lấy ví dụ:

Nhập n = 60

KQ: 61

- Kiểm tra ngược từ n trở lên 1 đơn vị, đến khi nào gặp số nguyên tố thì 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 …

b. Chương trình tham khảo:

Program Nguyento;

Var i,n,uoc:longint;

Begin

Write (‘nhap n‘);

Readln (n);

Repeat n:=n+1;

Uoc=0;

For i:=2 to n div 2 do

If n mod i = 0 then uoc:=uoc+1;

If uoc=0 then write (n);

until uoc=0;

Readldn

End.

II. Mảng 1 chiều về số nguyên tố:

///////////////// THUẬT TOÁN TÌM KIẾM ///////////////////////////////

10. 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ử nguyên tố.

a. Ý tưởng:

- Lấy ví dụ:

3 4 4 6 8 => 3

3 6 4 5 => 3 5

Page 35: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

4 3 4 5 5 => 3 5 5

3 3 3 3 3 => 3 3 3 3 3

1 1 1 1 1 => khong co phan tu la so nguyen to

4 4 4 4 4 => khong co phan tu la so nguyen to

2 6 8 4 6 => khong co phan tu la so nguyen to

- 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ố nguyên tố thì in

phần tử đó ra.

b. Chương trình tham khảo:

Var a:array[1..50] of longint;

I,dem,uoc,n: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

Begin

Uoc:=0;

For j:=2 to a[i] div 2 to

If a[i] mod j = 0 then uoc:=uoc+1;

If (uoc=0) and (a[i]>1) then

Begin

write (a[i],’ ‘); dem:=dem+1;

end;

end;

if dem = 0 then write (‘ko co so nguyen to’);

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ử. In ra

các phần tử là số nguyên tố và vị trí của nó.

a. Ý tưởng:

- Lấy ví dụ:

3 4 4 6 8 => 3 vi tri 1

Page 36: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

3 6 4 5 => 3 vi tri 1, 5 vi tri 4

4 3 4 5 5 => 3 vi tri 2, 5 vi tri 4, 5 vi tri 5

3 3 3 3 3 => 3 vitri1, 3 vitri 2, 3 vitri 3, 3 vitri 4, 3 vitri 5

1 1 1 1 1 => khong co phan tu la so nguyen to

4 4 4 4 => khong co phan tu la so nguyen to

6 8 4 6 => khong co phan tu la so nguyen to

- 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ố nguyên tố 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;

I,dem,uoc,n: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

Begin

Uoc:=0;

For j:=2 to a[i] div 2 to

If a[i] mod j = 0 then uoc:=uoc+1;

If (uoc=0) and (a[i]>1) then

Begin

write (a[i],’ ‘,’vitri’,’ ‘,i); dem:=dem+1;

end;

end;

if dem = 0 then write (‘ko co so nguyen to’);

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ử. In ra

phần tử là số nguyên tố lớn nhất trong dãy.

a. Ý tưởng:

- Lấy ví dụ:

Page 37: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

2 3 1 7 5 => 7

7 7 7 7 7 => 7

6 6 6 6 6 => khong co so nguyên tố.

1 1 1 1 1 => khong co so nguyen to

- Tìm kiếm số nguyên tố

- So sánh từng phần tử là số nguyên tố 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ử nguyên còn lại,

phần tử nào lớn hơn max thì gán max là phần tử đó. Kiểm tra max có phải

số nguyên tố không và In kết quả là max.

b. Chương trình tham khảo:

Var a:array [1..50] of longint;

Max,i,j,n:longint;

Begin

Read (n);

For i := 1 to n do read (a[i]);

Max:=0;

For i:=1 to n do

begin

Uoc := 0;

For j:=1 to a[i] div 2 do

Begin

If a[i] mod j = 0 then uoc:=uoc+1;

If (uoc =0 ) and (max < = a[i]) then max:=a[i];

End;

For j:=1 to a[i] div 2 do

If (max mod j <> 0) and (max >a[i]) then write (max);

End;

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ử. In ra

phần tử là số nguyên tố nhỏ nhất trong dãy.

a. Ý tưởng:

- Lấy ví dụ:

2 3 1 7 5 => 5

Page 38: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

7 7 7 7 7 => không co so nguyen to nho nhat

6 6 6 6 6 => khong co so nguyên tố.

1 1 1 1 1 => khong co so nguyen to

- Tìm kiếm số nguyên tố

- So sánh từng phần tử là số nguyên tố trong mảng, tìm ra số lớn nhất. bằng

cách lấy phần tử min là 0, so sánh min với các phần tử nguyên còn lại,

phần tử nào nhỏ hơn min thì gán in là phần tử đó. Kiểm tra min có phải là

số nguyên tố không và in kết quả là min.

b. Chương trình tham khảo:

Var a:array [1..50] of longint;

Min,i,j,n:longint;

Begin

Read (n);

For i := 1 to n do read (a[i]);

Min:=0; dem:=0;

For i:=1 to n do

begin

Uoc := 0; if a[i] > 2 then

For j:=1 to a[i] div 2 do

Begin

If a[i] mod j = 0 then uoc:=uoc+1;

If (uoc =0 ) and (min > a[i]) then min:=a[i];

End;

For i:=1 to n do

If min = a[i] then dem:=dem+1;

If (dem =0) or (dem = n) then write (‘khong co min’) else write (min);

End;

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ử. In ra

phần tử là số nguyên tố lớn nhất trong dãy và vị trí của nó.

a. Ý tưởng:

- Lấy ví dụ:

2 3 1 7 5 => 7 vitri 4

7 7 7 7 7 => 7 vitri 1, 7 vitri 2, 7 vitri 3, 7 vitri 4, 7 vitri 5,

Page 39: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

6 6 6 6 6 => khong co so nguyên tố.

1 1 1 1 1 => khong co so nguyen to

- Tìm kiếm số nguyên tố

- So sánh từng phần tử là số nguyên tố 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ử nguyên 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í của nó.

b. Chương trình tham khảo:

Var a:array [1..50] of longint;

Max,i,j,n:longint;

Begin

Read (n);

For i := 1 to n do read (a[i]);

Max:=0;

For i:=1 to n do

begin

Uoc := 0;

For j:=1 to a[i] div 2 do

Begin

If a[i] mod j = 0 then uoc:=uoc+1;

If (uoc =0 ) and (max < = a[i]) then max:=a[i];

End;

For j:=1 to a[i] div 2 do

If (max mod j <> 0) and (max >a[i]) then

For i:=1 to n do if a[i] = max then write (a[i],’ ‘,vitri,’ ‘,i);

End;

Readln.

End.

///////////////// THUẬT TOÁN SẮP XẾP ///////////////////////////////

15. 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

Page 40: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

11111 => 1 1 1 1 1

00 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.

16. 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ố nguyên tố 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 9 3 7 4

Tìm các phần tử là số nguyên tố, 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;

I,dem,uoc,n:longint;

Begin

Read (n);

Write (‘nhap mang a: ‘);

For i:=1 to n do

Read(a[i],’ ‘);

Page 41: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Dem:=0;

For i:=1 to n do

Begin

Uoc:=0;

For j:=2 to a[i] div 2 to

If a[i] mod j = 0 then uoc:=uoc+1;

If (uoc=0) and (a[i]>2) then

dem:=dem+1;

if dem = 0 then write (‘ko co so nguyen to’);

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.

Page 42: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Tuần 3 (09/12/2019 – 16/12/2019)

V. Bài tập về tổng các chữ số:

1. Nhập vào số nguyên n, in ra các chữ số của n.

a. Ý tưởng:

- Lấy ví dụ: n = 3421 => 1 2 4 3

Nhận xét: nếu chia 3421 cho 10 thì được 342 dư 1

Nếu chia 342 cho 10 thì được 34 dư 2

Nếu chia 34 cho 10 thì được 3 dư 4

Nếu chia 3 cho 10 thì được 0 dư 3

- Để in các chữ số của n, ta lấy n chia cho 10 được phần dư là các chữ số

của n.

- Xét n trong trường hợp n khác 0.

b. Chương trình tham khảo:

Var n,t:longint;

Begin

Read (n);

While (n<>0) do

Begin

T:=n mod 10;

Write (t);

N := n div 10;

End;

Readln;

End.

2. Nhập vào số nguyên n, tính tổng các chữ số của n.

a. Ý tưởng:

- Lấy ví dụ: n = 3421 => tổng = 10

- Tách các chữ số của n, ta lấy n chia cho 10 được phần dư là các chữ số

của n rồi cộng lần lượt các chữ số đó lại.

b. Chương trình tham khảo:

Var n,t,s:longint;

Begin

Page 43: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Read (n);

S:=0;

While (n<>0) do

Begin

T:=n mod 10;

S:=s+t;

N := n div 10;

End;

Write (s);

Readln;

End.

3. Nhập vào số nguyên n, in ra chữ số của n là số lẻ.

a. Ý tưởng:

- Lấy ví dụ: n = 3421 => 1 3

- Tách các chữ số của n, ta lấy n chia cho 10 được phần dư là các chữ số

của n rồi chia lần lượt các chữ số đó cho 2, chữ số nào không chia hết cho

2 là số lẻ, in ra.

b. Chương trình tham khảo:

Var n,t:longint;

Begin

Read (n);

While (n<>0) do

Begin

T:=n mod 10;

If t mod 2 <> 0 then write (t);

N := n div 10;

End;

Readln;

End.

4. Nhập vào số nguyên n, in ra chữ số lớn nhất của n.

a. Ý tưởng:

- Lấy ví dụ: n = 3421 => 4

- Tách các chữ số của n, ta lấy n chia cho 10 được phần dư là các chữ số

của n rồi so sánh các chữ số đó với nhau, số nào lớn nhất sẽ in ra.

b. Chương trình tham khảo:

Page 44: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Var n,t,max:longint;

Begin

Read (n);

Max:=0;

While (n<>0) do

Begin

T:=n mod 10;

If max<t then max:=t;

N := n div 10;

End;

Write (max);

Readln;

End.

5. Nhập vào số nguyên n, in ra chữ số nhỏ nhất của n.

a. Ý tưởng:

- Lấy ví dụ: n = 3421 => 1

- Gán min là giá trị được tách đầu tiên.

- Tách các chữ số của n, ta lấy n chia cho 10 được phần dư là các chữ số

của n rồi so sánh các chữ số đó với min, số nào nhỏ nhất sẽ in ra.

b. Chương trình tham khảo:

Var n,t,min:longint;

Begin

Read (n);

Max:=n mod 10; n := n div 10;

While (n<>0) do

Begin

T:=n mod 10;

If min>t then min:=t;

N := n div 10;

End;

Write (min);

Readln;

End.

6. Nhập vào số nguyên n, in ra số chính phương từ 1 đến n có tổng các chữ

số là số lẻ.

a. Ý tưởng:

- Lấy ví dụ: 9, 67, …

Page 45: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

- Tìm số chính phương

- Tách các chữ số của số chính phương

- Kiểm tra tổng của các chữ số của số chính phương có phải số lẻ không.

b. Chương trình tham khảo:

Uses crt;

Var i,k,t,n,tong:longint;

Begin

Clrscr;

Read (n);

For i:=1 to n do

Begin

Tong:=0; k:=i;

If frac(sqrt(k))=0 then

Begin

While k<>0 do

Begin

T:=k mod 10;

Tong:=tong+t;

k:=k div 10;

end;

if tong mod 2 <> 0 then write (i, ‘ ‘);

end;

end;

Readln;

Readln;

end.

7. Nhập vào số nguyên n, in ra số chính phương có hai chữ số, có tổng các

chữ số là số chẵn.

Page 46: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

a. Ý tưởng:

- Lấy ví dụ:

- Tìm số chính phương

- Tách các chữ số của số chính phương

- Kiểm tra tổng của các chữ số của số chính phương có phải số chẵn không.

b. Chương trình tham khảo:

Uses crt;

Var i,k,t,n,tong:longint;

Begin

Clrscr;

Read (n);

For i:=10 to n do

Begin

Tong:=0; k:=i;

If frac(sqrt(k))=0 then

Begin

While k<>0 do

Begin

T:=k mod 10;

Tong:=tong+t;

k:=k div 10;

end;

if tong mod 2 = 0 then write (i, ‘ ‘);

end;

end;

Readln;

Readln;

end.

Page 47: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

8. Nhập vào số nguyên n, in ra chữ số của n là số nguyên tố.

a. Ý tưởng:

- Lấy ví dụ: n = 3421 => 2 3

- Tách các chữ số của n, ta lấy n chia cho 10 được phần dư là các chữ số

của n rồi kiểm tra các chữ số đó, số nào là số nguyên tố thì in ra.

b. Chương trình tham khảo:

Var n,t,I,uoc:longint;

Begin

Read (n);

While (n<>0) do

Begin

T:=n mod 10;

uoc:=0;

For i:=2 to t div 2 do

If t mod i = 0 then uoc:=uoc+1;

If uoc=0 then write (t);

N := n div 10;

End;

Readln;

End.

VI. Bài tập về UCLN, BCNN:

1. Nhập vào 2 số a,b. Tìm UC của 2 số a,b.

a. Ý tưởng:

- Lấy ví dụ: UC (10,20) = 1, 2, 5, 10

- Lấy a chia lần lượt cho các số từ 1 đến a, nếu a cho hết cho 1 số và b chia

hết cho 1 số thì số đó là ước của a và b.

b. Chương trình tham khảo:

Var a,b,i:longint;

Begin

Read (a,b);

For i:=1 to a do

If (a mod i =0) and (b mod i = 0) then write (i,’ ‘);

Readln;

Page 48: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

End.

2. Nhập vào 2 số a,b. Tìm UCLN của 2 số a,b.

a. Ý tưởng:

- Lấy ví dụ: UCLN (10,20) = 10

- Lấy a chia lần lượt cho các số từ 1 đến a, nếu a cho hết cho 1 số và b chia

hết cho 1 số thì số đó là ước của a và b, lưu ước chung vào 1 biến, chọn

ước chung cuối cùng là ước chung lớn nhất.

b. Chương trình tham khảo:

Var a,b,i,t:longint;

Begin

Read (a,b,c,d);

For i:=1 to a do

If (a mod i =0) and (b mod i = 0) then t:=i;

Write (t);

Readln;

End.

3. Nhập vào các số nguyên a,b,c,d. Rút gọn các phân số a/b, c/d rồi tính

tổng a/b + c/d

a. Ý tưởng:

- Lấy ví dụ: a= 8, b = 12, c = 3, d=9 (b,d # 0)

- Tìm ước chung lớn nhất của a và b để rút gọn phân số a/b, tìm ước chung

lớn nhất của c và d để rút gọn phân số c/d.

- Tính tổng.

b. Chương trình tham khảo:

var a,b,c,d,i,t,x,y,z:longint;

Begin

Read (a,b,c,d);

Page 49: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

For i:=1 to a do

If (a mod i =0) and (b mod i = 0) then t:=i;

a:=round(a/t);

b:=round(b/t);

for i:=1 to c do

if (c mod i = 0) and (d mod i = 0) then z:=i;

c:=round(c/z);

d:=round(d/z);

x:=a*d + c*b;

y:=b*d;

write ('tong','=',x,'/',y);

Readln;

readln;

end.;

4. Nhập vào n, tìm bội của n (giới hạn n bình phương)

a. Ý tưởng:

- Lấy ví dụ: bội của 2 = 2,4,6,8,….

- Lấy n nhân lần lượt với các số từ 1 đến n bình phương, ta được bội của n.

b. Chương trình tham khảo:

Var n,i,b:longint;

Begin

Read (n);

For i:=1 to sqr(n) do

begin

B:=n*i;

Write (b);

End;

Page 50: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Readln;

End.

5. Nhập vào 2 số a,b. Tìm BCNN của 2 số a,b.

a. Ý tưởng:

- Lấy ví dụ: B(8,12)=

- Theo công thức Euclide BCNN(a,b) = a*b/UCLN(a,b)

Với a<>b

b. Chương trình tham khảo:

Var a,b,si,t:longint;

Begin

Read (a,b);

K:=a*b;

While a<> b do begin

If a>b then a:= a-b else b:=b-a;

BCNN := k/a;

End;

Write (BCNN);

Readln;

End.

Page 51: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Tuần 4 (16/12/2019 – 21/12/2019)

VII. Bài tập về giai thừa:

1. Nhập vào số nguyên n, tính n giai thừa.

a. Ý tưởng:

3 Lấy ví dụ: 7! = 1*2*3*4*5*6*7

b. Chương trình tham khảo:

Var

Begin

Read (n); p:=1;

For i:=1 to n do

P:= P*i;

Write (p);

Readln.

End.

VIII. Bài tập về lũy thừa.

1. Nhập vào số thực a, số nguyên x. Tính a mũ x.

a. Ý tưởng:

4 Lấy ví dụ: 32 = 3*3

b. Chương trình tham khảo:

Var a,x,i,LT:longint;

Begin

Read (a,x);

LT=1;

For i:=1 to x do

LT:=LT*a;

Write (LT);

Readln.

Page 52: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

End.

IX. Hàm và thủ tục:

1. Viết hàm số nguyên tố

Function snt(n:longint):boolean;

Var I,n:longint;

Begin

If i< 2 then snt:=false;

For i:=1 to n div 2 do

If n mod i = 0 then

Begin

Exit;

snt:=false;

End;

End;

2. Viết hàm số chính phương

Function scp(n:longint): boolean;

Begin

If n < 0 then scp := false;

If frac(sqrt(n)) <> 0 then scp := false;

End;

3. Hàm tính tổng các chữ số

Function tongccs(n:longint): longint;

t,n,tong:longint;

Begin

While (n<>0) do

Begin

t:=n mod 10;

tong:=tong+t;

n:=n div 10;

End;

Page 53: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

tongccs := tong;

End;

4. Hàm tính giai thừa

Function gthua(n:longint):longint;

Var p,i:longint;

begin

p:=1;

For i:=1 to n do

p:= p*i;

gthua:=p;

end;

5. Hàm tính lũy thừa

Function luythua(a:real,x:longint):longint;

Var i:longint;

Begin

LT=1;

For i:=1 to x do

LT:=LT*a;

Luythua:=LT;

End;

6. Hàm ước chung lớn nhất của 2 số a,b

Function ucln(a,b:longint):longint;

Var z,i:longint;

begin

For i:=1 to a do

If (a mod i =0) and (b mod i = 0) then z:=i;

ucln:=z;

End;

Page 54: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

7. Hàm bội chung nhỏ nhất của 2 số a,b

Function bcnn(a,b:longint):longint;

Var k:longint;

Begin

k:=a*b;

While a<> b do begin

If a>b then a:= a-b else b:=b-a;

bcnn:= k/a;

end;

8. Nhập vào mảng a gồm n phần tử, tìm tất cả các phần tử là nguyên tố

cùng nhau (UCLN =1)

9. In ra các số nguyên tố có 3 chữ số mà sau khi bớt đi một chữ số ở hàng

đơn vị thì nó cũng là số nguyên tố (siêu nguyên tố)

10. In ra các số chính phương có 3 chữ số mà tổng các chữ số của nó

là số nguyên tố.

Page 55: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

11. Bài tập tổng hợp:

1. Nhập vào số nguyên n. In ra số chính phương nhỏ hơn n, có tổng các

chữ số là số nguyên tố.

a. Ý tưởng:

b. Chương trình tham khảo:

2. In ra số chính phương có hai chữ số, có tổng các chữ số là số nguyên tố.

3. Nhập vào số nguyên n. In ra số nguyên tố nhỏ hơn n, có tổng các chữ số

là số chính phương.

4. In ra số nguyên tố có hai chữ số, có tổng các chữ số là số chính phương.

5. In ra số chính phương, có tổng các chữ số là số chẵn.

B. Dãy số

Fibonacci

Page 56: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

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 vị trí các phần tử chẵn lớn nhất.

a. Ý tưởng:

6 Lấy ví dụ:

87324 => 8

11111 => khong co phan tu chan

88888 => 8

22388 => 8

00000 => 0

7 Tìm phần tử chẵn

8 So sánh từng phần tử chẵn trong mảng, tìm ra phần tử chẵn 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ẵn

trong mảng, phần tử chẵn 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:=a[1];

For i:=2 to n do

If a[i] > max then max:=a[i];

Write (max);

Readln.

End.

9

Page 57: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri
Page 58: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

10 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ẵn.

a. Ý tưởng:

11 Lấy ví dụ:

3 4 5 7 9 => 4

1 2 3 4 5 => 2 4

2 3 4 5 4 => 2 4 4

2 2 2 2 2 => 2 2 2 2 2

1 1 1 1 1 => khong co phan tu la so chan

1 3 5 7 9 => khong co phan tu la so chan

12 Nhập 1 dãy số nguyên a gồm n phần tử.

13 Kiểm tra các phần tử của dãy a. Nếu phần tử nào là số chẵn thì in ra.

b. Chương trình tham khảo:

Var a:array[1..50] of longint;

n,i,dem: 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 a[i] mod 2 = 0 then

Begin

write (a[i],’ ‘);

dem:=dem+1;

end;

if dem = 0 then write (‘khong co phan tu la so chan’);

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ử. In

ra vị trí các phần tử chẵn.

c. Ý tưởng:

15 Lấy ví dụ:

Page 59: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

3 4 5 7 9 => 2

1 2 3 4 5 => 2 4

2 3 4 5 4 => 1 3 5

2 2 2 2 2 => 1 2 3 4 5

1 1 1 1 1 => khong co phan tu la so chan

1 3 5 7 9 => khong co phan tu la so chan

16 Nhập 1 dãy số nguyên a gồm n phần tử.

17 Kiểm tra các phần tử của dãy a. Nếu phần tử nào là số chẵn thì in ra vị

trí của phần tử đó.

d. 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 a[i] mod 2 = 0 then

Begin

write (i,’ ‘); dem :=dem+1;

end;

if dem = 0 then write (‘ko co phan tu chan’);

Readln.

End.

18 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ẵn và vị trí của nó.

c. Ý tưởng:

19 Lấy ví dụ:

34579 => 4 vi tri 2

12345 => 2 vi tri 2; 4 vi tri 4

23454 => 2 vi tri 1; 4 vi tri 4; 4 vi tri 5

Page 60: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

22222 => 2 vi tri 1; 2 vi tri 2; 2 vi tri 3; 2 vi tri 4; 2 vi tri 5

11111 => khong co phan tu la so chan

13579 => khong co phan tu la so chan

20 Nhập 1 dãy số nguyên a gồm n phần tử.

21 Kiểm tra các phần tử của dãy a. Nếu phần tử nào là số chẵn thì in phần

tử đó và vị trí của nó.

d. 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 a[i] mod 2 = 0 then

Begin

writeln (a[i],’vi tri ‘,i); dem:=dem+1;

end;

if dem = 0 then write (‘khong co phan tu chan);

Readln.

End.

22 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 tổng các phần tử của dãy.

a. Ý tưởng:

23 Lấy ví dụ:

0 0 0 0 0 0

0 1 2 3 4 5

-1 -2 -3 -3 -5 -6

-1 -2 -3 0 1 2

0 0 0 0 0 -1

24 Nhập 1 dãy số nguyên a gồm n phần tử.

25 Tính tổng các phần tử có trong dãy.

b. Chương trình tham khảo:

Page 61: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Var a:array[1..50] of longint;

n,i,s: longint;

Begin

Read (n);

For i:=1 to n do

Read(a[i],’ ‘);

S:=0;

For i:=1 to n do

S:=s+a[i];

Write (s);

Readln.

End.

26 Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử.

Đếm số phần tử chẵn có trong dãy.

a. Ý tưởng:

27 Lấy ví dụ:

12345 => 2

13579 =>0

00000 =>5

24682 => 5

11111 => 0

22222 => 5

28 Nhập 1 dãy số nguyên a gồm n phần tử.

29 Tìm phần tử chẵn.

30 Đếm số phần tử chẵn có trong dãy.

b. Chương trình tham khảo:

Var a:array[1..50] of longint;

N,i,dem: longint;

Begin

Read (n);

For i:=1 to n do

Read(a[i],’ ‘);

Dem:=0;

For i:=1 to n do

If a[i] mod 2 = then dem:=dem+1;

Page 62: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Write (dem);

Readln.

End.

31 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ớn nhất trong dãy.

c. Ý tưởng:

32 Lấy ví dụ:

23756 => 7

11111 => 1

33 So sánh từng phần tử trong mảng, tìm ra số lớn nhất. bằng cách lấy

phần tử thứ nhất là max, so sánh max với các phần tử 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.

d. 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:=a[1];

For i:=2 to n do

If a[i] > max then max:=a[i];

Write (max);

Readln.

End.

34 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ử nhỏ nhất trong dãy.

c. Ý tưởng:

35 Lấy ví dụ:

23756 => 2

Page 63: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

11111 => khong co phan tu nho nhat

23982 => 2

36 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ử đó. In kết quả là min.

d. Chương trình tham khảo:

Var a:array [1..50] of longint;

Min,i,n,dem:longint;

Begin

Read (n);

For i:= 1 to n do read (n);

Min:=a[1]; dem:=0;

For i:=2 to n do

Begin

If a[i] < min then min:=a[i];

If a[i] = min then dem :=dem+1;

end;

if dem= n then write (‘khong co phan tu nho nhat’) else write (min);

Readln.

End.

37 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ớn nhất trong dãy và vị trí của nó.

e. Ý tưởng:

38 Lấy ví dụ:

23756 => 7

11111 => 1

Page 64: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

39 So sánh từng phần tử trong mảng, tìm ra số lớn nhất. bằng cách lấy

phần tử thứ nhất là max, so sánh max với các phần tử 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í

của nó.

f. 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:=a[1];

For i:=2 to n do

If a[i] > max then max:=a[i];

For i:=1 to n do

If a[i] = max then write (a[i], ‘vi tri’, i);

Readln.

End.

40 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ử chẵn lớn nhất.

c. Ý tưởng:

41 Lấy ví dụ:

87324 => 8

11111 => khong co phan tu chan

88888 => 8

22388 => 8

00000 => 0

42 Tìm phần tử chẵn

43 So sánh từng phần tử chẵn trong mảng, tìm ra phần tử chẵn 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ẵn

trong mảng, phần tử chẵn nào lớn hơn max thì gán max là phần tử đó.

In kết quả là max.

d. Chương trình tham khảo:

Page 65: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Var a:array [1..50] of longint;

Max,i,n:longint;

Begin

Read (n);

For I := 1 to n do read (n);

Max:=a[1];

For i:=2 to n do

If a[i] > max then max:=a[i];

Write (max);

Readln.

End.

44 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ự chẵn 1 hàng, lẻ 1 hàng.

a. Ý tưởng:

45 Lấy ví dụ:

2 3 4 5 6 7 => 2 4 6

3 5 7

1 1 1 1 1 1 => 1 1 1 1 1 1

2 2 2 2 2 2 => 2 2 2 2 2 2

3 3 3 3 4 5 => 3 3 3 3 5

4

46 Nhập vào các phần tử của mảng.

47 Kiểm tra lần lượt các phần tử của mảng. nếu là phần tử chẵn thì in ra.

Sau đó xuống dòng, trở về vị trí ban đầu, kiểm tra lần lượt các phần tử

của mảng, nếu phần tử là số lẻ thì in ra.

b. Chương trình tham khảo:

Var a:array [1..50] of longint;

I,n:longint;

Begin

Read (n);

For i:=1 to n do

Read (a[i]);

For i:=1 to n do

If a[i] mod 2 = 0 then write (a[i],’ ‘); writeln;

Page 66: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

For i:=1 to n do

If i mod 2 <> then write (a[i],’ ‘);

Readln.

End.

48 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.

c. Ý tưởng:

49 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

d. 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 - 1 do read (n);

For i:=i+1 to n 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

write (a[i],’ ‘);

Readln.

End.

50 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ự chẵn 1 hàng, lẻ 1 hàng.

c. Ý tưởng:

51 Lấy ví dụ:

2 3 4 5 6 7 => 2 4 6

3 5 7

1 1 1 1 1 1 => 1 1 1 1 1 1

Page 67: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

2 2 2 2 2 2 => 2 2 2 2 2 2

3 3 3 3 4 5 => 3 3 3 3 5

4

52 Nhập vào các phần tử của mảng.

53 Kiểm tra lần lượt các phần tử của mảng. nếu là phần tử chẵn thì in ra.

Sau đó xuống dòng, trở về vị trí ban đầu, kiểm tra lần lượt các phần tử

của mảng, nếu phần tử là số lẻ thì in ra.

d. Chương trình tham khảo:

Var a:array [1..50] of longint;

I,n:longint;

Begin

Read (n);

For i:=1 to n do

Read (a[i]);

For i:=1 to n do

If a[i] mod 2 = 0 then write (a[i],’ ‘); writeln;

For i:=1 to n do

If i mod 2 <> then write (a[i],’ ‘);

Readln.

End.

54 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ử có giá trị khác nhau, mỗi phần tử in một lần.

a. Ý tưởng:

55 Lấy ví dụ:

1 2 3 4 5 6 => 1 2 3 4 5 6

1 1 2 2 3 3 => 1 2 3

1 2 3 1 2 2 => 1 2 3

1 1 1 1 1 1 => 1

56 Nhập dãy số nguyên a gồm n phần tử.

57 Đếm các phần tử xuất hiện 1 lần trong dãy.

b. Chương trình tham khảo:

Var a:array[1..50] of longint;

Page 68: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

I,n,dem,j: longint;

Begin

Read (n);

For i:1 to n do read (a[i]);

For i:1 to n-1 do

begin

Dem:=1;

For j:= i+1 to n do

If a[i] = a[j] then dem:=dem+1;

If dem = 1 then write (a[i],’ ‘);

End;

Readln;

Readln;

End.

58 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ử xuất hiện một lần trong mảng.

a. Ý tưởng:

59 Lấy ví dụ:

1 2 3 4 5 6 => 1 2 3 4 5 6

1 1 2 2 3 3 => khong co phan tu xuat hien 1 lan

1 2 3 1 2 2 => 3

1 1 1 1 1 1 => khong co phan tu xuat hien 1 lan

60 Nhập dãy số nguyên a gồm n phần tử.

61 Đếm các phần tử xuất hiện 1 lần trong dãy bằng cách Sử dụng biến

đếm, gán đếm ban đầu là 0. So sánh lần lượt các phần tử của mảng với

nhau. Nếu phần tử nào bằng nhau thì biến đếm sẽ tăng lên 1 đơn vị.

cuối cùng xét biến đếm. nếu biến đếm =0 thì phần tử đó xuất hiện 1

lần. in ra kết quả.

b. Chương trình tham khảo:

Var a:array[1..50] of longint;

I,n,dem,j: longint;

Begin

Read (n);

Page 69: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

For i:=1 to n do read (a[i]);

For i:=1 to n-1 do

begin

Dem:=0;

For j:= i to n do

If a[i] = a[j] then dem:=dem+1;

If dem = 1 then write (a[i],’ ‘);

End;

Readln;

Readln;

End.

62 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ử n là số lẻ khác nhau của mảng.

a. Ý tưởng:

63 Lấy ví dụ:

1 2 3 4 5 6 => 1 3 5

1 1 2 2 3 3 => 1 3

1 1 1 1 1 1 => 1

2 4 6 8 2 4 => không có phần tử lẻ

2 2 2 2 2 2 => không có số lẻ

0 0 0 0 0 0 => không có số lẻ

64 Nhập dãy số nguyên a gồm n phần tử.

65 Kiểm tra các phần tử lẻ trong mảng

66 So sánh, đếm và in các phần tử lẻ khác nhau của mảng.

b. Chương trình tham khảo:

Var a:array[1..50] of longint;

i,n,dem,j: longint;

Begin

Read (n);

For i:=1 to n do read (a[i]);

For i:=1 to n do

If a[i] mod 2 <> 0 then

Begin

Dem:=1;

Page 70: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

For j:=i+1 to n do

If a[i] = a[j] then dem:=dem+1;

If (dem=1) and (a[i] <> a[j]) then write (a[i],’ ‘);

End;

If a[i] mod 2 = 0 then write (‘khong co phan tu le’);

Readln.

End.

67 Dãy con tăng dần (giảm dần) có nhiều phần tử nhất.

a. Ý tưởng:

- Lấy ví dụ: 1 2 3 2 4 5 6 -> 2 4 5 6

- Xác định vị trí đầu, cuối của dãy con tăng dần có nhiều phần tử nhất.

- Đếm số dãy con tăng dần dài nhất

b. Chương trình tham khảo:

Var a:array [1..50] of longint;

N,I,j,d,m:longint;

Begin

Read (n);

For i:=1 to n do read (a[i]);

M:=0;

I:=0;

Repeat d:=1;

I:=i+1;

While (a[i] <= a[i+1]) do

Begin

D:=d+1;

I:=i+1;

End;

If d>m then m:=d;

Until i=n;

Write (m);

I:=0;

Repeat d:=1;

I:=i+1;

While (a[i] <= a[i+1]) do

Begin

D:=d+1;

Page 71: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

I:=i+1;

End;

if d=m then

for j:=i+1-m to i do

write (a[i],’ ‘);

until i=n;

readln

End.

68 Dãy con tăng dần (giảm dần) có nhiều phần tử nhất và tính tổng

của dãy con đó.

a. Ý tưởng:

- Lấy ví dụ: 1 2 3 2 4 5 6 -> 2 4 5 6 s=17

- Xác định vị trí đầu, cuối của dãy con tăng dần có nhiều phần tử nhất.

- Đếm số dãy con tăng dần dài nhất

- Tính và in tổng

b. Chương trình tham khảo:

Var a:array [1..50] of longint;

N,I,j,d,m,s:longint;

Begin

Read (n);

For i:=1 to n do read (a[i]);

M:=0;

I:=0;

Repeat d:=1;

I:=i+1;

S:=a[i];

While (a[i] <= a[i+1]) do

Begin

D:=d+1;

I:=i+1;

S:=s+a[i];

End;

If d>m then m:=d;

Until i=n;

Page 72: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Write (m);

I:=0;

Repeat d:=1;

I:=i+1;

While (a[i] <= a[i+1]) do

Begin

D:=d+1;

I:=i+1;

End;

if d=m then

for j:=i+1-m to i do

write (a[i],’ ‘);

until i=n;

readln

End.

69 Dãy con tăng dần dài nhất có tổng nhỏ nhất

a. Ý tưởng:

- Lấy ví dụ: 1 2 3 2 4 5 6 1 2 3 4-> 1 2 3 4 s=10

- Xác định vị trí đầu, cuối của dãy con tăng dần có nhiều phần tử nhất.

- Đếm số dãy con tăng dần dài nhất

- Tính và so sánh tổng. tổng của dãy con nào bé hơn thì in dãy con đó.

b. Chương trình tham khảo:

Var a:array [1..50] of longint;

N,I,j,d,m,s,ms:longint;

Begin

Read (n);

For i:=1 to n do read (a[i]);

M:=0;

I:=0;

Repeat d:=1;

I:=i+1;

S:=a[i];

While (a[i] <= a[i+1]) do

Page 73: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Begin

D:=d+1;

I:=i+1;

S:=s+a[i];

End;

If d>m then m:=d;

Until i=n;

Write (m);

I:=0;

Repeat d:=1;

I:=i+1;

While (a[i] <= a[i+1]) do

Begin

D:=d+1;

I:=i+1;

End;

if d=m then

for j:=i+1-m to i do

write (a[i],’ ‘);

until i=n;

readln

End.

a. 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, sao cho mảng vẫn theo thứ tự tăng dần.

a. Ý tưởng:

- Lấy ví dụ:

70 3 5 7 8 9 => 2 3 4 5 7 8 9

- Kiểm tra các phần tử của dãy với số k, nếu số k nhỏ hơn số đầu tiên thì

chèn số k vào vị trí đầu, nếu số k lớn hơn số cuối cùng thì chèn số k vào

sau vị trí cuối, số k nằm trong khoảng giữa thì kiểm tra só k với các số

trong dãy xem số k nằm ở vị trí nào của dãy để dãy vẫn tăng. In kết quả.

b. Chương trình tham khảo:

Var a:array[1..50] of longint;

I,j,k,n: longint;

Begin

Page 74: MỘT SỐ BÀI TẬP PASCAL DÀNH CHO HỌC SINH GIỎI TIN 8 ...nguyendu.pgdtamky.edu.vn/upload/43238/20200210/DINH...- 4 4 4 4 4 => 4 vi tri 1, 4 vi tri 2, 4 vi tri 3, 4 vi tri

Read (n);read (k);

For i:=1 to n do read (a[i]);

If k<a[1] then

For i:=n+1 downto 2 do

A[i]:=a[i-1];

A[1]:=k;

If k> a[n] then a[n+1]:=k;

If (k>a[1]) and (k<a[n]) then

Begin

Dem:=0;

J:=1;

While (k>a[j]) do j:=j+1;

For i:=n+1 downto j+1 do

A[i]:=a[i-1];

A[j]:=k;

End;

For i:=1 to n+1 do

Write (a[i],’ ‘)

Readln;

Readln;

End.