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
Đề 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: - - Với n=7 có lần so sánh: Số thứ (3) thứ (3) Số thứ (6) thứ (6) Số thứ (1) thứ (1) Với n=8 có số dãy số 2 có lần so sánh: Số thứ (3) thứ (3) Số thứ (6) thứ (6) Số thứ (1) thứ (1) Số thứ (1) thứ (2) Số lần so sánh n div - Với n=7, số thứ so sánh với số thứ số thứ so sánh với số thứ số thứ so sánh với số thứ Vậy số thứ i so sánh với số thứ n+1-i - Trong trình so sánh cần số thứ i khác với số thứ n+1-i dãy cho không đối xứng nên cần thông báo kết kết thúc, không cần so sánh thêm Chương trình viết Free Pascal sau: (các dòng có màu xanh có // đứng trước thích, khơng cần viết vào chương trình) Var a: Array [1 100] of Integer; // De thi khong cho biet moi so cua day so nam // khoang nao n, i: Integer; Begin Assign(Input,'DaySo.Inp'); Reset(Input); ReadLn(n); For i:=1 to n Read(a[i]); Close(Input); Assign(Output,'DaySo.Out'); ReWrite(Output); For i:=1 to n 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 Hướng giải quyết: - Tìm vị trí số (3), dò từ đến đếm số lớn có 5, => Tìm vị trí số (5), dò từ đến đếm số lớn có 5, 9, => Tìm vị trí số (9), dò từ đến đếm số lớn có 5, 9, 8, 6, 4, => Tìm vị trí số thứ i (vt), dò từ đến vt-1 đếm số lớn i Chương trình viết sau: (các dòng có màu xanh có // đứng trước thích, khơng cần viết vào chương trình) Var n, i, j, vt, Dem: Integer; A, NT: Array [1 20] of Integer; // De thi khong cho biet gioi han cua n va cac so cua day // so Begin Write('Ban hay nhap so n '); ReadLn(n); WriteLn('Ban hay nhap ', n, ' so cua hoan vi '); For i:=1 to n Read(A[i]); For i:=1 to n Begin Dem:=0; // Tim vi tri vt cua i For vt:=1 to n If i=A[vt] then Break; For j:=1 to vt-1 If A[j]>i then Inc(Dem); NT[i]:=Dem; End; // Dem WriteLn('Nghich the cua hoan vi:'); For i:=1 to n Write(NT[i], ' '); End Hướng giải quyết: - Tạo chuổi A ghép số từ đến n Do chuổi có 256 ký tự nên cần khai báo {$H+} để chuổi chứa nhiều chữ số (n | => - So sánh số thứ với số thứ 3, lớn đổi chỗ - > | => Sau xếp dãy số tăng dần, TD: 22 36 56 Muốn chen số 15 vào dãy số: - Dò từ đầu dãy số, đến số lớn số 15 ngưng => vị trí - Chen số 71 lớn số cuối 56 vị trí n+1 => vị tri Chương trình viết sau: Const MaxN=10000; Var n, k, i, j, vt: Integer; A: Array [1 MaxN] of LongInt; t: LongInt; Begin Assign(Input,'XepCay.Inp'); Reset(Input); ReadLn(n); For i:=1 to n Read(A[i]); ReadLn(k); // Sap thu tu day so For i:=1 to n-1 For j:=i+1 to n If A[i]>A[j] then Begin t:=A[i]; A[i]:=A[j]; A[j]:=t; End; // Tim vi tri de chen so k vt:=1; While (k>A[vt]) and (vt k khơng phải số ngun tố, Function - Đến k số nguyên tố Tìm số nguyên tố ghép thứ k: - Xuất phát từ số nguyên tố 3, i=4, số nguyên tố ghép 23, biến đếm=1 - (*) Tăng i đến số nguyên tố ngưng (i=5), NT1=i=5, tăng i lên (i=6) Tăng i đến số nguyên tố ngưng (i=7), NT1=i=7, tăng i lên (i=8) - Ghép NT1 NT2 (57) không số nguyên tố ghép - Nếu số nguyên tố ghép (31 37 thành 3137) => tăng biến đếm (=2) - Lặp lại bước (*) đến biến đếm=k ngưng Chương trình viết sau: Var i, k: QWord; Loi: Integer; Ghep, Dem, LT10, NT1, NT2: QWord; Ch1, Ch2: String; { -} Function NT(k: QWord): Boolean; Var i: LongInt; Begin If k 30 ->15 => 2*2*2 - Tăng NT lên (3), NT số nguyên tố tăng giá trị NT - Thực lại bước (*) n>1: NT=3: 15 -> => 2*2*2*3 NT=5: -> => 2*2*2*3*5 Chương trình viết sau: Var n, NT: LongInt; { -} Function SNT(k: LongInt): Boolean; Var i: Integer; Begin If k1 Begin While n mod NT=0 Begin // So cuoi khong ghi dau * If nNT then Write(NT,'*') else Write(NT); n:=n div NT; End; Inc(NT); While not SNT(NT) Inc(NT); End; End Hướng giải quyết: Tách chuổi thi10tin21hoc9tre5nam2018 thành: - Chuổi từ: 'thi' '' 'tin' '' 'hoc' '' 'tre' '' 'nam' '' - Chuổi số: '' '10' '' '21' '' '9' '' '5' '' '2018' Sắp thứ tự chuổi số: '' '10' '' '21' '' '5' '' '9' Nối lại thành chuổi: 'thi' '' '' 'tin' '5' '' '' '' '9' '' '5' '' '2018' '10' '' '21' '' '2018' '' 'hoc' '' 'tre' '' 'nam' '' '9' '' '10' '' '21' '' '2018' thi5tin9hoc10tre21nam2018 Chú ý: Khi thứ tự cần đổi chuổi thành số hàm Val, không bị sai kết so sánh chuổi ta lại có '21' > '2018' Chương trình viết 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 While i0 then Begin // Ch[i] la so Inc(Dem); While Pos(Ch[i],'0123456789')>0 Begin So[Dem]:=So[Dem]+Ch[i]; Inc(i); End; End else Begin // Ch[i] la chu Inc(Dem); While Pos(Ch[i],'0123456789')=0 Begin Tu[Dem]:=Tu[Dem]+Ch[i]; Inc(i); End; End; End; // Sap thu tu day so For i:=1 to Dem-1 For j:=i+1 to Dem Begin Val(So[i], SoI, Loi); Val(So[j], SoJ, Loi); If (So[i]'') and (So[j]'') and (SoI>SoJ) then Begin Tam:=So[i]; So[i]:=So[j]; So[j]:=Tam; End; End; // Noi tu va so Ch:=''; For i:=1 to Dem 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 Hướng giải quyết: Dùng hàm EOF() để đọc file Input khơng cho biết số dòng Dùng hàm Trim để cắt bỏ khoảng trắng dịnh dạng số thực Real Chương trình viết sau: Uses SysUtils; // Dung ham trim Var Ch, ChTB: String; Min, Max, Tong, n: LongInt; Begin Assign(Input, 'DuLieu.Inp'); Reset(Input); Min:=MaxLongInt; Max:=-MaxLongInt; While not EOF() Begin ReadLn(Ch); Inc(n); Tong:=Tong+Length(Ch); If Min>Length(Ch) then Min:=Length(Ch); If Maxb => a:=a-b, ngược lại b:=b-a Lặp lại bước (*) a=b UCLN a hay b Tìm ước chung lớn (UCLN) nhiều số a1, a2, a3…, an cách: Đặt biến UC=UCLN(a1,a2) Tìm UC:=UCLN(UC,ai) với i chạy từ đến n UC UCLN dãy số Tìm bội chung nhỏ (BCNN) số cách: BCNN(a,b)=a*b div UCLN(a,b) Tìm bội chung nhỏ nhiều số a1, a2, a3…, an cách: - Đặt biến BC=BCNN(a1,a2); - Tìm BC:=BCNN(BC,ai) với i chạy từ đến n BC BCNN dãy số Chương trình viết sau: Var n, i: Integer; A: Array [1 1000] of LongInt; BC: LongInt; { -} Function UCLN(a,b: LongInt): LongInt; Begin While ab If a>b then a:=a-b else b:=b-a; Exit(a); End; { -} Function BCNN(a,b: LongInt): LongInt; Begin Exit(a*b div UCLN(a,b)); End; {=========================================================} Begin Assign(Input,'DaySo.Inp'); Reset(Input); While not EOF() Begin Inc(n); Read(A[n]); End; Close(Input); BC:=BCNN(A[1],A[2]); For i:=3 to n BC:=BCNN(BC,A[i]); Assign(Output,'DaySo.Out'); ReWrite(Output); WriteLn(BC); Close(Output); End Đề 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ó liên quan đến số nguyên tố, nên viết Function NT để xét số có phải số nguyên tố hay khơng Vòng lặp While true … Sẽ chạy vơ điều kiện chạy hồi đến tìm kết Break - Đặt biến NT1 số nguyên tố (là 2) - (*) Đặt biến NT2 NT1+1 (là 3), chưa phải số nguyên tố tăng NT2 đến số nguyên tố ngưng Do số nguyên tố nên NT2=3 không tăng - Nếu NT2-NT1>=k Break - Gán NT1:=NT2 (là 3) quay trở lại bước (*) Chương trình viết sau: Var k: Integer; NT1, NT2: LongInt; { -} Function NT(k: LongInt): Boolean; Var i: LongInt; Begin If k=k then Break; NT1:=NT2; End; Assign(Output, 'NgTo.Out'); ReWrite(Output); Write(NT1, ' ', NT2); Close(Output); End Hướng giải quyết: Tìm Min Max dãy số, TD: 14 10 11 Min=7 Max=14 Viết Function tìm số k có 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 dãy số, giá trị i khơng có dãy số cộng dồn vào biến tổng Chương trình viết sau: Var n, i: Integer; A: Array [1 10000] of LongInt; Min, Max: LongInt; Tong: QWord; { -} Function TimSo(k: LongInt): Boolean; Var i: Integer; Begin For i:=1 to n If k=A[i] then Exit(True); Exit(False); End; {=========================================================} Begin Assign(Input,'DaySo.Inp'); Reset(Input); ReadLn(n); For i:=1 to n Read(A[i]); Close(Input); // Tim Min va Max Min:=A[1]; Max:=A[1]; For i:=2 to n Begin If Min>A[i] then Min:=A[i]; If Maxb then a:=a-b else b:=b-a; Exit(a); End; { -} Function BCNN(a,b: LongInt): LongInt; Begin Exit(a*b div UCLN(a,b)); End; {=========================================================} Begin Assign(Input,'DenNhay.Inp'); Reset(Input); While not EOF() Begin Inc(n); Read(A[n]); End; Close(Input); BC:=BCNN(A[1],A[2]); For i:=3 to n BC:=BCNN(BC,A[i]); Assign(Output,'DenNhay.Out'); ReWrite(Output); WriteLn(BC); Close(Output); End ... chuổi thi1 0tin2 1hoc9 tre5 nam2 018 thành: - Chuổi từ: 'thi' '' 'tin' '' 'hoc' '' 'tre' '' 'nam' '' - Chuổi số: '' '10 ' '' ' 21' '' '9' '' '5' '' '2 018 ' Sắp thứ tự chuổi số: '' '10 ' '' ' 21' ''... lại thành chuổi: 'thi' '' '' 'tin' '5' '' '' '' '9' '' '5' '' '2 018 ' '10 ' '' ' 21' '' '2 018 ' '' 'hoc' '' 'tre' '' 'nam' '' '9' '' '10 ' '' ' 21' '' '2 018 ' thi5 tin9 hoc1 0tre2 1nam2 018 Chú ý: Khi... thi huyện Hoa Lư năm 2 018 ) Phân tích số 12 0 thành thừa số nguyên tố: - Đặt biến NT=2 - (*) Trong n =12 0 chia hết cho ghi kết chia 12 0 cho 2: 12 0 -> 60 -> 30 -> 15 => 2*2*2 - Tăng NT lên (3), NT