Chương trình tham khảo: - Để 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â
Trang 1MỘ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ó:
- 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:
Trang 2- Để 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
Trang 3+ 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:
- Để 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:
Trang 47 Nhập vào số nguyên n, in ra số chính phương lớn nhất, nhỏ hơn n
- 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:
- 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)
Trang 5b Chương trình tham khảo:
- 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:
dem:=dem+1;
Write (n,’ ‘);
End;
until dem=3;
Trang 6Readldn
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
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;
Trang 72 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
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;
Trang 8- 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;
Trang 93 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;
If frac(sqrt(a[i]))=0 and (a[i] > max) then max:=a[i];
If frac(sqrt(max)) = 0 then Write (max);
Trang 10nhỏ 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;
If frac(sqrt(a[i]))=0 and (a[i] < min) then min:=a[i];
If frac(sqrt(min)) = 0 then Write (min);
b Chương trình tham khảo:
Trang 11Var a:array [1 50] of longint;
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;
Trang 12if dem > max then max:= dem;
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],' ');
b Chương trình tham khảo:
Var a:array [1 50] of longint;
Max,i,n,tg:longint;
Begin
Read (n);
Trang 13For i := 1 to n do read (a[i]);
b Chương trình tham khảo:
Var a:array [1 50] of longint;
Trang 14b Chương trình tham khảo:
Var a:array [1 50] of longint;
Trang 15b 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
Trang 162 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
Trang 17begin 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], ‘ ‘);
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], ‘ ‘);
Trang 18- 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;
For i:=1 to n do
Write (a[i],’ ‘);
Readln
End
Trang 1916 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
- 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;
Trang 20b Chương trình tham khảo:
var a:array [1 50] of longint;
Trang 21if dem > max then max:= dem;
if a[i] = a[j] then dem:=dem+1;
if dem > max then max:=dem;
if dem = max then
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
Trang 22b Chương trình tham khảo:
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
Trang 23Nhậ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:
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
Trang 24If n mod i = 0 then tong:=tong+j;
If tong=i then write (i);
- 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
If n mod i = 0 then tong:=tong+j;
If tong=i then write (i);
Trang 25- 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
If n mod i = 0 then tong:=tong+j;
If (tong=i) and (i mod 2 = 0) then write (i);
- 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
If n mod i = 0 then tong:=tong+j;
If (tong=i) and (i mod 2 = 0) then write (i);
Trang 26- 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:
If n mod i = 0 then tong:=tong+j;
If (tong=i) and (i mod 2 = 0) then write (i);
Trang 27- 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
If n mod i = 0 then tong:=tong+i;
If tong=n then write (n);
Trang 28Tong:=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à
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;
Trang 29Đế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:
If i mod j = 0 then uoc:=uoc+1;
If uoc = 0 then writeln (i);
Trang 30Đế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:
If i mod j = 0 then uoc:=uoc+1;
If uoc = 0 then writeln (i);
Đế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;
Trang 31Var i,j,uoc: longint;
If i mod j = 0 then uoc:=uoc+1;
If (uoc = 0) and (i mod 2 = 0) then writeln (i);
- 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:
If i mod j = 0 then uoc:=uoc+1;
If (uoc = 0) and (i mod 2 = 0) then writeln (i);
End;
Readln;
End
Trang 326 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:
If i mod j = 0 then uoc:=uoc+1;
If uoc = 0 then writeln (i);
Đế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
Trang 33If i mod j = 0 then uoc:=uoc+1;
If uoc = 0 then writeln (i);
- 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:
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
Trang 34- 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:
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
Trang 354 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;
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;
Trang 363 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;
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;
Trang 37số 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;
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);
Trang 387 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;
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;
Trang 396 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;
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);
Trang 4011111 => 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;
b Chương trình tham khảo:
Var a:array[1 50] of longint;
Trang 41Dem:=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