1. Trang chủ
  2. » Giáo án - Bài giảng

Bài giải Đề thi Tin học trẻ THCS các quận,huyện,thị xã ■ Lập trình Free Pascal ■ Tập 1

22 9,1K 45
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 22
Dung lượng 891,72 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giải tham khảo Đề thi Tin học trẻ TP. Hà Nội năm 2016 ■ Bài giải tham khảo Đề thi Tin học trẻ huyện Hoa Lưi năm 2018 ■ Bài giải tham khảo Đề thi Tin học trẻ TP. Quy Nhơn năm 2018 ■ Bài giải tham khảo Đề thi Tin học trẻ TP. Ninh Bình năm 2018

Trang 1

Đề thi Tin học trẻ Thành phố Hà Nội năm 2016

Khối Trung học Cơ sở

Thời gian làm bài: 120 phút

Hướng giải quyết:

Trang 2

- Với n=7, số thứ 1 so sánh với số thứ 7

số thứ 2 so sánh với số thứ 6

số thứ 3 so sánh với số thứ 5

Vậy số thứ i sẽ so sánh với số thứ n+1-i

- Trong quá trình so sánh chỉ cần số thứ i khác với số thứ n+1-i thì dãy đã cho là không đối xứng nên cần thông báo kết quả và kết thúc, không cần so sánh thêm nữa

Chương trình viết trên Free Pascal như sau: (các dòng có màu xanh có // đứng trước là chú thích, không cần viết vào chương trình)

If a[i]<>a[n+1-i] then Begin Write(0);

Close(Output); Exit; End;

// Neu day so khong doi xung thi da ghi ket qua va // thoat chuong trinh

Write(1);

Close(Output);

End

Trang 3

Hướng giải quyết:

Write('Ban hay nhap so n '); ReadLn(n);

WriteLn('Ban hay nhap ', n, ' so cua hoan vi ');

For i:=1 to n do Read(A[i]);

For i:=1 to n do Begin

Dem:=0;

// Tim vi tri vt cua i

For vt:=1 to n do If i=A[vt] then Break;

Trang 4

For j:=1 to vt-1 do If A[j]>i then Inc(Dem); // Dem NT[i]:=Dem;

End;

WriteLn('Nghich the cua hoan vi:');

For i:=1 to n do Write(NT[i], ' ');

End

Hướng giải quyết:

- Tạo chuổi A bằng các ghép các số từ 1 đến n Do chuổi chỉ có 256 ký tự nên cần khai báo {$H+} để chuổi chứa được nhiều chữ số hơn (n<=100)

- Chữ số thứ k chính là A[k]

Trang 5

Chương trình viết như sau:

Assign(Output, 'So.Out'); ReWrite(Output);

WriteLn(A);

WriteLn(A[k]);

Close(output);

End

Trang 6

Đề thi Tin học trẻ huyện Hoa Lư năm 2018

Khối Trung học Cơ sở

Thời gian làm bài: 120 phút

Hướng giải quyết:

 Sắp thứ tự dãy số: Với n<=10 000 có thể dùng cách sắp xếp thông thường:

- Dò từ đầu dãy số, đến số nào lớn hơn số 15 thì ngưng => vị trí 4

- Chen số 71 lớn hơn số cuối cùng là 56 thì vị trí là n+1 => vị tri 7

Trang 7

Chương trình viết như sau:

// Xuat ket qua

Assign(Output, 'DaySo.Out'); ReWrite(Output);

For i:=1 to n do Write(A[i], ' '); WriteLn;

Write(vt);

Close(Output);

End

Trang 8

Hướng giải quyết:

 Tính độ dài đoạn thẳng AB theo công thức

AB = SQRT ( (SQR(Xb-Xa)+SQR(Yb-Ya)) )

 Tính diện tích tam giác theo công thức Heron:

DT = SQRT ( p.(p-a).(p-b).(p-c) ) trong đó p là nửa chu

vi của tam giác có 3 cạnh a, b, c

Nếu điểm M nằm trong tam giác ABC thì diện tích tam giác (DT)

DT MAB + DT MBC+ DT MAC = DT ABC

Trang 9

 Tuy nhiên khi so sánh 2 số dạng số thực real cần làm một Function so sánh 2 số, nếu chênh lệch giữa 2 số < 0.0001 thì hai số là bằng nhau

Chương trình viết như sau:

Var Xa,Ya,Xb,Yb,Xc,Yc,Xm,Ym: LongInt;

DTabc, DT3tg: Real; Ch: String;

{ -} Function SoSanh(X,Y: Real): Boolean;

Begin

If abs(X-Y)<0.0001 then Exit(True) else Exit(False); End;

{ -} Function DoDai(Xa,Ya,Xb,Yb: Integer): Real;

Begin

Exit(SQRT(SQR(Xb-Xa)+SQR(Yb-Ya)));

End;

{ -} Function DienTich(Xa,Ya,Xb,Yb,Xc,Yc: Integer): Real; Var a,b,c,p: Real;

Trang 10

Hướng giải quyết:

Làm Function xét xem một số k có phải là số nguyên tố hay không:

- Nếu k<2 => k không phải là số nguyên tố, thoát Function

- Thử lấy số dư k chia các giá trị từ 2 đến căn bậc 2 của số k, td: k=17 thì thử các

giá trị từ 2 đến 4, nếu chia hết (số dư = 0) => k không phải là số nguyên tố, thoát

- (*) Tăng i đến khi nào là số nguyên tố thì ngưng (i=5), NT1=i=5, tăng i lên 1 (i=6)

- Tăng i đến khi nào là số nguyên tố thì ngưng (i=7), NT1=i=7, tăng i lên 1 (i=8)

- Ghép NT1 và NT2 (57) không là số nguyên tố ghép

- Nếu là số nguyên tố ghép (31 và 37 thành 3137) => tăng biến đếm (=2)

- Lặp lại bước (*) đến khi biến đếm=k thì ngưng

Chương trình viết như sau:

Var

i, k: QWord; Loi: Integer;

Ghep, Dem, LT10, NT1, NT2: QWord;

Ch1, Ch2: String;

{ -} Function NT(k: QWord): Boolean;

Trang 11

If k mod i=0 then Exit(False);

While Dem<k do Begin

While Not NT(i) do Inc(i); NT1:=i; Inc(i);

While Not NT(i) do Inc(i); NT2:=i; Inc(i);

- Với k khá lớn (500) thì chương trình chạy vẫn được nhưng chậm

- Có thể dùng sàng nguyên tố Erastothenes giải quyết để chương trình đáp ứng được

thời gian (sẽ đề cập sau này trong các bài toán về số nguyên tố nâng cao trong

các tập tiếp theo )

Trang 12

Đề thi Tin học trẻ TP Qui Nhơn năm 2018

Khối Trung học Cơ sở

Thời gian làm bài: 150 phút

Hướng giải quyết:

Làm Function xét xem một số k có phải là số nguyên tố hay không (tham khảo

câu 3 – Đề thi huyện Hoa Lư năm 2018)

 Phân tích số 120 thành thừa số nguyên tố:

- Đặt biến NT=2

- (*) Trong khi n=120 chia hết cho 2 thì ghi kết quả và chia 120 cho 2:

120 -> 60 -> 30 ->15 => 2*2*2

- Tăng NT lên 1 (3), trong khi NT không phải là số nguyên tố thì tăng giá trị của NT

- Thực hiện lại bước (*) trong khi n>1:

For i:=2 to Trunc(SQRT(k)) do

If k mod i=0 then Exit(False);

Trang 13

NT:=2;

Write(n,'=');

While n>1 do Begin

While n mod NT=0 do Begin

// So cuoi khong ghi dau *

If n<>NT then Write(NT,'*') else Write(NT);

 Nối lại thành chuổi:

'thi' '' 'tin' '' 'hoc' '' 'tre' '' 'nam' ''

'' '5' '' '9' '' '10' '' '21' '' '2018'

 thi5tin9hoc10tre21nam2018

Chú ý: Khi sắp thứ tự cần đổi chuổi thành số bằng hàm Val, nếu không sẽ bị sai

kết quả do khi so sánh chuổi ta lại có '21 ' > ' 2018 '

Chương trình viết như sau:

Var Ch: String; i, j, Dem, SoI, SoJ, Loi: Integer;

So, Tu: Array [1 100] of String; Tam: String;

Begin

Write('Ban hay nhap chuoi can sap thu tu '); ReadLn(Ch); i:=1; Dem:=0;

// Tach tu va so

Trang 14

While i<length(Ch) do Begin

If Pos(Ch[i],'0123456789')>0 then Begin // Ch[i] la so

// Sap thu tu day so

For i:=1 to Dem-1 do

For j:=i+1 to Dem do Begin

Val(So[i], SoI, Loi); Val(So[j], SoJ, Loi);

If (So[i]<>'') and (So[j]<>'') and (SoI>SoJ) then

For i:=1 to Dem do Begin

If So[i]<>'' then Ch:=Ch+So[i];

If Tu[i]<>'' then Ch:=Ch+Tu[i];

End;

Write('Chuoi da sap thu tu la: ', Ch);

End

Trang 15

Hướng giải quyết:

Dùng hàm EOF() để đọc file Input khi không cho biết số dòng

Dùng hàm Trim để cắt bỏ các khoảng trắng khi dịnh dạng số thực Real

Chương trình viết như sau:

Uses SysUtils; // Dung ham trim

Var Ch, ChTB: String; Min, Max, Tong, n: LongInt;

If Min>Length(Ch) then Min:=Length(Ch);

If Max<Length(Ch) then Max:=Length(Ch);

End;

Close(Input);

WriteLn('So ky tu dong ngan nhat: ', Min);

WriteLn('So ky tu dong dai nhat: ', Max);

Str(Tong/n:20:1, ChTB);

WriteLn('So ky tu trung binh cac dong: ', Trim(ChTB));

End

Trang 16

Hướng giải quyết:

Tìm ước chung lớn nhất (UCLN) của 2 số bằng cách:

- (*) Nếu a>b => a:=a-b, ngược lại b:=b-a

- Lặp lại bước (*) cho đến khi a=b thì UCLN là a hay b

Tìm ước chung lớn nhất (UCLN) của nhiều số a1, a2, a3…, an bằng cách:

- Đặt biến UC=UCLN(a1,a2)

- Tìm UC:=UCLN(UC,ai) với i chạy từ 3 đến n

UC chính là UCLN của dãy số

Tìm bội chung nhỏ nhất (BCNN) của 2 số bằng cách:

BCNN(a,b)=a*b div UCLN(a,b)

Tìm bội chung nhỏ nhất của nhiều số a1, a2, a3…, an bằng cách:

- Đặt biến BC=BCNN(a1,a2);

- Tìm BC:=BCNN(BC,ai) với i chạy từ 3 đến n

BC chính là BCNN của dãy số

Chương trình viết như sau:

Var n, i: Integer; A: Array [1 1000] of LongInt; BC:

Trang 17

Exit(a*b div UCLN(a,b));

Trang 18

Đề thi Tin học trẻ TP Ninh Bình năm 2018

Khối Trung học Cơ sở

Thời gian làm bài: 120 phút

Hướng giải quyết:

 Đối với các đề bài có liên quan đến số nguyên tố, đầu tiên nên viết một Function

NT để xét một số có phải là số nguyên tố hay không

 Vòng lặp While true do … Sẽ chạy vô điều kiện và chạy hoài đến khi nào chúng

ta tìm được kết quả và Break nó

- Đặt biến NT1 là số nguyên tố đầu tiên (là 2)

- (*) Đặt biến NT2 là NT1+1 (là 3), nếu chưa phải là số nguyên tố thì tăng NT2 đến

khi nào là số nguyên tố thì ngưng Do 3 là số nguyên tố nên NT2=3 không tăng

- Nếu NT2-NT1>=k thì Break

- Gán NT1:=NT2 (là 3) và quay trở lại bước (*)

Chương trình viết như sau:

Var k: Integer; NT1, NT2: LongInt;

{ -} Function NT(k: LongInt): Boolean;

Var i: LongInt;

Begin

If k<2 then Exit(False);

For i:=2 to Trunc(SQRT(k)) do

If k mod i=0 then Exit(False);

Exit(True);

Trang 19

Hướng giải quyết:

Tìm Min và Max của dãy số, TD: 9 7 14 10 11 thì Min=7 và Max=14

 Viết Function tìm một số k có trong dãy số đã cho hay không

Dùng vòng For với biến i chạy từ Min (7) đến Max (14) quét trên dãy số, nếu giá

trị i không có trong dãy số thì cộng dồn vào biến tổng

Trang 20

Chương trình viết như sau:

Var n, i: Integer; A: Array [1 10000] of LongInt;

Min, Max: LongInt; Tong: QWord;

{ -} Function TimSo(k: LongInt): Boolean;

For i:=2 to n do Begin

If Min>A[i] then Min:=A[i];

If Max<A[i] then Max:=A[i];

End;

// Tong cac so khong co trong day so

For i:=Min to Max do

If not TimSo(i) then Tong:=Tong+i;

Trang 21

Hướng giải quyết:

Thời điểm sớm nhất tất cả các bóng đèn sẽ sáng là bội số chung nhỏ nhất của

dãy số chu kỳ TD:

- Đèn 1 có chu kỳ 4 sẽ sáng tại các thời điểm 4, 8, 12, 16…

- Đèn 2 có chu kỳ 6 sẽ sáng tại các thời điểm 6, 12, 18…

- Thời điểm sớm nhất 2 bóng đèn sẽ sáng là 12, chính là bội chung nhỏ nhất của 4

và 6

Trang 22

Chương trình viết như sau:

Var n, i: Integer; A: Array [1 1000] of LongInt; BC:

LongInt;

{ -} Function UCLN(a,b: LongInt): LongInt;

Ngày đăng: 31/03/2019, 02:25

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w