48
TÀI LIỆU ÔN TẬP TIN HỌC TRẺ (Free Pascal) Biên soạn: KS. Nguyễn Thanh Sang 0908 811 528 [email protected] Tháng 05/2017 Tài liệu có sử dụng tư liệu từ internet và đồng nghiệp

TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

TÀI LIỆU ÔN TẬP

TIN HỌC TRẺ (Free Pascal)

Biên soạn: KS. Nguyễn Thanh Sang 0908 811 528 [email protected]

Tháng 05/2017 Tài liệu có sử dụng tư liệu từ internet và đồng nghiệp

Page 2: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

TÀI LIỆU ÔN TẬP

TIN HỌC TRẺ (Free Pascal)

Biên soạn: KS. Nguyễn Thanh Sang 0908 811 528 [email protected]

Page 3: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 1

BẢNG B (THCS) VÀ BẢNG C (THPT) Lập trình bằng FREE PASCAL để giải các bài toán khó hoặc lập trình để thực hiện một

số công việc thông thường bằng máy vi tính. - Mức độ khó tương ứng với mặt bằng trình độ chung của mỗi cấp học. Nêu cao tính sáng

tạo của học sinh trong việc xác định thuật toán để giải, phương pháp kiểm tra tính đúng đắn của dữ liệu đầu vào.

- Đặc biệt yêu cầu học sinh phải thao tác thành thạo trên các loại dữ liệu có cấu trúc (dữ liệu kiểu mảng, kiểu xâu, kiểu tệp, kiểu bản ghi,...).

- Học sinh phải nắm rõ các phương pháp nhập dữ liệu vào (từ tệp văn bản) và phương pháp xuất kết quả ra (in vào tệp văn bản). I. CÁC THÀNH PHẦN CƠ BẢN CỦA FREE PASCAL: 1. Bộ ký tự: - Bộ 26 chữ Latin : A - Z a - z

- Bộ số thập phân : 0 - 9

- Bộ số thập lục phân : 0 - 9 A - F a - f

- Ký tự gạch nối dưới : _

- Ký hiệu toán tử, toán học : + - * / = < > [ ] . , ( ) : ^ @ { } $ # và theo sau là <= >= := += -= *= /= (* *) (. .) //

2. Chú thích: (*Chú thích khoảng*)

{Chú thích khoảng}

//Chú thích dòng

3. Từ khóa: absolute and array asm begin case const constructordestructor div do downto dispose else end exit

file for function false goto if implementation in inherited inline interface label mod nil not new

object of on operator or packed procedure program record reintroduce repeat self set shl shr string

then to true type unit until uses var while with xor

Page 4: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 2

4. Tên chuẩn: Integer Shortint SmallInt Longint Longword Int64 Byte Word Cardinal QWord Boolean ByteBool WordBool LongBool Char

False True Maxint Abs Arctan Chr Cos Sin Eof Eoln

Exp Ln Odd Ord Round Trunc Spr Pred Succ Dispose New Get Put Read readln

Write Writeln Reset Rewrite

5. Danh hiệu (identifier) tự đặt: Dùng danh hiệu để đặt tên cho biến, kiểu, hằng, chương trình con (hàm - Function, thủ tục - Procedure). Cách đặt như sau : - Bắt đầu bằng chữ cái, sau đó có thể là chữ cái, chữ số hay là dấu nối, không được có khoảng trắng và độ dài tối đa cho phép là 127.

Ví dụ: x; S1; Delta; PT_bac_2

- Danh hiệu không phân biệt chữ hoa, chữ thường

Ví dụ: aZ, az, Az, AZ là một

- Danh hiệu nên đặt sao cho chúng nói lên các ý nghĩa của đối tượng mà chúng ta biểu thị. Điều này sẽ giúp chúng ta dễ gọi khi viết chương trình. 6. Các phím chức năng cần biết: - F2 : Lưu chương trình trong khi soạn thảo - F3 : Tạo một file .pas mới hoặc mở file cũ - F9 : Dịch thử chương trình để kiểm tra lỗi - Ctrl + F9: Chạy chương trình (biên dịch file .exe) - Alt + F5 : Xem kết quả chạy chương trình - Alt + X : Thoát khỏi FreePascal I. CẤU TRÚC CỦA MỘT CHƯƠNG TRÌNH FREE PASCAL: Program Tên_chương_trình; Tên chương trình

Uses…; Khai báo thư viện

Label…; Khai báo nhãn

Const…; Khai báo hằng

Type…; Khai báo kiểu

Page 5: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 3

Var…; Khai báo biến

Procedure…; Thủ tục

Function…; Hàm

BEGIN Bắt đầu chương trình chính

… Thực hiện các lệnh chương trình chính

END. Kết thúc chương trình chính (có “.”)

Ví dụ: PROGRAM Hello;

USES Crt;

VAR Ten: String;

Procedure Nhap;

Begin

Clrscr;

Write(‘Hello! Ban ten gi?…’);

Readln(Ten);

End;

BEGIN

Nhap;

Writeln(‘Chao mung ban: ’, Ten);

Readln;

END.

Kết quả chương trình khi gõ Ctrl + F9 và Alt + F5 để xem:

Hello! Ban ten gi?... (ta gõ) Nguyen Thi An An (gõ enter) Chao mung ban: Nguyen Thi An An

* Giải thích: - Tên chương trình là Hello. - Sử dụng thư viện Crt - liên quan đến chế độ text của chương trình. - Biến Ten có kiểu là String (chuỗi). - Thủ tục có tên Nhap để thực hiện việc nhập tham số vào biến Ten của chương trình. - Phần chương trình chính từ BEGIN đến END (có dấu chấm “.”) kết thúc chương trình. - Sau các câu lệnh và từ End của các chương trình con và đoạn lệnh phải có dấu chấm phẩy “;”. Sau Begin không có dấu, sau End kết thúc chương trình là dấu chấm “.”. III. MỘT VÀI CHƯƠNG TRÌNH ĐƠN GIẢN LÀM QUEN VỚI FREE PASCAL: Ví dụ 1:

Page 6: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 4

Program GioiThieu;

Begin

Writeln(‘Trung tam Tin hoc va Thong tin KHCN Vinh Long‘);

Write(‘111 - Nguyen Hue - P2 - TP. Vinh Long - Tel: 0703 862339‘);

Readln;

End.

* Giải thích chương trình GioiThieu: - Program : tên chương trình - Begin : từ khóa cho biết bắt đầu chương trình - Writeln : xuất ra màn hình dòng chữ đặt trong dấu nháy đơn và chuyển con trỏ xuống dòng. - Write : xuất ra màn hình dòng chữ trong dấu nháy đơn nhưng không chuyển con trỏ xuống dòng. - Readln : dừng màn hình xem kết quả - End : cho biết kết thúc chương trình.

Ví dụ 2: Program DonXinPhep;

Uses CRT;

Begin

ClrScr;

Writeln(‘**********************************’);

Writeln(‘Cong hoa Xa hoi Chu nghia Viet Nam‘);

Writeln(‘ Doc Lap - Tu Do - Hanh Phuc ‘);

Writeln(‘ * DON XIN PHEP NGHI HOC * ‘);

Writeln(‘**********************************’);

Writeln(‘...‘);

Readln;

End.

* Giải thích chương trình GioiThieu: - Program : tên chương trình

- Uses Crt : dùng thư viện Crt (có lệnh ClrScr;)

- Begin : từ khóa cho biết bắt đầu chương trình - ClrScr : lệnh xóa sạch màn hình. - Writeln: xuất ra màn hình dòng chữ đặt trong dấu nháy đơn và chuyển con trỏ xuống dòng. - Write: xuất ra màn hình dòng chữ trong dấu nháy đơn nhưng không xuống dòng. - Readln: dừng màn hình xem kết quả

Page 7: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 5

- End: cho biết kết thúc chương trình.

IV. MỘT VÀI KIỂU DỮ LIỆU CƠ BẢN CỦA FREE PASCAL: Dữ liệu (data) là tất cả những gì mà máy tính xử lý.

Chương trình = thuật toán + cấu trúc dữ liệu Kiểu dữ liệu gồm các loại sau: - Kiểu đơn giản: số nguyên (integer), số thực (real), logic (boolean), ký tự (char). - Kiểu có cấu trúc (structure type): mảng (array), chuỗi (string), bản ghi (record), tập hợp (set), tập tin (file). - Kiểu con trỏ (pointer). 1. Kiểu số nguyên (Integer Type): * Từ khóa: Free Pascal đã khắc phục được những bài toán số lớn trong Turbo Pascal 7.0:

Từ khóa Phạm vi byte

Byte Shortint Smallint Word Integer Cardinal Longint Longword Int64 QWord

0 .. 255 -128 .. 127

-32768 .. 32767 0 .. 65535

smallint - longint longword

-2147483648 .. 2147483647 0 .. 4294967295

-9223372036854775808 .. 9223372036854775807 0 .. 18446744073709551615

1 1 2 2 2-4 4 4 4 8 8

* Các phép toán sử dụng:

Ký hiệu Ý nghĩa + Cộng - Trừ * Nhân / Chia cho kết quả là số thực div Chia lấy phần nguyên mod Chia lấy phần dư succ(n) n + 1 (tăng n lên 1 đơn vị)

pred(n) n - 1 (giảm n 1 đơn vị)

odd(n) TRUE nếu n lẻ, FALSE nếu n chẵn

2. Kiểu số thực (Real type):

Page 8: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 6

* Từ khóa: số thực có thể viết theo kiểu có dấu chấm thập phân bình thường hoặc viết theo kiểu thập phân có phần mũ và phần định trị.

Từ khóa Phạm vi byte

Real Single Double Extended Comp Currency

platform dependant 1.5E-45 .. 3.4E38

5.0E-324 .. 1.7E308 1.9E-4932 .. 1.1E4932

-2E64+1 .. 2E63-1 -922337203685477.5808 .. 922337203685477.5807

4-8 4 8 10 8 8

* Các phép toán sử dụng:

Ký hiệu Ý nghĩa + Cộng - Trừ * Nhân / Chia cho kết quả là số thực Abs(x) Lấy trị tuyệt đối của số x Sqr(x) Lấy bình phương của số x Sqrt(x) Lấy căn bậc hai của số x Sin(x) Lấy sin của số x

Cos(x) Lấy cosin của số x Arctan(x) Lấy arctang của số x Ln(x) Lấy logarit nepe của số x (e=2.71828) Exp(x) Lấy logarit nepe cơ số e của số x (ex) Trunc(x) Lấy phần nguyên lớn nhất < x Round(x) Làm tròn x, lấy số nguyên gần x nhất

3. Kiểu logic (Boolean): * Các phép toán: thể hiện qua 2 giá trị TRUE (đúng) và FALSE (sai). Qui ước TRUE > FALSE.

A B Not A A and B A or B A xor B

True True False True True False

True False False False True True

False True True False True True

False False True False False False

- Phép AND: Cho kết quả TRUE khi A=B=TRUE

Page 9: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 7

- Phép OR : Cho kết quả FALSE khi A=B=FALSE - Phép XOR: Cho kết quả TRUE khi A khác B. * Các phép so sánh:

Ký hiệu Ý nghĩa = Bằng nhau > Lớn hơn < Nhỏ hơn >= Lớn hơn hoặc bằng <= Nhỏ hơn hoặc bằng <> Khác nhau

4. Kiểu ký tự (Char type) : * Từ khóa: tất cả các dữ liệu viết ở dạng chữ ký tự đều được khai báo bởi từ khóa CHAR.

* Các hàm chuẩn: Ký hiệu Ý nghĩa Ord(c) Cho thứ tự của c trong bảng mã ASCII Chr(n) hay #n Cho ký tự có số thứ tự là n trong bảng mã ASCII Pred(c) Cho ký tự đứng trước ký tự c Succ(c) Cho ký tự đứng sau ký tự c

….. VÀ NHIỀU KIỂU DỮ LIỆU KHÁC V. CÁC HÀM THÔNG DỤNG TRONG PASCAL

HÀM CHỨC NĂNG HÀM THÔNG DỤNG ORD(kytu) Trả về số thứ tự của kytu trong bảng mã ASCII. CHR(so) Trả về kí tự ở vị trí so (có thể viết tắt là #so). PRED(kytu) Trả về kí tự nằm trước kí tự kytu trong bảng mã ASCII. SUCC(kytu) Trả về kí tự nằm sau kí tự kytu trong bảng mã ASCII. ASB(x) Giá trị tuyệt đối của x. SQR(x) x bình phương. SQRT(x) căn bậc 2 của x. ROUND(x) làm tròn phần lẻ thập phân của x, số nguyên gần với x

nhất. TRUNC(x) Lấy phần nguyên của x. INC(x) Tăng biến nguyên X lên 1 đơn vị. Delay(Tine) Tạo ra thời gian trễ time (miligiay). Time là một số

Page 10: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 8

HÀM CHỨC NĂNG nguyên. Delay thường dùng để làm chậm chương trình lại cho ta xem và khảo sát.

Sound(F) Tạo ra dao động âm thanh với tần số F; số nguyên, cho đến khi ta gọi Nosound

InsLine chèn một dòng trống vào màn hình ở vị trí con trỏ. DelLine Xóa toàn bộ dòng màn hình chứa con trỏ sau đó dồn các

dòng ở dưới lên. Exit Thoát vô điều kiện ra khỏi chương trình. Halt Dừng hẳn chương trình Break Thoát khỏi vòng lặp chứa lệnh Break. KeyPressed cho giá trị True khi ta nhấn phím nào đó trên bàn phím,

và kí tự đó còn chờ trong bộ nhớ đệm của bàn phím, chưa được đưa ra xử lí.

Int(X) Lấy phần nguyên của số thực X. Frac(x) Cho giá trị phần thập phân của số thực X. Randomize Khởi động chế độ phát sinh số ngẫu nhiên. Random Cho giá trị số thực Random. Random là một số ngẫu

nhiên nằm trong khoảng 0 và 1 (0 <= Random < 1) Random(Number) cho giá trị số nguyên Random, Random là một số ngẫu

nhiên nằm trong khoảng 0 và Number (0 <= Random < Number. Number phải là một số nguyên)

Upcase(ch) Đổi ký tự ch thành chữ hoa. SizeOf(x) Cho biết kích thước của biến hoặc kiểu có tên là X (tính

theo đơn vị Byte). Str(x,S) Ðổi giá trị kiểu số X sang dạng chuỗi S. Val(S,x,code) Đổi chuỗi S thành sô x.Nêu đổi chuỗi thành công biên

Code nhận giá trị 0. Nêu không đổi đc,code là sô nguyên cho biêt vtrí gây lỗi.

INC(x,r) Tăng giá trị của x nên r đơn vị. Tương đương với x=x+r; Thủ tục INC(x) tăng x 1 đơn vị

DEC(x,r) Giảm giá trị của x xuống r đơn vị. Tương đương với x=x-r. DEC(x) xem như giảm x một đơn vị

Insert(S,T,vt) Chèn chuoi S vào chuoi T vtrí vt. Delete(S,P,L) Xoá L ký tự từ vị trí P ra khỏi Break kết thúc vòng lặp Copy(S,P,L) Trích chuỗi S một chuỗi con dài L ký tự bắt đầu từ vtrí

P.

Page 11: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 9

HÀM CHỨC NĂNG Odd(I:Integer) Cho True khi I là sô lẻ và False khi I là sô chẵn Pos(X,S) Cho vị trí bắt đầu của chuỗi con X trong S. Nêu X không

thuộc S thì hàm POS cho giá trị 0. FillChar(a,SizeOf(a),0) Gán giá trị cho toàn bộ các phần tử của mảng a = 0

THỦ TỤC TRONG Unit Crt Clrscr xóa toàn bộ màn hình và đưa con trỏ về góc trái trên. ClrEol Xóa các ký tự nằm bên phải con trỏ. Gotoxy(x,y) đặt con trỏ tới tọa độ x, y của màn hình (x tọa độ cột từ 1

– 80, y tọa độ hang từ 1 – 25). TextColor(Color) Định màu cho văn bản (với Color có giá trị từ 0 – 15). TextBackGround(color) Đặt màu nền của văn bản. NormVideo Định độ sang bình thường. LowVideo Định độ sáng yếu đi. WhereX Tọa độ cột con trỏ màn hình hiện hành. WhereY Tọa độ hàng con trỏ màn hình hiện hành. Readkey Đọc một kí tự từ bàn phím vào biến.

XỬ LÝ FILE (với F1 là biến kiểu file) Assign(F1,<Tên tập tin>)

Gán tên file vào biến.

Rewrite(F1) Mở File mới để ghi vào. Reset(F1) Mở File đã có để đọc. Append(F1) Mở File đã có để ghi nối vào cuối (chỉ dùng cho File văn

bản). Read(F1, <DS biến>) Đọc dữ liệu từ File vào biến. Readln(F1, <DS sách biến>)

Đọc dữ liệu từ File vào biến, con trỏ tự động xuống dòng.

Write(F1, <DS biến>) Ghi dữ liệu từ biến vào File, xong có them dấu hết vào dòng File.

Close(F1) Đóng File. Flush(F1) Cập nhật lên File. EOF(F1) có giá trị True khi con trỏ ở cuối File. EOln(F1) có giá trị True khi con trỏ ở sau ký tự cuối cùng của một

dòng (File văn bản). SeekEOF(F1) Kiểm tra EOF, có bỏ qua các dấu cách Space, Tab và

dấu cách dòng (File văn bản).

Page 12: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 10

HÀM CHỨC NĂNG SeekEOLn(F1) Kiểm tra EOLn, có bỏ qua các dấu cách Space và Tab

(File văn bản). FileSize(F1) cho biết số record trong tập tin kiểu Record. FilePos(F1) Cho biết vị trí hiện hành của con trỏ file đang ở Record

nào (tính từ 0, nghĩa là nếu con trỏ File đang ở Record đầu tiên, FilePos(F1) sẽ trả về giá trị 0).

Seek(F1, n) Đưa con trỏ file đến cuối Record thứ n. Erase(F1) Xoá file, không được xoá một file đang mở. Rename(F1, tên mới) Đổi tên file F1 thành tên mới, không được đổi tên file

đang mở.

CÁC HÀM XUẤT VÀ NHẬP

write() in ra màn hình liền sau kí tự cuối. writeln() in xuống một hàng. read() đọc biến. readln(' ') đọc biến và xuống dòng

VI. PHẦN BÀI TẬP THAM KHẢO Cấu trúc chương trình dùng file văn bản cho nhập và xuất dữ liệu: PROGRAM Tên_chương_trình; Tên chương trình chính Const Fi=’Tên_File_Dữ_Liệu_Vào.inp’; Khai báo hằng Fi=’Tên_File_Dữ_Liệu_Ra.out’; Type…; Khai báo kiểu (nếu có) Var F:text; Khai báo biến toàn cục Procedure Tên_Thủ_Tục(Biến); Thủ tục Var …; Begin End; Function Tên_Hàm(Biến): Kiểu_Dữ_Liệu; Hàm Var …; Begin End; BEGIN Bắt đầu chương trình chính Gọi_Hàm; Gọi_Thủ_Tục; … Các lệnh chương trình chính END. Kết thúc chương trình chính Thủ tục đọc dữ liệu từ File văn bản: Nếu file chỉ có số N. Procedure Nhap; Var …; Begin

Nếu file có N dòng trên N phần tử thuộc mảng số A nào đó. Procedure Nhap; Var …;

Page 13: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 11

assign(F,Fi); reset(F); readln(F,n); Close(F);

End;

Begin assign(F,Fi); reset(F);

FillChar(a,SizeOf(a),0); i:=1; While not EOF(F) do

begin readln(F,A[i]);inc(i); end; Close(F);

End; Thủ tục ghi dữ liệu ỉa File văn bản: Nếu chỉ ghi ra số N. Procedure Xuat; Begin assign(F,Fo); rewrite(F); write(F,n); Close(F);

End;

Nếu ghi N phần tử thuộc mảng số A nào đó ra N dòng của file. Procedure xuat; Begin assign(F,Fo);rewrite(F); For i:=1 to N do writeln(F,A[i]); Close(F); End;

Bài 1: Tìm mối liên hệ Cứ mỗi 02 điểm cho trước sẽ có 02 mối liên hệ qua lại với nhau. Xem

hình minh họa bên, ta thấy, với 03 điểm cho trước A, B, C sẽ có 6 mối liên hệ qua lại với nhau: AB, BA, AC, CA, BC, CB. Hãy viết chương trình tìm tất cả các mối liên hệ qua lại từ N điểm cho trước.

- Dữ liệu vào: file văn bản moilienhe.inp chứa số tự nhiên N (N41.108) - Dữ liệu ra: file văn bản moilienhe.out chứa kết quả là tổng số tất cả

các mối liên hệ qua lại. Xem ví dụ bên dưới: moilienhe.inp moilienhe.out 3 6

ĐÁP ÁN, CHẤM Test moilienhe.inp moilienhe.out Điểm

1 3 6 1

2 999 997002 1

3 9999999 99999970000002 1

4 1000000000 999999999000000000 1

5 4100000000 16809999995900000000 1

Phụ lục chương trình tham khảo Program MoiLienHe; Var n: Qword; fi,fo:text; BEGIN assign(fi,'moilienhe.inp'); reset(fi);

readln(fi,n); assign(fo,'moilienhe.out'); rewrite(fo); Writeln(fo,n*(n-1)); close(fi);close(fo); END.

A

B

C

Page 14: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 12

Bài 2: Tìm mối liên hệ Cứ mỗi 02 điểm A, B cho trước sẽ có 01 mối liên hệ với nhau AB

hoặc BA. Xem hình bên ta thấy, với 3 điểm A, B, C cho trước sẽ có 3 mối liên hệ với nhau: AB, BC, CA. Hãy viết chương trình tìm tất cả các mối liên hệ thoả điều kiện trên từ N điểm cho trước.

- Dữ liệu vào: file văn bản moilienhe.inp chứa số nguyên dương N (N 60.108).

- Dữ liệu ra: file văn bản moilienhe.out chứa kết quả. Xem ví dụ bên dưới: moilienhe.inp moilienhe.out

3 3

ĐÁP ÁN, CHẤM Test moilienhe.inp moilienhe.out Điểm

1 2 1 0,5

2 3 3 0,5

3 110 5995 0,5

4 1000000 499999500000 0,5

5 123456789 7620789313366866 0,5

6 6000000000 17999999997000000000 0,5

Phụ lục chương trình tham khảo Program TimMoiLienHe; Var n: Qword; F:text; BEGIN assign(F,'moilienhe.inp'); reset(F); readln(F,n); close(F);

assign(F,'moilienhe.out'); rewrite(F); if n mod 2=0 then

Writeln(F,(n div 2)*(n-1)) else

Writeln(F,((n-1) div 2)*n); close(F); END.

Bài 3: In dãy số xuất hiện từ k lần trở lên

Cho dãy A có N (N 100) số tự nhiên (A[i] 100 (1 i N), mỗi số cách nhau đúng 01 dấu cách) và số tự nhiên K (K N 100). Hãy viết chương trình ghi ra các phần tử trong dãy A có số lần xuất hiện từ K lần trở lên theo thứ tự tăng dần, nếu không có thì ghi chữ ‘NO’.

- Dữ liệu vào: từ file văn bản indayso.inp gồm 2 dòng: dòng 1 ghi 2 số N và K cách nhau bởi 01 dấu cách; dòng 2 là dãy A (các số cách nhau đúng 01 dấu cách).

- Dữ liệu ra: file văn bản indayso.out chỉ một dòng duy nhất chứa kết quả (mỗi số cách nhau đúng 01 dấu cách). Xem ví dụ bên dưới:

indayso.inp indayso.out

10 2 1 2 1 1 5 5 20 20 5 5

1 5 20

5 2 0 1 2 3 4

NO

ĐÁP ÁN, CHẤM Test indayso.inp indayso.out Điểm

1 5 5 5 5 5 5 5

5 1

2 10 1 0 1 2 3 2 3 4 5 4 5

0 1 2 3 4 5 1

A

B

C

Page 15: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 13

3 10 6 5 5 5 5 5 10 10 10 10 10

NO 1

4 13 3 12 15 15 15 20 20 17 19 17 17 20 19 19

15 17 19 20 1

5 20 4 1 1 2 5 50 5 2 2 5 1 1 100 100 100 100 1 1 1 5 1

1 5 100 1

Phụ lục chương trình tham khảo Program InDaySoKLan; var a,b:array[0..100] of integer; n,j,i,k:integer; f:text; Procedure Nhap; begin assign(f,'InDaySo.inp'); reset(f); i:=0; FillChar(a,SizeOf(a),0); read(f,n); readln(f,k); While not eof(f) do begin read(f,a[i]); inc(i); end; close(f); end;

Procedure xuly; begin assign(f,'InDaySo.out'); rewrite(f); FillChar(b,SizeOf(b),0); j:=0; For i:=0 to n do inc(b[a[i]]); For i:=0 to 100 do if ((b[i]<>0) and (b[i]>=k)) then begin write(f,i,' ');inc(j); end; if j=0 then write(f,'NO'); close(f); end; BEGIN Nhap; xuly; END.

Bài 4: Đổi số hệ nhị phân sang hệ thập phân Số nhị phân là số chỉ sử dụng số 0 và 1. Hãy viết chương trình đổi chuỗi nhị phân S cho

trước thành số thập phân. - Dữ liệu vào: file văn bản 2to10.inp chứa chuổi nhị phân S (dài không quá 63 ký tự). - Dữ liệu ra: file văn bản 2to10.out chứa kết quả là số thập phân vừa đổi từ chuổi S. Xem

ví dụ:

2to10.inp 2to10.out

011 3

ĐÁP ÁN, CHẤM Test 2to10.inp 2to10.out Điểm

1 0011 3 1

2 111110000011111 31775 1

3 1001010100000010111110001111111111 9999999999 1

4 10...60 số 0...1 4611686018427387905 1

5 11...60 số 1...1 9223372036854775807 1

Phụ lục chương trình tham khảo Program Doi2_10; const So:array['0'..'1'] of byte=(0,1); var St:string;h,N:Qword;F:text; procedure D2_10 (S: string); var i:integer; begin h:=1; N:=0;i:=length(S); while i>0 do begin N:=N+So[S[i]]*h; h:=2*h; dec(i); end; end;

BEGIN assign(F,'2to10.inp'); reset(F); read(F,St); close(F); D2_10(St); assign(F,'2to10.out'); rewrite(F); write(F,N); close(F); END.

Page 16: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 14

Bài 5: Tìm ẩn Với một dãy số tự nhiên: a[1]=a[2]=a[3]=1 và a[n]=a[n-1]+a[n-3]. - Dữ liệu vào: file văn bản timan.inp chứa số nguyên dương n (n < 119). - Dữ liệu ra: file văn bản timan.out chứa kết quả là giá trị a[n] cần tìm (không chứa số 0

ở đầu). Xem ví dụ bên dưới: timan.inp timan.out

4 2

ĐÁP ÁN, CHẤM Test timan.inp timan.out Điểm

1 3 1 1

2 10 19 1

3 50 83316385 1

4 101 24382819596721629 1

5 118 16188319274058017956 1

Phụ lục chương trình tham khảo Program TimAn; Uses Crt; Const Fi='timan.INP'; Fo='timan.OUT'; Var i,n,a,b,c,d: Qword; F:text; BEGIN assign(F, Fi); reset(F); Readln(F,n); Close(F);

If n<=3 then a:=1 else Begin i:=4;b:=1;c:=1;d:=1; while i<=n do begin a:=b+d;d:=c;c:=b;b:=a;inc(i); end; End; assign(F, Fo); rewrite(F); write(F,a); Close(F); END.

Bài 6: Hai số là bạn Hai số được coi là bạn của nhau khi tổng các ước số của số này bằng số kia và ngược lại,

cụ thể: tổng ước số của M = N và tổng ước số của N = M thì M và N là bạn. Hãy viết chương trình nhập một số nguyên dương K (K 20.000) và liệt kê tất cả các cặp

số M, N là bạn của nhau (1 M, N K; M < N và cặp M, N là duy nhất, không tính cặp hoán vị). Nếu không có cặp M, N nào thì điền số 0.

- Dữ liệu vào: file văn bản solaban.inp chứa số nguyên dương K. - Dữ liệu ra: file văn bản solaban.out chứa i dòng, mỗi dòng là một cặp số M, N thoả

điều kiện nêu trên (M và N cách nhau đúng 01 khoảng cách). Xem ví dụ: solaban.inp solaban.out

300 220 284

10 0

ĐÁP ÁN, CHẤM Test solaban.inp solaban.out Điểm

1 200 0 1

2 500 220 284 1

3 3000 220 284 1184 1210 2620 2924

1

4 6300 220 284 1184 1210 2620 2924

1

Page 17: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 15

5020 5564

5 18000

220 284 1184 1210 2620 2924 5020 5564 6232 6368 10744 10856 12285 14595

1

Phụ lục chương trình tham khảo PROGRAM SoLaBan; Const Fi='solaban.INP'; Fo='solaban.OUT'; VAR n:QWord; kq:array[1..100] of QWord; F:text; Function TongUoc(k:QWord):QWord; Var i,tong:QWord; Begin tong:=0; i:=1; while i<= (k div 2) do begin if (k mod i) =0 then tong:=tong+i; inc(i); end; TongUoc:=tong; End; Function KiemTraKQ(a:QWord):boolean; var i:integer; Begin KiemTraKQ:=false; i:=1; while ((KiemTraKQ=false) and (i<=100)) do begin KiemTraKQ:=(kq[i]=a); inc(i); end; End;

Procedure GanKQ; Var m:QWord; j:integer; Begin FillChar(kq,SizeOf(kq),0); m:=1; j:=1; while m<=n do begin if ((TongUoc(TongUoc(m))= m) and (TongUoc(m)<>m) and TongUoc(m)<=n and (not KiemTraKQ(m))) then begin kq[j]:=TongUoc(m); kq[j+1]:=m; j:=j+2; writeln(F,m,' ',TongUoc(m)); end; inc(m); end; if j=1 then writeln(F,'0') End; BEGIN assign(F, Fi); reset(F); Readln(F,n); Close(F); assign(F, Fo); rewrite(F); GanKQ; Close(F); END.

Bài 6: Chuỗi Fibo nhị phân Xét dãy các xâu F1, F2, F3, ..., FN, ... trong đó: F1 = ‘0’, F2 = ‘1’, F3 = ‘01’, F4 = ‘100’, F5

= ‘01110’, FK+1 = FK + FK-1 ( là phủ định và 2 K 13) được xếp liên tục nhau. Cho xâu S độ dài không quá 255, chỉ bao gồm các ký tự ‘0’ và ‘1’. Hãy xác định số lần

xuất hiện xâu S trong xâu FK. (Chú ý: hai lần xuất hiện của S trong FK không nhất thiết phải là các xâu rời nhau hoàn toàn).

- Dữ liệu vào: file văn bản fibo01.inp bao gồm i dòng, mỗi dòng có dạng K S (K và S cách nhau đúng 01 khoảng cách).

- Dữ liệu ra: file văn bản fibo01.out, bao gồm i dòng, mỗi dòng là kết quả ứng với một dòng từ dữ liệu vào. Xem ví dụ:

fibo01.inp fibo01.out 3 1 3 10 8 011

1 0 3

ĐÁP ÁN, CHẤM Test fibo01.inp fibo01.out Điểm

1 3 1 3 10

1 0 1

Page 18: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 16

8 011 3

2 8 111 9 0110 7 10001

2 2 1

1

3 10 00 11 11000 12 101010

13 2 0

1

4 13 10 64 1

5 12 1011011 13 10110100000

5 0 1

Phụ lục chương trình tham khảo Program Fibo01; const InputFile = 'fibo01.INP'; OutputFile = 'fibo01.OUT'; var S: array[1..13] of String; n: Integer; Source: String; tmp:char; fi, fo: Text; procedure TaoFibo; var i,j: Integer; tam1,tam2:string; begin S[1] := '0'; S[2] := '1'; for i := 3 to 13 do begin tam1:=S[i-1]; tam2:=S[i-2]; for j:=1 to length(tam1) do if tam1[j]='0' then tam1[j]:='1' else tam1[j]:='0'; for j:=1 to length(tam2) do if tam2[j]='0' then tam2[j]:='1' else tam2[j]:='0'; S[i] := tam1+tam2; end; end;

Function Dem:longint; Var i:integer; tam1:string; Begin i:=1; Dem:=0; while i<= length(S[n])-length(Source)+1 do begin tam1:=Copy(S[n],i,length(Source)); if tam1=Source then inc(Dem); inc(i); end; End; BEGIN TaoFibo; Assign(fi, InputFile); Reset(fi); Assign(fo, OutputFile); Rewrite(fo); while not SeekEof(fi) do begin Readln(fi, n, tmp, Source); Writeln(fo, Dem); end; Close(fi); Close(fo); END.

Bài 7: Phân tích số hoàn hảo Số hoàn hảo là số có tổng các ước của nó (trừ nó) bằng chính nó (ví dụ: 6 = 1 + 2 + 3).

Hãy viết chương trình để phân tích số hoàn hảo: - Dữ liệu vào: file văn bản sohoanhao.inp chứa số nguyên dương N (N10.107). - Dữ liệu ra: file văn bản sohoanhao.out kết quả phân tích số hoàn hảo (mỗi số cách

nhau đúng 01 khoảng cách). Nếu không thể phân tích được thì ghi số 0. Xem ví dụ dưới: sohoanhao.inp sohoanhao.out 6 1 2 3 7 0

ĐÁP ÁN, CHẤM Test sohoanhao.inp sohoanhao.out Điểm

1 28 1 2 4 7 14 1

2 29 0 1

3 496 1 2 4 8 16 31 62 124 248 1

Page 19: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 17

4 8128 1 2 4 8 16 32 64 127 254 508 1016 2032 4064 1

5 100000000 0 1

Phụ lục chương trình tham khảo PROGRAM SoHoanHao; Const Fi='sohoanhao.INP'; Fo='sohoanhao.OUT'; var n:QWord; ch:char; F:text; Function hoanhao(m:Qword):string; Var i,S:Qword; st:string; begin hoanhao:=''; S:=0; i:=1; while i<=(m div 2) do begin if (m mod i)=0 then begin

S:=S+i; str(i,st); if hoanhao='' then hoanhao:=st else hoanhao:=hoanhao+' '+st; end; inc(i); end; if S<>m then hoanhao:='0'; end; BEGIN assign(F, Fi); reset(F); readln(F,n); Close(F); assign(F, Fo); rewrite(F); write(F,hoanhao(n)); Close(F); END.

Bài 8: Đảo ký tự Đảo ký tự là đưa ra tất cả các cách thay đổi vị trí của các ký tự đó trong một chuỗi ký tự

cho trước để tạo thành các chuỗi ký tự khác nhau (Ví dụ: cho chuỗi ký tự “abc” thì kết quả đảo ký tự sẽ là các chuỗi “abc”, “acb”, “bac”, “bca”, “cab”, “cba”)

Yêu cầu: viết chương trình thực hiện đảo ký tự như cách trên. - Dữ liệu vào: tệp văn bản daokytu.inp gồm: + Dòng đầu tiên: chứa số nguyên dương N; + N dòng tiếp theo: dòng thứ i (1 ≤ i ≤ N) chứa chuỗi S[i] (S[i] ≤ 9 ký tự); - Dữ liệu ra: tệp văn bản daokytu.out gồm tất cả các cách thay đổi vị trí của các ký tự trong

chuỗi S[i], mỗi cách nằm trên một dòng. Ví dụ:

daokytu.inp daokytu.out

2 ab cde

ab ba cde ced dce dec ecd edc

ĐÁP ÁN, CHẤM Test daokytu.inp daokytu.out Điểm

1 1 Le

Le eL

1

2 2 Le Ket

Le eL Ket Kte

1

Page 20: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 18

Test daokytu.inp daokytu.out Điểm eKt etK tKe teK

3 3 Ket Nap Dang

Ket Kte eKt etK tKe teK Nap Npa aNp apN pNa paN Dang .... (22 từ) gnaD

1

4 5 a ab c d abc

a ab ba c d abc acb bac bca cab cba

1

5 1 012

012 021 102 120 201 210

1

Phụ lục chương trình tham khảo Program DaoKyTu; var x: array[1..255] of char; c: array[1..255] of boolean; n,l,k,m: integer; fi,fo:text; chuoi:string; procedure InKQ; var i: integer; begin for i:=1 to l do write(fo,x[i]); writeln(fo); end; procedure GhiChuoi(i:integer); var j:integer; begin for j:=1 to l do if c[j] then begin

x[i]:=chuoi[j]; if i=l then InKQ else begin c[j]:=false; GhiChuoi(i+1); c[j]:=true; end; end; end; BEGIN assign(fi,'daokytu.inp'); reset(fi); readln(fi,n); assign(fo,'daokytu.out'); rewrite(fo); for k:=1 to n do begin readln(fi,chuoi);l:=length(chuoi); fillchar(c,sizeof(c),true); GhiChuoi(1); end; close(fi);close(fo); END.

Page 21: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 19

Bài 9: Đếm tam giác cân Cho N (N<=100) điểm trên lưới tọa độ Oxy, tính xem các điểm đó có thể tạo ra tối đa

bao nhiêu tam giác cân? - Dữ liệu vào : file văn bản

+ Dòng 1 : ghi số N là số điểm trên lưới tọa độ Oxy + N dòng tiếp: dòng thứ i ghi 2 số x, y (x, y <=100) nguyên thể hiện tọa độ điểm thứ

i, cách nhau ít nhất một dấu cách. - Dữ liệu ra : file văn bản chứa 1 số duy nhất là số tam giác cân tối đa có thể tạo được.

Xem ví dụ: demtgcan.inp demtgcan.out

4 0 0 1 0 2 0 1 1

3

ĐÁP ÁN, CHẤM ĐIỂM Test demtgcan.inp demtgcan.out Điểm

1 4 0 0

1 0

2 0 1 1

3 3

2 6 0 0 1 1 2 2 -1 0 -2 0 -3 0

0 1

3 6 0 1 -2 0 0 2 -1 0 -2 -2 0 -2

4 1

4 11 0 0 2 0 -1 0 -3 0 7 -2 14 8 0 1 23 23 4 -12 8 1 -4 -10

2 1

5 15 0 0 1 0 2 0 -1 0 -3 0

5 1

Page 22: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 20

Test demtgcan.inp demtgcan.out Điểm 25 11 7 -2 -11 -9 14 8 0 1 23 23 4 -12 -5 -7 8 1 -4 -10

Phụ lục chương trình tham khảo Program DemTGCan; const inFile='DemTGCan.inp'; outFile='DemTGCan.out'; max=100; var x:array[1..max] of real; y:array[1..max] of real; n,i,j,k,dem:integer; d1,d2,d3:real; f: text; procedure Nhap; begin assign(f,inFile); reset(f); readln(f,n); for i:=1 to n do

readln(f,x[i],y[i]); close(f); end; procedure Xuat; begin assign(f,outFile); rewrite(f); write(f,dem); close(f); end; function KT(x1,y1,x2,y2,x3,y3:real):Boolean; var a,b,d,da,db:real; begin d:=x1-x2; da:=y1-y2; db:=x1*y2-x2*y1; if (((x1=0) or (x2=0) or (x3=0)) and (y1=y2) and (y2=y3)) or (((y1=0) or (y2=0) or (y3=0)) and (x1=x2) and (x2=x3)) or ((x1=y1) and (x2=y2) and (x3=y3)) then KT:=true;

if d<>0 then begin a:=da/d; b:=db/d; if y3=a*x3+b then KT:=true else KT:=false; end; end; BEGIN Nhap; dem:=0; for i:=1 to n-2 do for j:=i+1 to n-1 do for k:=j+1 to n do begin if not KT(x[i],y[i],x[j],y[j],x[k],y[k]) then begin d1:=(x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i]); d2:=(x[k]-x[j])*(x[k]-x[j])+(y[k]-y[j])*(y[k]-y[j]); d3:=(x[i]-x[k])*(x[i]-x[k])+(y[i]-y[k])*(y[i]-y[k]); if (d1=d2) or (d2=d3) or (d3=d1) then inc(dem); end; end; Xuat; END.

Bài 10: Chuỗi Fibonacci Xét dãy các xâu F1, F2, F3, ..., FN, ... trong đó: F1 = 'A', F2 = 'B', FK+1 = FK + FK-1 (K 2).

Ví dụ: F1 = 'A' F2 = 'B' F3 = 'BA' F4 = 'BAB' F5 = 'BABBA' F6 = 'BABBABAB'

Page 23: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 21

F7 = 'BABBABABBABBA' F8 = 'BABBABABBABBABABBABAB' F9 = 'BABBABABBABBABABBABABBABBABABBABBA'

Cho xâu S độ dài không quá 255, chỉ bao gồm các ký tự 'A' và 'B'. Hãy xác định số lần xuất hiện xâu S trong xâu FN, N 35. Chú ý: hai lần xuất hiện của S trong FN không nhất thiết phải là các xâu rời nhau hoàn toàn.

- Dữ liệu vào: từ file văn bản FIBISTR.INP, bao gồm nhiều dòng, mỗi dòng có dạng N S. Giữa N và S có đúng 1 dấu cách. Dữ liệu vào là chuẩn, không cần kiểm tra.

- Dữ liệu ra: đưa ra file văn bản FIBISTR.OUT, mỗi dòng dữ liệu ứng với một dòng kết quả ra. Xem ví dụ:

FIBISTR.INP FIBISTR.OUT 3 A 3 AB 8 BABBAB

1 0 4

ĐÁP ÁN, CHẤM ĐIỂM Test fibistr.inp fibistr.out Điểm

1 26 ABBABABBABBABABBA 30 ABBABBABABBABBABABBABABB 11 ABBABABBABBABABBABABBA 34 BABABBABABBABBABABBABBAB 25 BBA 24 ABBA

10945 28656 4 196417 17711 10945

1

2 32 ABBABABBABABBABBABABBA 30 BABBABABBABBABABBABA 27 BBABB 16 ABABBABBABABBABA 30 BABBABABBABABBABBABABB 29 B 27 ABBABBABABB 19 ABABBABBAA 23 ABBABABBABBABABBABABBABBA 13 ABBABABBABBABABBABBABAB 33 ABBABBABABBABABBABBABA 32 ABBABABBABBABABBABABBB 29 ABBABABBABBABABBABBABA 31 BABABBABBABABBA 19 BABBABABBABBABAB

121392 46368 17711 55 46367 317811 17710 0 1596 7 196417 0 17710 121392 376

1

3 12 BABBABBABABBABABBA 28 BBABA 10 ABBABBABABBAB 30 BABAB 31 ABBABABBABABBABBABA 19 ABABBAB 35 BBABBABABBAB 12 BABBAB 27 ABBABABBABBABAB 10 ABABBABABBABBABABBABABB 27 BAB 18 BABABBABBA 22 BBABA 19 BBABABBABBABABBABABBABBA 17 AB 26 ABBABABBA 14 ABBABA 34 ABABBABABBABBABABBABBABAB 16 BBABBABABBAB 21 BABBABABBABBABABBABABBABB

7 46368 4 121393 75024 609 832039 33 17710 0 75024 232 2584 232 609 17710 55 196417 88 609

1

Page 24: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 22

Test fibistr.inp fibistr.out Điểm 25 BABB 32 BBABABBABABBABBABABBAB 19 ABABBABABBABBABABBABBABAB 14 BBABABBABBABABBABBABABBAA 10 ABBABABBABBABABBABABBABB 12 BABA

17711 121392 143 0 2 21

4 15 BABABBABBABABBABABBABBAB 12 ABBABABBABABBABBABABBABB 27 ABBABABBABBABABBABA 23 BABABBABB 15 BB 25 BBABABBABBABABBABAB 24 B 25 BBABBABAB 16 ABB 21 BABABBABABB 25 BABBABABB 34 BABABBABABBABBABABBAA 22 ABBABBA 18 ABABBABB 22 BBABABBABBABABBABBABABBB 11 BBABBABABBABABBABBABAB 15 ABBABABBABBABA 33 BABBABBABABBABBABABBABABB 28 ABABBABABBABBABABBABBABAB 29 BABBABABBABBABABB 19 BABABBABBABABBABABBAB 25 ABBABBABABBABBABABBABABBA 13 BABBAB 21 ABBABBABABBABB 34 ABABBABBABABBAA 25 A 20 BBABAB 23 BBABBABABBABBABAB 10 BBABABBABABBA 23 BBABBABABBABABBABBABAB 31 BABAB 13 A

33 4 10945 2584 144 4180 28657 6764 232 609 10945 0 1596 232 0 4 54 121392 10945 46367 232 2583 54 377 0 28657 987 986 2 1596 196417 89

1

5 29 B 317811 1

Phụ lục chương trình tham khảo Program FibinacciString; const InputFile = 'FIBISTR.INP'; OutputFile = 'FIBISTR.OUT'; max = 35; var S: array[1..13] of String; F: array[1..40] of LongInt; OddCenter, EvenCenter: String; OddCount, EvenCount, OddP, EvenP: Integer; n, l: Integer; Source: String; tmp: Char; fi, fo: Text; function Count(S: String): Integer; {How many Source in S} var i, c: Integer; p: ^String;

function Solve: LongInt; var i, k, t: Integer; begin l := Length(Source); t := l - 1; k := 1; while Length(S[k]) < l do Inc(k); FillChar(F, k shl 2, 0); F[k] := Count(S[k]); F[k + 1] := Count(S[k + 1]); if n <= k + 1 then begin Solve := F[n]; Exit; end; OddCount := Count(Copy(OddCenter, OddP - t, t + t)); EvenCount := Count(Copy(EvenCenter, EvenP - t, t + t)); for i := k + 2 to n do

Page 25: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 23

begin c := 0; for i := 0 to Length(S) - l do begin S[i] := Chr(l); p := @S[i]; if p^ = Source then Inc(c); end; Count := c; end; procedure CommonInit; var i: Integer; begin S[1] := 'A'; S[2] := 'B'; for i := 3 to 13 do S[i] := S[i - 1] + S[i - 2]; OddCenter := S[12] + S[11]; EvenCenter := S[11] + S[10]; OddP := Length(S[12]) + 1; EvenP := Length(S[11]) + 1; end;

if Odd(i) then F[i] := F[i - 1] + F[i - 2] + OddCount else F[i] := F[i - 1] + F[i - 2] + EvenCount; Solve := F[n]; end; BEGIN CommonInit; Assign(fi, InputFile); Reset(fi); Assign(fo, OutputFile); Rewrite(fo); while not SeekEof(fi) do begin Readln(fi, n, tmp, Source); Writeln(fo, Solve); end; Close(fi); Close(fo); END.

Bài 11: Bài toán kinh doanh Một doanh nhân, sau khi thực hiện mua bán N (N ≤ 100) chuyến hàng, mỗi chuyến hàng có

tổng giá trị mua M và tổng giá trị bán B (M, B có thể lên đến 20 chữ số) mới tính xem mình huề vốn, lời hay lỗ, bao nhiêu tiền. Hãy viết chương trình để giúp doanh nhân trên tính toán kết quả kinh doanh.

- Dữ liệu vào: file văn bản kinhdoanh.inp gồm: + Dòng đầu tiên chứa số N. + N dòng tiếp theo, mỗi dòng chứa hai số M và B cách nhau đúng 01 khoảng cách. - Dữ liệu ra: file văn bản kinhdoanh.out chứa kết quả là số tiền huề vốn, lời hoặc lỗ.

Xem ví dụ bên dưới: kinhdoanh.inp kinhdoanh.out

2 5 4 6 7

0

2 5 10 6 6

5

2 5 4 6 5

-2

ĐÁP ÁN, CHẤM Test kinhdoanh.inp kinhdoanh.out Điểm

1 5 50 65 150 141 15 30 121 200

100 0,5

Page 26: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 24

300 300

2 11 50 65 150 135 50 65 150 135 50 65 150 135 50 65 150 135 50 65 150 135 99999 99999

0 0,5

3 6 123456 123489 1111 2222 456789 234567 1234567 123456 5678910 567899 1500000000000000000 1500000000000000010

-6443190 0,5

4 3 15000000000000000000 16000000000000000000 9999999999999999999 15999999999999999999 12345678910111213140 15345678910111213139

9999999999999999999 0,5

Phụ lục chương trình tham khảo Program KinhDoanh; Const Fi='kinhdoanh.INP'; Fo='kinhdoanh.OUT'; var m,b,b_m,m_b:Qword; i,n:integer; F: text; BEGIN b_m:=0; m_b:=0; assign(F, Fi); reset(F); readln(F,n); for i:=1 to n do

begin readln(F,m,b); if b>=m then b_m:=b_m+(b-m) else m_b:=m_b+(m-b); end; Close(F); assign(F, Fo); rewrite(F); if b_m>=m_b then writeln(F,b_m-m_b) else writeln(F,'-',m_b-b_m); Close(F); END.

Bài 12: Cộng hai số Cho trước hai số nguyên dương A và B. Hãy tính tổng của chúng. - Dữ liệu: file văn bản sum.inp chứa hai số nguyên dương A và B, mỗi số nằm trên 01

dòng (A, B ≤ 10250). - Dữ liệu ra: file văn bản sum.out chứa kết quả là giá trị tổng cần tìm. Xem ví dụ bên

dưới:

sum.inp sum.out

2 3

5

ĐÁP ÁN, CHẤM Test sum.inp sum.out Điểm

1 12345 02016

14361 1

Page 27: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 25

2 097984 002016

100000 1

3 012345678910999990000 2016

12345678910999992016 1

4 4545454545454545………45 (200 số 45) 5454545454545454………54 (200 số 54)

9999…9 (200 số 9) 1

5 999999………9999 (250 số 9) 100000………0001 (248 số 0)

1100…0 (249 số 0) 1

Phụ lục chương trình tham khảo Program Sum; Const Fi='sum.inp'; Fo='sum.out'; Var s1,s2: string; m: array[1..255] of integer; F: text; Function Tong2S(s1,s2:string):string; Var i,c,l1,l2:integer; s3:string; Begin Tong2S:=''; l1:=length(s1); l2:=length(s2); while(length(s1)<250) do s1:='0'+s1; while(length(s2)<250) do s2:='0'+s2; i:=1;c:=0; while (i<=l1) or (i<=l2) do begin c:=c+ord(s1[length(s1)-i+1])+ord(s2[length(s2)-i+1])-96; m[i]:=c mod 10; c:=c div 10; inc(i); end;

if c>0 then begin m[i]:=c;inc(i) end; l1:=i; for i:=l1-1 downto 1 do begin Str(m[i],s3); Tong2S:=Tong2S+s3; end; i:=1; While Tong2S[i]='0' do inc(i); Delete(Tong2S,1,i-1); End; BEGIN assign(F, Fi); reset(F); readln(F,s1); readln(F,s2); Close(F); assign(F, Fo); rewrite(F); write(F,Tong2S(s1,s2)); Close(F); END.

Bài 13: Chia bánh Tại buổi sinh nhật của An có một cái bánh kem hình tròn, bánh được viền quanh bởi một

loạt các quả Dâu và Táo. Một bạn gái bỗng nêu một câu hỏi “Đố các bạn cắt bánh bằng một nhát dao thành 2 phần sao cho số lượng quả Dâu và Táo trong 2 phần bánh bằng nhau”.

Hãy viết chương trình để giúp An và các bạn trong buổi sinh nhật giải câu đố trên. - Dữ liệu vào: file văn bản chiabanh.inp gồm hai dòng: + Dòng đầu tiên chứa số N (N ≤ 255) là tổng số lượng quả Dâu và Táo trên bánh; + Dòng thứ hai là dãy gồm N ký tự là ‘D’ hoặc ‘T’ (trong đó, ký tự thứ i là ‘D’ nếu vị trí

thứ i là quả Dâu, ‘T’ nếu ký tự thứ i là quả Táo). Các vị trí gắn quả trên bánh được đánh số thứ tự từ 1 đến N theo chiều kim đồng hồ bắt đầu từ một vị trí tùy ý.

- Dữ liệu ra: file văn bản chiabanh.out chứa kết quả: + Số -1 nếu không tìm được cách cắt bánh thoả yêu cầu. + Ghi tất cả các cách cắt bánh trên K dòng, mỗi dòng ghi 2 số nguyên dương i, j cho biết

các quả ở vị trí từ i đến j (theo thứ tự chiều kim đồng hồ) là các quả thuộc một trong hai phần bánh (i và j cách nhau đúng 01 khoảng cách).

Xem ví dụ dưới:

Page 28: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 26

chiabanh.inp chiabanh.out

6 DTTTDT

1 3 3 5 4 6 6 2

5 DTDDT

-1

ĐÁP ÁN, CHẤM Test chiabanh.inp chiabanh.out Điểm

1 8 DTDDTTTT

-1 0,5

2 12 DTTDDTTDDTTD

1 6 3 8 5 10 7 12 9 2 11 4

0,5

3 12 TDTDTDTDTDTD

1 6 2 7 3 8 4 9 5 10 6 11 7 12 8 1 9 2 10 3 11 4 12 5

0,5

4 20 TTTTTTTTTTDDDDDDDDDD

6 15 16 5

0,5

Phụ lục chương trình tham khảo Program ChiaBanh; Const fi='chiabanh.inp'; fo='chiabanh.out'; Var S:array[1..256] of char; f:text; n,dau:integer; Procedure Nhap; Var ch:char; i:integer; Begin assign(f,fi); reset(f); readln(f,n); for i:=1 to n do S[i]:='T'; for i:=1 to n do begin read(f,ch); if ch='D' then inc(dau); S[i]:=ch; end; Close(f); End; Function CatDuoc(i,j:integer):boolean; Var k,Sd,St:integer; Begin Sd:=dau div 2; if i<j then

if j<i then begin for k:=i to n do if S[k]='D' then dec(Sd); for k:=1 to j do if S[k]='D' then dec(Sd); end; CatDuoc:=(Sd=0); End; Procedure XuLy; Var i,j,c: integer; Begin assign(f,fo); rewrite(f); if (n mod 2=1) or (dau mod 2=1) then begin write(f,-1); Close(f); halt; end else begin c:=n div 2; for i:=1 to n do begin j:=i+c-1; if j>n then j:=j-n; if CatDuoc(i,j) then writeln(f,i,' ',j); end; end;

Page 29: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 27

for k:=i to j do if S[k]='D' then dec(Sd);

Close(f); End; BEGIN dau:=0; Nhap; XuLy; END.

Bài 14: Tìm số Dãy các số tự nhiên được viết liên tục vô hạn: 123456789101112131415…… Hãy viết

chương trình tìm số ở vị trí thứ K của dãy số trên (chạy càng nhanh càng tốt). - Dữ liệu vào: file văn bản timso.inp chứa số nguyên dương K (K ≤ 16.1018). - Dữ liệu ra: file văn bản timso.out chứa kết quả. Xem ví dụ bên dưới:

timso.inp timso.out

10 1

ĐÁP ÁN, CHẤM Test timso.inp timso.out Điểm

1 11 0 0,5

2 99999 1 0,5

3 1234567890 8 0,5

4 789789789789 7 0,5

5 111222333444555 9 0,5

6 15000000000000000000 6 0,5

Phụ lục chương trình tham khảo Program TimSo; Var k: QWord; kq:integer; F:text; Procedure Nhap; Begin assign(F,'timso.inp'); reset(F); read(F,k); Close(F); End; Procedure XuLy; var i, tongso, coso, chuso: QWord; Begin tongso:= 9; coso:= 1; chuso:= 1; while tongso < k do begin coso := coso * 10; Inc(chuso); Inc(tongso, coso * 9 * chuso); end; Dec(tongso, coso * 9 * chuso);

Dec(k, tongso); coso:= coso+ (k - 1) div chuso; k:= (k - 1) mod chuso + 1; i:=1; while i<=chuso-k do begin coso:=coso div 10; inc(i); end; kq:= coso mod 10; End; Procedure Xuat; Begin assign(F,'timso.out'); rewrite(F); write(F,kq); Close(F) End; BEGIN Nhap; XuLy; Xuat; END.

Bài 15: Phân tích số Mọi số tự nhiên đều có thể phân tích dưới dạng tổng của 02 số nguyên tố. Viết chương

trình thực hiện tách một số tự nhiên thành tổng của 2 số nguyên tố (tất cả các trường hợp), nếu không phân tích được thì ghi lại chính nó.

- Dữ liệu vào: file văn bản ptso.inp chứa số tự nhiên N 18.000

- Dữ liệu ra: file văn bản ptso.out chứa kết quả (mỗi dòng là một trường hợp, mỗi số trên dòng cách nhau đúng 01 khoảng cách). Xem ví dụ bên dưới:

ptso.inp ptso.out

10 3 7

Page 30: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 28

5 5

11 11

ĐÁP ÁN, CHẤM Test ptso.inp ptso.out Điểm

1 20 3 17 7 13

1

2 59 59 1

3 150

11 139 13 137 19 131 23 127 37 113 41 109 43 107 47 103 53 97 61 89 67 83 71 79

1

4 999 2 997 1

5 18000

11 17989 13 17987 19 17981 23 17977 ... 8941 9059 8951 9049 8971 9029 8999 9001

1

Phụ lục chương trình tham khảo Program PhanTichSo; Var n:Qword; i:Qword; fi,fo:text; Function NT(a:Qword):Boolean; Var ok: Boolean; j:QWord; Begin ok:=true; j:=2; while j<a do begin if (a mod j) = 0 then ok:=ok and false; j:=j+1; end; if a>=2 then NT:=ok else NT:=false; End;

BEGIN assign(fi,'ptso.inp');reset(fi); readln(fi,n); assign(fo,'ptso.out'); rewrite(fo); i:=2; while i<(n div 2)+1 do begin if (NT(i) and NT(n-i)) then Writeln(fo,i,' ',n-i); i:=i+1; end;close(fi);close(fo); END.

Bài 16: Tìm a[n] Cho một dãy số tự nhiên gồm n phần tử tăng dần như sau: a[1]=3, a[2]=8, a[3]=15, a[4]=24, ..., a[n]. Tìm a[n]. - Dữ liệu vào: file văn bản timan.inp chứa số nguyên dương n (n ≤109). - Dữ liệu ra: file văn bản timan.out chứa kết quả là giá trị a[n] cần tìm. Xem ví dụ

mẫu: timan.inp timan.out

4 24

Page 31: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 29

ĐÁP ÁN, CHẤM Test timan.inp timan.out Điểm

1 4 24 1,5

2 50 2600 1,5

3 99999 9999999999 1,5

4 1000000000 1000000002000000000 1,5 TỔNG CỘNG 6 Phụ lục chương trình tham khảo Program TimAn; Const Fi='timan.inp'; Fo='timan.out'; Var n: Qword; F:text;

BEGIN assign(F, Fi); reset(F); readln(F,n); Close(F); assign(F, Fo); rewrite(F); write(F,n*(n+2)); Close(F); END.

Bài 17: Sắp xếp chuỗi Cho một chuỗi S gồm các ký tự chữ và số, bắt đầu ký số. Hãy viết chương trình để sắp

xếp chuỗi S theo thứ tự tăng dần nếu ký tự đầu là ‘1’, ngoài ra thì giảm dần (không phân biệt hoa, thường).

- Dữ liệu vào: file văn bản xepchuoi.inp chứa chuỗi S. - Dữ liệu ra: file văn bản xepchuoi.out chứa kết quả là chuỗi S đã sắp xếp theo thứ tự

tăng dần hoặc giảm dần theo điều kiện nêu trên. Xem ví dụ mẫu:

xepchuoi.inp xepchuoi.out

1Ba9Cc30b 0139aBbCc

Ba9Cc30b CcBba930 ĐÁP ÁN, CHẤM Test xepchuoi.inp xepchuoi.out Điểm

1 1

2 a a 1

3 19JJk40lmmjAbx5abdD77 0145779AabbdDJJjklmmx 1

4 09JJk40lmmjAbx5abdD77 xmmlkJJjdDbbAa9775400 1

CỘNG 4 Phụ lục chương trình tham khảo Program XepChuoi; Const Fi='xepchuoi.inp'; Fo='xepchuoi.out'; var s: string; i,j: integer; ch:char; F:text; Procedure hoanvi(var x,y: char); var tam:char; begin tam:=x; x:=y; y:=tam; end; Procedure XepTang; Var l:integer; Begin l:=length(s); if l>1 then

Procedure XepGiam; Var l:integer; Begin l:=length(s); if l>1 then For i:=2 to l do For j:=l downto i do if upcase(s[j])>upcase(s[j-1]) then hoanvi(s[j],s[j-1]); End; BEGIN assign(F, Fi); reset(F); readln(F,s); Close(F); if s[1]='1' then XepTang else XepGiam; assign(F, Fo); rewrite(F); writeln(F,s);Close(F); END.

Page 32: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 30

For i:=2 to l do For j:=l downto i do if upcase(s[j])<upcase(s[j-1]) then hoanvi(s[j],s[j-1]); End;

Bài 18: Tìm ngày/tháng/năm Từ chuỗi ngày/tháng/năm theo cấu trúc dd/mm/yyyy và số N (N ≤ 10.108) cho trước.

Hãy cho biết ngày/tháng/năm (dd/mm/yyyy) sau N ngày. - Dữ liệu vào: file văn bản ngaythangnam.inp gồm một dòng duy nhất chứa

ngày/tháng/năm và số N cách nhau đúng một khoảng cách. - Dữ liệu ra: file văn bản ngaythangnam.out chứa kết quả là ngày/tháng/năm sau N

ngày. Xem ví dụ mẫu: ngaythangnam.inp ngaythangnam.out

22/04/2017 30 22/05/2017

ĐÁP ÁN, CHẤM Test ngaythangnam.inp ngaythangnam.out Điểm

1 22/04/2017 30 22/05/2017 1,5

2 01/02/2017 30 03/03/2017 1,5

3 15/03/2017 100 23/06/2017 1,5

4 18/05/2017 1000000000 01/03/2739868 1,5 TỔNG CỘNG 6

Phụ lục chương trình tham khảo Program NgayThangNam; var th:integer; s:string; n,ng,na:QWord; F:text; procedure Nhap; begin assign(F,'ngaythangnam.inp');reset(F); read(F,s); Close(F); val(copy(s,1,2),ng); val(copy(s,4,2),th); val(copy(s,7,4),na); val(copy(s,12,length(s)-11),n); end; Function SoNgay:byte; begin case th of 2:if (na mod 4=0) then SoNgay:=29 else SoNgay:=28; 1,3,5,7,8,10,12:SoNgay:=31; 4,6,9,11:SoNgay:=30; end; end; Procedure TinhNgay; Begin ng:=ng+n; While ng>SoNgay Do

Begin ng:=ng-SoNgay; th:= th+1; IF th>12 Then Begin th:= 1;na:= na+1; End; End; End; Procedure Xuat; var sngay, sthang, snam: string; begin assign(F,'ngaythangnam.out'); rewrite(F); if ng<10 then begin str(ng,sngay); sngay:='0'+sngay; end else str(ng,sngay); if th<10 then begin str(th,sthang); sthang:='0'+sthang; end else str(th,sthang); str(na,snam); write(F,sngay+'/'+sthang+'/'+snam); Close(F); End; BEGIN Nhap; TinhNgay; Xuat; END.

Bài 19: Phân tích số Cho trước số tự nhiên N. Hãy viết chương trình cho biết N có thể biểu diễn thành tổng

của hai hoặc nhiều số tự nhiên liên tiếp hay không? Nếu có, thì bao nhiêu cách và hãy liệt kê tất cả các cách có thể có. Nếu không, thì thông báo bằng số 0 và ghi lại số đó.

- Dữ liệu vào: file văn bản phantichso.inp chứa duy nhất số N.

Page 33: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 31

- Dữ liệu ra: file văn bản phantichso.out chứa kết quả là i dòng. Dòng đầu tiên ghi số cách phân tích, i-1 dòng tiếp theo, mỗi dòng là một cách, các số tự nhiên liên tiếp trên một dòng cách nhau đúng 01 dấu +.

Chú ý: thứ tự sắp xếp các phần tử từ nhỏ đến lớn, từ trái sang phải và từ ít đến nhiều số, từ trên xuống). Xem ví dụ mẫu:

phantichso.inp phantichso.out

9 2 4+5 2+3+4

11 0 11

ĐÁP ÁN, CHẤM Test kytu.inp kytu.out Điểm 1 9 2

4+5 2+3+4

1

2 2048 0 2048

1

3 76 1 6+7+8+9+10+11+12+13

1

4 99 5 49+50 32+33+34 14+15+16+17+18+19 7+8+9+10+11+12+13+14+15 4+5+6+7+8+9+10+11+12+13+14

1

CỘNG 4 Program PhanTichSo; const inFile='phantichso.inp'; outFile='phantichso.out'; var N:longint; m,dem,i,a,limit:longint; fi,fo: text; Procedure SoCach; begin limit:=trunc(sqrt(1+8*N)+1) div 2; for m:=2 to limit-1 do if ((N-m*(m-1) div 2) mod m =0) then inc(dem); end; Procedure PhanTich; begin limit:=trunc(sqrt(1+8*N)+1) div 2; for m:=2 to limit-1 do if ((N-m*(m-1) div 2) mod m =0) then begin a:=(N-m*(m-1) div 2) div m; writeln(fo);

for i:=a to a+m-2 do begin write(fo,i,'+'); if a+m-1-i=1 then write(fo,i+1); end; end; end; BEGIN assign(fi,inFile); reset(fi); readln(fi,N); assign(fo,outFile); rewrite(fo); dem:=0; SoCach; if dem=0 then begin writeln(fo,0); write(fo,N); end else begin write(fo,dem); PhanTich; end; close(fi); close(fo); END.

Bài 20: Tìm a[n] Cho một dãy số tự nhiên gồm n phần tử với: a[1] = 0, a[2] = 2, a[3] = 6, a[4] = 12, a[5]=20, …, a[n]. Tìm a[n]. - Dữ liệu vào: file văn bản timan.inp chứa số nguyên dương n (n ≤10.108).

Page 34: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 32

- Dữ liệu ra: file văn bản timan.out chứa kết quả là giá trị a[n] cần tìm. Xem ví dụ: timan.inp timan.out

5 20 ĐÁP ÁN, CHẤM

Test timan.inp timan.out Điểm

1 5 20 1,5

2 1 0 1,5

3 99999 9999700002 1,5

4 1000000000 999999999000000000 1,5

CỘNG 6 Program TimAn; Const Fi='timan.inp'; Fo='timan.out'; Var n: QWord; F:text;

BEGIN assign(F, Fi); reset(F); readln(F,n); Close(F); assign(F, Fo); rewrite(F); write(F,n*(n-1)); Close(F); END.

Bài 21: Tách chuỗi Cho một chuỗi ký tự S (gồm chữ và số). Hãy viết chương trình tách chữ và số thành

hai chuỗi riêng biệt. - Dữ liệu vào: file văn bản tachchuoi.inp chứa chuỗi S. - Dữ liệu ra: file văn bản tachchuoi.out chứa kết quả gồm 2 dòng. Dòng 1 là chuỗi

chữ, dòng 2 là chuỗi số. Nếu như chuỗi nào rỗng thì ghi dấu trừ ‘-’. Xem ví dụ mẫu: tachchuoi.inp tachchuoi.out tachchuoi.inp tachchuoi.out tachchuoi.inp tachchuoi.out a1B2c3 aBc

123 123

- 123

aBc aBc -

ĐÁP ÁN, CHẤM Test tachchuoi.inp tachchuoi.out Điểm 1 a1B2c34d aBcd

1234 1

2 0987654321 - 0987654321

1

3 abghcGGG abghcGGG -

1

4 - -

1

CỘNG 4 Program TachChuoi; Const Fi='tachchuoi.inp'; Fo='tachchuoi.out'; var s,chu,so: string; i,j: integer; F:text; BEGIN assign(F, Fi); reset(F); readln(F,s); Close(F); chu:=''; so:='';

for i:=1 to length(s) do begin if (s[i] in ['0'..'9']) then so:=so+s[i]; if (s[i] in ['A'..'Z'] + ['a'..'z']) then chu:=chu+s[i]; end; assign(F, Fo); rewrite(F); writeln(F,chu);write(F,so); Close(F); END.

Page 35: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 33

Bài 22: Phân tích số Mọi số tự nhiên N đều có thể phân tích dưới dạng tổng của 02 số nguyên tố. Viết

chương trình tìm tổng số cách để tách một số tự nhiên thành tổng của 02 số nguyên tố. - Dữ liệu vào: file văn bản phantichso.inp chứa duy nhất số N 18.000. - Dữ liệu ra: file văn bản phantichso.out chứa kết quả là K cách tách số. Xem ví dụ

mẫu: phantichso.inp phantichso.out 10 2 11 0

ĐÁP ÁN, CHẤM Test ptso.inp ptso.out Điểm 1 59 0 1,5 2 150 12 1,5 3 999 1 1,5 4 18000 419 1,5

Tổng điểm 6 Program PhanTichSo; const fi='phantichso.inp'; fo='phantichso.out'; Var i,n:Qword; dem:integer; F:text; Function NT(a:Qword):Boolean; Var ok: Boolean; j:QWord; Begin ok:=true; j:=2; while j<a do begin if (a mod j) = 0 then ok:=ok and false; j:=j+1; end; if a>=2 then NT:=ok else NT:=false; End;

BEGIN assign(F,fi); reset(F); readln(F,n);close(F); assign(F,fo); rewrite(F); i:=2; dem:=0; while i<(n div 2)+1 do begin if (NT(i) and NT(n-i)) then inc(dem); inc(i); end; write(F,dem); close(F); END.

Bài 23: Dãy 0-1 xen kẽ Từ một dãy n phần tử gồm các số 0, 1 cho trước. Hãy viết chương trình kiểm tra xem

dãy này có chứa các số 0 và 1 xen kẽ nhau không, nếu có thì mấy cặp 01, nếu không thì vị trí i, j sai đầu tiên là mấy?

- Dữ liệu vào: từ file văn bản day01xenke.inp chứa duy nhất dãy 01. - Dữ liệu ra: file văn bản day01xenke.out chứa kết quả là K cặp 01 xen kẽ nếu thoả

điều kiện, ngược lại ghi số i j (trong đó, i và j là hai vị trí sai đầu tiên, i<j, i và j cách nhau đúng một dấu cách). Xem ví dụ dưới:

day01xenke.inp day01xenke.out 10101 2 10011 2 3

ĐÁP ÁN, CHẤM Test day01xenke.inp day01xenke.out Điểm

1 101010100 8 9 1

2 1010101010 4 1

Page 36: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 34

3 0101010101010101010 9 1

4 01010110101101010101 6 7 1 TỔNG 4 Program Day01xenke; Var S:string; i,k,n,dem:integer; flag:boolean; F: text; BEGIN Assign(F,'day01xenke.inp'); reset(F); readln(F,S); Close(F); i:=1;dem:=0;flag:=true; while (i<length(S)) and flag do begin

if S[i]<>S[i+1] then begin flag:=true; if S[i]='0' then inc(dem); end else flag:=false; inc(i); end; Assign(F,'day01xenke.out'); rewrite(F); if flag then write(F,dem) else write(F,i-1,' ',i); close(F); END.

Bài 24: Tìm số Cho một dãy số tự nhiên gồm n phần tử với:

a[1]=a[2]=a[3]=1, a[4]=3, a[5]=5, …, a[n]=

1

3

n

nia . Tìm a[n].

- Dữ liệu vào: file văn bản timso.inp chứa số nguyên dương n (n ≤ 75). - Dữ liệu ra: file văn bản timso.out chứa kết quả là giá trị a[n] cần tìm. Xem ví dụ

mẫu:

timso.inp timso.out

5 5 ĐÁP ÁN, CHẤM

Test timso.inp timso.out Điểm

1 3 1 1

2 25 978793 1

3 60 1792344042191491 1

4 75 16717180390659349953 1

CỘNG 4 Program TimSo; Const Fi='timso.inp'; Fo='timso.out'; Var i,n:integer; an,a,b,c: Qword; F:text; BEGIN assign(F, Fi); reset(F); readln(F,n); Close(F); If n<=3 then an:=1 else Begin i:=4; a:=1;b:=1;c:=1;

while i<=n do begin an:=a+c; a:=b; b:=c; c:=an; inc(i); end; End; assign(F, Fo); rewrite(F); write(F,an); Close(F); END.

Bài 25: Ký tự xuất hiện nhiều nhất Viết chương trình tìm những ký tự xuất hiện nhiều nhất (chỉ sử dụng chữ thường)

trong một xâu ký tự S cho trước (có thể sử dụng chữ hoa, thường). - Dữ liệu vào: file văn bản kytu.inp chứa xâu S.

Page 37: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 35

- Dữ liệu ra: file văn bản kytu.out chứa kết quả là xâu liên tục chứa những ký tự xuất hiện nhiều nhất trong chuỗi S (theo thứ tự alphabet). Xem ví dụ mẫu:

kytu.inp kytu.out

aEbeEcddcC ce ĐÁP ÁN, CHẤM Test kytu.inp kytu.out Điểm

1 1

2 aEbeEcddcC ce 1

3 Z z 1

4 ZzaaabcjJjSSSZZzzAKtAAsCCsjBbjfjs ajsz 1

CỘNG 4 Program KyTu; const inFile='kytu.inp'; outFile='kytu.out'; var x:array['a'..'z'] of integer; s:string; i,max:integer; j:char; fi,fo: text; BEGIN FillChar(x,SizeOf(x),0); assign(fi,inFile); reset(fi);

readln(fi,s); assign(fo,outFile); rewrite(fo); for i:=1 to length(s) do inc(x[lowercase(s[i])]); max:=0; for j:='a' to 'z' do if (x[j]>max) and (max>0) then max:=x[j]; for j:='a' to 'z' do if x[j]=max then write(fo,j); close(fi); close(fo); END.

Bài 26: Phân tích số Cho trước số tự nhiên N. Hãy viết chương trình cho biết N có thể biểu diễn thành tổng

của hai hoặc nhiều số tự nhiên liên tiếp hay không? Nếu có, hãy liệt kê tất cả các cách có thể có. Nếu không, thì thông báo bằng số 0.

- Dữ liệu vào: file văn bản phantichso.inp chứa duy nhất số N. - Dữ liệu ra: file văn bản phantichso.out chứa kết quả là i dòng, mỗi dòng là một

cách, các số tự nhiên liên tiếp trên một dòng cách nhau đúng 01 dấu +. Chú ý: thứ tự sắp xếp các phần tử từ nhỏ đến lớn, từ trái sang phải, từ trên xuống).

Xem ví dụ mẫu: phantichso.inp phantichso.out 9 2+3+4

4+5 2 0

ĐÁP ÁN, CHẤM Test phantichso.inp phantichso.out Điểm

1 9 2+3+4 4+5

0,5

2 2048 0 0,5

3 76 6+7+8+9+10+11+12+13 0,5

4 99 4+5+6+7+8+9+10+11+12+13+14 7+8+9+10+11+12+13+14+15

14+15+16+17+18+19

32+33+34 49+50

0,5

CỘNG 2

Page 38: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 36

Program PhanTichSo; const fi='phantichso.inp'; fo='phantichso.out'; var N:longint; m,dem,i,a,limit:longint; f: text; Procedure PhanTich; begin limit:=trunc(sqrt(1+8*N)+1) div 2; for m:=limit-1 downto 2 do if ((N-m*(m-1) div 2) mod m =0) then begin a:=(N-m*(m-1) div 2) div m; inc(dem); if dem>1 then writeln(f);

for i:=a to a+m-2 do begin write(f,i,'+'); if a+m-1-i=1 then write(f,i+1); end; end; end; BEGIN assign(f,fi); reset(f); readln(f,N); close(f); assign(f,fo); rewrite(f); dem:=0; PhanTich; if dem=0 then write(f,0); close(f); END.

Bài 27: Tìm tổng các số nguyên tố có N chữ số Số nguyên tố là số tự nhiên lớn hơn 1, chỉ có 2 ước số là 1 và chính nó. Cho trước một

số tự nhiên N, tìm tổng tất cả các số nguyên tố có N chữ số. - Dữ liệu vào: file văn bản sumnt.inp chứa duy nhất số N. - Dữ liệu ra: file văn bản sumnt.out chứa kết quả là Tổng các số nguyên tố có N chữ

số. Xem ví dụ mẫu: sumnt.inp sumnt.out

0 0

1 17

ĐÁP ÁN, CHẤM Test sumnt.inp sumnt.out Điểm

1 0 0 1,5

2 2 1043 1,5

3 3 75067 1,5

4 6 37096005486 1,5

TỔNG CỘNG 6 Program SumNT; const Fi='sumnt.inp'; Fo='sumnt.out'; var n:integer; Tong,tu,den:Qword; F: text; function aLTb(a,b:integer):QWord; var i:integer; begin aLTb:=1; for i:=1 to b do aLTb:=aLTb*a; end; function KTnt(a:Qword):boolean; var b:Qword; kt:boolean; begin kt:=true; b:=2; while (b<=trunc(sqrt(a))) do begin if (a mod b)=0 then begin kt:=false;break;end else kt:=true;i nc(b);

end; KTnt:=kt; end; BEGIN assign(F,Fi); reset(F); read(F,n);close(F); tu:=aLTb(10,n-1)+1; den:=aLTb(10,n); if (tu=2) and (n>0) then begin Tong:=tu; inc(tu); end else Tong:=0; while tu<=den do begin if KTnt(tu) then Tong:=Tong+tu; inc(tu,2); end; assign(F,Fo); rewrite(F); write(F,Tong); close(F); END.

Page 39: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 37

Bài 28: Đếm cặp 01 Từ một chuỗi vòng tròn khép kín S gồm các số 0, 1 cho

trước. Hãy viết chương trình đếp số cặp 01 trong chuỗi vòng tròn này (xem ví dụ ở hình bên ta thấy có 03 cặp 01).

- Dữ liệu vào: từ file văn bản cap01.inp chứa duy nhất chuỗi S.

- Dữ liệu ra: file văn bản cap01.out chứa kết quả là K cặp 01. Xem ví dụ dưới:

cap01.inp cap01.out

101010 3

10011 1

ĐÁP ÁN, CHẤM Test cap01.inp cap01.out Điểm 1 00000 0 1 2 1001100011010101 5 1 3 10010101000000101111100011111111110 7 1 4 10001010110001110010001100000100100010011110100000000

00000000000 12 1

TỔNG CỘNG 4 Program Cap01; Var S:string; i,dem:integer; F: text; BEGIN Assign(F,'cap01.inp'); reset(F); readln(F,S); Close(F); i:=1;dem:=0; while i<length(S) do

begin if (S[i]='0') and (S[i+1]='1') then inc(dem); inc(i); end; if (S[i]='0') and (S[1]='1') then inc(dem); Assign(F,'cap01.out'); rewrite(F); write(F,dem); close(F); END.

Bài 29: Tìm a[n] Cho một dãy số tự nhiên gồm n phần tử với: a[1]=1, a[2]=3 và a[n]= 1

1][n ia +a[n-

1]+1 (ví dụ: a[3]=8, a[4]=21). Tìm a[n]. - Dữ liệu vào: file văn bản timan.inp chứa số nguyên dương n (0<n≤46). - Dữ liệu ra: file văn bản timan.out chứa kết quả là giá trị a[n] cần tìm. Xem ví dụ

mẫu: timan.inp timan.out

4 21 ĐÁP ÁN, CHẤM

Test timan.inp timan.out Điểm

1 1 1 1,5

2 5 55 1,5

3 35 190392490709135 1,5

4 46 7540113804746346429 1,5

CỘNG 6 Program TimAn; Const Fi='timan.inp'; Fo='timan.out';

an_1:=1; i:=2; while (i<=n) do

1

0

1

0

1

0

Page 40: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 38

Var an_1,tong,an:Qword; i,n:integer; F:text; BEGIN assign(F, Fi); reset(F); readln(F,n); Close(F); if n=1 then an:=n else begin tong:=1;

begin an:=tong+an_1+1; an_1:=an; tong:=tong+an_1; inc(i); end; end; assign(F, Fo); rewrite(F); write(F,an); Close(F); END.

Bài 30: Rút gọn dãy số Cho một dãy số liên tục gồm các phần tử từ 0 đến 9. Phép rút gọn là chỉ ghi lại một

phần tử (0..9) mà tổng của các phần tử giống nhau đó là lớn nhất. Hãy tìm dãy số liên tục mới là rút gọn của dãy đã cho (theo thứ tự tăng dần).

- Dữ liệu vào: file văn bản rutgon.inp chứa dãy số liên tục. - Dữ liệu ra: file văn bản rutgon.out chứa kết quả là dãy số rút gọn cần tìm. Xem ví

dụ mẫu (dãy 1934334 có dãy rút gọn là 39, vì số 9 và 3+3+3=9 là lớn nhất): rutgon.inp rutgon.out

1934334 39 ĐÁP ÁN, CHẤM Test rutgon.inp rutgon.out Điểm

1 1934334 39 1

2 1122113451231 123 1

3 1 1 1

4 0000111222222222222944545556774848784333336663393

23468 1

CỘNG 4 Program RutGon; const inFile='rutgon.inp'; outFile='rutgon.out'; var a:array['0'..'9'] of integer; s:string; i,max:integer; j:char; fi,fo: text; BEGIN FillChar(a,SizeOf(a),0); assign(fi,inFile); reset(fi); readln(fi,s);

assign(fo,outFile); rewrite(fo); for i:=1 to length(s) do inc(a[s[i]]); max:=0; for j:='0' to '9' do if (a[j]*(ord(j)-48))>max then max:=a[j]*(ord(j)-48); for j:='0' to '9' do if (a[j]*(ord(j)-48))=max then write(fo,j); close(fi); close(fo); END.

Bài 31: Đổi hệ 10 sang hệ 2 Số nhị phân là số chỉ sử dụng số 0 và 1. Hãy viết chương trình đổi số hệ thập phân N

(N≤1019) sang số hệ nhị phân. - Dữ liệu vào: file văn bản doi10to2.inp chứa số N. - Dữ liệu ra: file văn bản doi10to2.out chứa kết quả là số nhị phân vừa đổi từ số N.

Xem ví dụ mẫu: doi10to2.inp doi10to2.out

3 11

10 1010

Page 41: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 39

ĐÁP ÁN, CHẤM Test doi10to2.inp doi10to2.out Điểm

1 10 1010 1,5

2 9999999999 1001010100000010111110001111111111 1,5

3 9223372036854775807 111111111111111111111111111111111111111111111111111111111111111

1,5

4 10000000000000000000 1000101011000111001000110000010010001001111010000000000000000000 1,5

TỔNG CỘNG 6 Program Doi10to2; Const Fi='doi10to2.inp'; Fo='doi10to2.out'; var St:string; N:Qword; du:byte; F:text; BEGIN assign(F,Fi); reset(F); read(F,N); close(F);

if N=0 then St:='0' else St:=''; while N>0 do begin du:=N mod 2; N:=N div 2; St:=chr(du+48)+St; end; assign(F,Fo); rewrite(F); write(F,St); close(F); END.

Bài 32: Bài toán nuôi thỏ Bài toán cổ về việc sinh sản của các cặp thỏ được đặt ra như sau: (1) Giả sử các con thỏ không bao giờ chết; (2) 02 tháng sau khi ra đời, mỗi cặp thỏ mới sẽ sinh ra 01 cặp thỏ con (01 đực, 01 cái); (3) Khi đã sinh con rồi thì cứ mỗi tháng tiếp theo chúng lại sinh được 01 cặp con mới

(01 đực, 01 cái). Giả sử từ giữa tháng 1 có 01 cặp thỏ thì đến giữa tháng thứ n (n ≤ 1.000) sẽ có tổng

cộng bao nhiêu con thỏ. Hãy viết chương trình để giải bài toán trên. - Dữ liệu vào: file văn bản nuoitho.inp chứa duy nhất một số tự nhiên n (tháng thứ n). - Dữ liệu ra: file văn bản nuoitho.out chứa kết quả là tổng số thỏ có được ở tháng thứ n.

nuoitho.inp nuoitho.out 5 10

ĐÁP ÁN, CHẤM Test nuoitho.inp nuoitho.out Điểm 1 5 10 1 2 50 25172538050 1 3 92 15080227609492692858 1 4 1000 8693311537387491287137705535008125160512932103474356

0804963458179073110835898103780807759680158510338591845186160645269550419379246479746644942323285992881813066375876597939299857032007408952275590333698457750

1

TỔNG CỘNG 4 PROGRAM NuoiTho; VAR thang,i:integer; tn, tn_1, tn_2:string; F:text; function Tong2S(s1,s2:string):string; var i,c,l1,l2:integer; s3:string;

BEGIN assign(F,'nuoitho.inp'); reset(F); readln(F,thang);close(F); if thang>2 then Begin tn_2:='1'; {Thang dau tien co 1 cap tho} tn_1:='1'; {Thang thu 2 van co 1

Page 42: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 40

m: array[1..250] of integer; begin Tong2S:=''; l1:=length(s1); l2:=length(s2); while(length(s1)<220) do s1:='0'+s1; while(length(s2)<220) do s2:='0'+s2; i:=1;c:=0; while (i<=l1) or (i<=l2) do begin c:=c+ord(s1[length(s1)-i+1])+ord(s2[length(s2)-i+1])-96; m[i]:=c mod 10; c:=c div 10; inc(i); end; if c>0 then begin m[i]:=c;inc(i) end; l1:=i; for i:=l1-1 downto 1 do begin Str(m[i],s3); Tong2S:=Tong2S+s3; end; i:=1; While Tong2S[i]='0' do inc(i); Delete(Tong2S,1,i-1); End;

cap tho} i:=3; while i<=thang dO begin tn:=Tong2S(tn_1,tn_2); tn_2:=tn_1; tn_1:=tn; inc(i); end; end else tn:='1'; assign(F,'nuoitho.out'); rewrite(F); write(F,Tong2S(tn,tn));close(F); END.

Bài 33: Tìm số hoàn hảo Số hoàn hảo là số có tổng các ước của nó (trừ nó) bằng chính nó (ví dụ: 6 = 1 + 2 + 3). Từ số

nguyên dương N cho trước, hãy viết chương trình để tìm số hoàn hảo lớn nhất từ 1 đến N: - Dữ liệu vào: file văn bản timsohh.inp chứa số nguyên dương N (N 10.000). - Dữ liệu ra: file văn bản timsohh.out chứa kết quả là số hoàn hảo vừa tìm được. Nếu

không có thì ghi số 0. Xem ví dụ dưới:

timsohh.inp timsohh.out

5 0

6 6 ĐÁP ÁN, CHẤM Test timsohh.inp timsohh.out Điểm

1 3 0 1

2 28 28 1

3 500 496 1

4 10000 8128 1 PROGRAM timsohh; Const Fi='timsohh.inp'; Fo='timsohh.out'; var n,j:integer; F:text; Function hoanhao(m:integer):boolean; Var i,S:integer; Begin S:=0; i:=1; while i<=(m div 2) do begin if (m mod i)=0 then S:=S+i; inc(i); end; hoanhao:=(S=m); End;

BEGIN assign(F, Fi); reset(F); readln(F,n); Close(F); j:=n; while (j>1) and (not hoanhao(j)) do dec(j); assign(F, Fo); rewrite(F); if j=1 then write(F,0) else write(F,j); Close(F); END.

Page 43: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 41

Bài 34: Sắp xếp chuỗi Cho một chuỗi S bất kỳ (không là chuỗi rỗng) và một số nguyên N, hãy viết chương trình

tách riêng chuỗi chữ theo chữ (không phân biệt hoa thường, số theo số và sắp xếp theo thứ tự tăng dần (nếu N=0) hoặc giảm dần (nếu N=1), nếu chuỗi không có chữ hoặc số thì để dấu trừ ‘-’.

- Dữ liệu vào: file văn bản sapxepchuoi.inp gồm 02 dòng, dòng 01 chứa số N, dòng 2 chứa chuỗi S (S 255 ký tự).

- Dữ liệu ra: file văn bản sapxepchuoi.out chứa kết quả gồm 02 dòng, dòng 1 là chuỗi số, dòng 2 là chuỗi chữ đã sắp xếp thứ tự. Xem ví dụ dưới:

sapxepchuoi.inp sapxepchuoi.out 0 06aba7c910kh

001679 aabchk

1 azaba

- zbaaa

1 62710

76210 -

ĐÁP ÁN, CHẤM Test sapxepchuoi.inp sapxepchuoi.out Điểm

1 0 Zm973b9jf022gg

0223799 bfggjmZ

1

2 1 0123456789

9876543210 -

1

3 1 AbcdefGHijk

- kjifedcbHGA

1

4 0 0FF1j234tmk9p5KKK

0123459 FFjkKKKmpt

1

Phụ lục chương trình tham khảo Program sapxepchuoi; Const Fi='sapxepchuoi.inp'; Fo='sapxepchuoi.out'; var chu,so,S: string; k:byte; F:text; Procedure tachchu_so; Var i, n: byte; Begin chu:=''; so:=''; n:= length(S); if (n > 0) then For i:=1 to n do If (S[i] in ['0'..'9']) then so:=so+S[i] else chu:=chu+S[i]; End; Procedure hoanvi(var x,y: char); var tam:char; begin tam:=x; x:=y; y:=tam; end; Function XepTang(chuoi:string): string; Var i,j,n:byte;

if (upcase(chuoi[j])<upcase(chuoi[j-1])) then hoanvi(chuoi[j],chuoi[j-1]); XepTang:=chuoi; End; Function XepGiam(chuoi:string): string; Var i,j,n:byte; Begin n:=length(chuoi); For i:=2 to n do For j:=n downto i do if (chuoi[j]>chuoi[j-1]) then hoanvi(chuoi[j],chuoi[j-1]); XepGiam:=chuoi; End; BEGIN assign(F, Fi); reset(F); readln(F,k); readln(F,S); Close(F); tachchu_so; assign(F, Fo); rewrite(F); if so='' then writeln(F,'-') else if k=0 then writeln(F,XepTang(so)) else writeln(F,XepGiam(so)); if chu='' then write(F,'-') else if k=0 then write(F,XepTang(chu))

Page 44: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 42

Begin n:=length(chuoi); For i:=2 to n do For j:=n downto i do

else write(F,XepGiam(chu)); Close(F); END.

Bài 35: Xếp khách Một khách sạn có N phòng đôi (phòng cho 2 người) được đánh số từ 1 đến N. Khi có

một đoàn khách đến thuê phòng, tiếp tân của khách sạn sẽ xếp khách vào phòng theo nguyên tắc sau: mỗi cặp khách sẽ được xếp vào phòng có chỉ số nhỏ nhất trong số các phòng trống. Nếu số lượng khách của đoàn là số lẻ thì người cuối cùng của đoàn khách sẽ được xếp vào phòng có chỉ số nhỏ nhất trong số các phòng còn trống. Nếu không còn phòng trống thì số khách chưa có phòng sẽ được xếp tuần tự từng người một vào phòng có chỉ số nhỏ nhất trong số các phòng mới có một khách (của đoàn khách trước đó). Đầu tiên các phòng của khách sạn đều trống và giả thiết rằng, không có 2 đoàn khách nào đến khách sạn cùng thời điểm và tổng số khách của tất cả các đoàn không vượt quá sức chứa của khách sạn ( 2N).

Yêu cầu Cho trước trình tự đến của các đoàn khách và số lượng khách của mỗi đoàn. Hãy xác

định số lượng khách trong mỗi phòng của khách sạn. - Dữ liệu vào: file văn bản ROOMS.INP + Dòng đầu tiên chứa 2 số nguyên dương N (1<=N<=100) và G được ghi cách nhau

bởi dấu cách. N là số phòng của khách sạn, G là số lượng đoàn khách đến khách sạn. + Dòng thứ i trong số G dòng tiếp theo chứa số lượng khách của đoàn khách thứ i

(các đoàn khách được đánh số theo số thứ tự đến khách sạn, bắt đầu từ 1). - Kết quả: file văn bản ROOMS.out gồm N dòng. Dòng thứ i chứa số lượng khách

của phòng thứ i (1 <= i <= N). Ví dụ:

rooms.inp rooms.out 7 3 3 1 4

2 1 1 2 2 0 0

ĐÁP ÁN, CHẤM Test rooms.inp rooms.out Điểm

1 8 4 1 5 3 6

2 2 2 2 2 1 2 2

1

2 10 7 3 4 2 6

2 2 2 2 2

1

Page 45: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 43

2 2 1

2 2 2 2 2

3 10 5 3 2 7 2 1

2 1 2 2 2 2 1 2 1 0

1

Phụ lục chương trình tham khảo PROGRAM XepKhach; Const max=1001; Fi='Rooms.inp'; Fo='Rooms.out'; Var P:array[0..max] of 0..2; n,g,t,t1,i,x:integer; F:text; {----------------------} BEGIN assign(F,Fi); reset(F); readln(F,n,g); t:=0; FillChar(P,SizeOf(P),0); for i:=1 to g do begin readln(F,x); while (t<n) and (x>1) do begin inc(t); P[t]:=2; dec(x,2); end;

if (x=1) and (t<n) then begin inc(t); P[t]:=1; dec(x); end; if (t=n) and (x>0) then begin t1:=0; while (P[t1]<>1) and (t1<n) do begin inc(t1); if (P[t1]=1) and (x>0) then begin P[t1]:=2; dec(x); end; end; end; end; Close(F); assign(F,Fo); Rewrite(F); for i:=1 to n do Writeln(F,P[i]); Close(F); END.

Bài 36: Sắp xếp dãy số Cho dãy số nguyên a

1, a

2, …, a

N, với N ≤ 1.000

Yêu cầu: Hãy tìm cách thực hiện một số ít nhất phép đổi chỗ 2 số hạng bất kỳ của dãy để thu được dãy số mà số lẻ đứng ở vị trí lẻ, số chẵn đứng ở vị trí chẵn.

- Dữ liệu vào: file văn bản DAYSO.INP + Dòng đầu tiên chứa số nguyên dương N. + Dòng thứ i trong số N dòng tiếp theo chứa số hạng a

i của dãy số đã cho (-32767 ≤

ai ≤ 32767, i = 1, 2, …, N).

- Kết quả: file văn bản DAYSO.OUT. Dòng đầu tiên ghi số lượng phép đổi chỗ cần được thực hiện k (quy ước k = -1 nếu không thể biến đổi được dãy đã cho thành dãy thỏa mãn yêu cầu đầu bài); nếu k > 0 thì dòng thứ j trong số k dòng tiếp theo ghi chỉ số của 2 số hạng cần đổi chỗ cho nhau ở lần đổi chỗ thứ j (j = 1, 2, …, k).

Page 46: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 44

Ví dụ: DAYSO.INP DAYSO.OUT DAYSO.INP DAYSO.OUT 6 1 2 3 4 6 5

1 5 6

4 1 3 2 5

-1

ĐÁP ÁN, CHẤM Test DAYSO.INP DAYSO.OUT Điểm 1 6

10 12 14 13 15 11

2 1 4 3 6

1

2 6 10 12 14 15 16 13

-1 1

CỘNG 2 Phụ lục chương trình tham khảo Program SapXepDaySo; Const max=100; fi='Dayso.inp'; fo='Dayso.out'; Var A:array[1..max] of 0..2; d1,d2,n:integer; f:text; procedure Nhap; var i,x:integer; begin assign(f,fi); reset(f);readln(f,n); d1:=0; d2:=0; for i:=1 to n do begin readln(f,x); if x mod 2=0 then if i mod 2=0 then A[i]:=0 else begin A[i]:=2;inc(d2); end; if x mod 2=1 then if i mod 2=1 then A[i]:=0 else begin A[i]:=1;inc(d1); end; end; Close(f); end;

procedure XuLy; var i,j,k:integer; begin assign(f,fo); Rewrite(f); if d1<>d2 then begin write(f,-1); Close(f); halt; end; writeln(f,d1); for k:=1 to d1 do begin i:=1; j:=1; while A[i]<>1 do inc(i); while A[j]<>2 do inc(j); if (A[i]=1) and (A[j]=2) then begin A[i]:=0; A[j]:=0; if i<j then write(f,i,' ',j) else writeln(f,j,' ',i); end; end; Close(f); end; BEGIN Nhap; XuLy; END.

Page 47: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 45

Bài 3: Chuỗi chuẩn (2 điểm) Chuỗi chuẩn là chuỗi được qui định: - Đầu chuỗi phải là một ký tự chữ (‘a’ .. ‘z’ hoặc ‘A’ .. ‘Z’). - Các dấu câu (chấm, phẩy, hai chấm, chấm than, chấm hỏi, chấm phẩy) đi liền với

chữ trước nó, sau dấu câu thì có một ký tự trắng và ký tự đầu tiên tiếp theo viết thường (nếu sau dấu phẩy, dấu chấm phẩy và dấu hai chấm), viết hoa nếu dấu câu khác.

- Cuối câu là dấu chấm. Trong một đoạn văn nếu không tính tới các lỗi sai về chính tả mà chỉ tính các lỗi sai

nêu trên thì hãy viết chương trình sửa lỗi đó. Dữ liệu vào: file văn bản IN.INP chứa đoạn văn Dữ liệu ra: file văn bản OUT.OUT chứa đoạn văn bản chuẩn

Ví dụ: IN.INP OUT.OUT

! , chung ta ,toi va moi nguoi,minh cung lam cho toi !cong viec .neu chua tot se bi khien trach ;:’

Chung ta, toi va moi nguoi, minh cung lam cho toi! Cong viec. Neu chua tot se bi khien trach.

ĐÁP ÁN, CHẤM IN.INP OUT.OUT

!: \? , ,tOi va moi ngUOi.chung mInh , Phai cung lam ; cho tot ?cONg viec ! neu chua tot, se bi :cap TRen KHIEN trach ,Phe binh ;: / !’

Toi va moi nguoi. Chung minh, phai cung lam; cho tot? Cong viec! Neu chua tot, se bi: cap tren khien trach, phe binh.

Program ChuoiChuan; const inFile='in.inp';outFile='out.out'; var s:string;f: text; procedure Nhap; begin assign(f,inFile); reset(f); readln(f,s); close(f); end; procedure Xuat; begin assign(f,outFile); rewrite(f); write(f,s); close(f); end; Procedure CatDauChuoi; var kt:boolean; begin kt:=false; while not kt do if lowercase(s[1]) in ['a'..'z'] then kt:=true else begin delete(s,1,1); kt:=false; end; end; Procedure CatCuoiChuoi; var kt:boolean; begin kt:=false; while not kt do if lowercase(s[length(s)]) in ['a'..'z'] then kt:=true else begin

Function CatKhoangTrang(chuoi:string):string; var i:integer; kt:boolean; Begin i:=2; kt:=false; while (i<length(chuoi)) and (kt=false) do begin if (chuoi[i]=' ') and (chuoi[i+1]=' ') then begin delete(chuoi,i+1,1); CatKhoangTrang:=CatKhoangTrang(chuoi); kt:=true;end;inc(i);end; if kt=false then CatKhoangTrang:=chuoi; End; procedure ChuanChuoi; var i: integer; begin s:=lowercase(s); s:=CatKhoangTrang(s); s[1]:=Upcase(s[1]);i:=2; while i<=length(s) do begin if (s[i]=',') or (s[i]=':') or (s[i]=';') then s[i+2]:=lowercase(s[i+2]); if (s[i]='.') or (s[i]='!') or (s[i]='?') then s[i+2]:=Upcase(s[i+2]); inc(i); end;

Page 48: TÀI LIỆU ÔN TẬP - c2tichthien.vinhlong.edu.vn

ÔN TẬP THI TIN HỌC TRẺ BẢNG B, C (Free Pascal)

KS. Nguyễn Thanh Sang - 0908811528 46

delete(s,length(s),1);kt:=false;end; end; procedure XuLy; var i: integer; begin CatDauChuoi; CatCuoiChuoi; i:=1; while i<=length(s) do begin if (s[i]=',') or (s[i]=':') or (s[i]=';') or (s[i]='!') or (s[i]='?') or (s[i]='.') then begin while s[i-1]=' ' do begin dec(i); delete(s,i,1); end; while s[i+1]<>' ' do insert(' ',s,i+1); end; inc(i); end; end;

insert('.',s,length(s)+1); end; BEGIN Nhap; XuLy; ChuanChuoi; Xuat; END.

CÒN NỮA…. SẼ ĐƯỢC TIẾP TỤC CẬP NHẬT