1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu ôn tập thi Tin học trẻ

48 11 0

Đ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 48
Dung lượng 873,35 KB

Nội dung

- 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.[r]

(1)

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

nguyenthanhsang.1980@gmail.com

Tháng 05/2017

(2)

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

(3)

BẢNG B (THCS) VÀ BẢNG C (THPT)

Lập trình bằng FREE PASCAL để giải bài tốn khó hoặc lập trình để thực

số công việc thông thường máy vi tính.

- Mức độ khó tương ứng với mặt trình độ chung cấp học Nêu cao tính sáng tạo học sinh việc xác định thuật toán để giải, phương pháp kiểm tra tính đắn

của 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 loại liệu có cấu trúc (dữ

liệu kiểu mảng, kiểu xâu, kiểu tệp, kiểu ghi, ).

- Học sinh phải nắm rõ phương pháp nhập liệu vào (từ tệp văn bản) phương

pháp xuất kết 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 - 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

<= >= := += -= *= /= (* *) ( .) //

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

constructor destructor 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

(4)

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 (hàm - Function, thủ tục -

Procedure) Cách đặt sau :

- Bắt đầu chữ cái, sau là chữ cái, chữ số hay là dấu nối, không có

khoảng trắng độ 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 một

- Danh hiệu nên đặt cho chúng nói lên ý nghĩa đối tượng mà biểu thị Điều này sẽ giúp dễ gọi viết chương trình

6 Các phím chức cần biết:

- F2 : Lưu chương trình soạn thảo

- F3 : Tạo file pas 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 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

(5)

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 lệnh chương trình chính

END  Kết thúc chương trì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 chương trình gõ Ctrl + F9 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 Hello

- Sử dụng thư viện Crt - liên quan đến chế độ text chương trình - Biến Ten có kiểu là String (chuỗi).

- Thủ tục có tên Nhap để thực việc nhập tham số vào biến Ten chương trình - Phần chương trình từ BEGIN đến END (có dấu chấm “.”) kết thúc chương trình - Sau câu lệnh và từ End chương trình đ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 dấu chấm “.”.

III MỘT VÀI CHƯƠNG TRÌNH ĐƠN GIẢN LÀM QUEN VỚI FREE PASCAL:

(6)

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 màn hình dịng chữ đặt dấu nháy đơn chuyển trỏ xuống

dòng

- Write : xuất ra hình dịng chữ dấu nháy đơn khơng chuyển 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 màn hình

- Writeln: xuất màn hình dịng chữ đặt dấu nháy đơn chuyển trỏ xuống dịng - Write: xuất ra hình dịng chữ dấu nháy đơn khơng xuống dịng

(7)

- 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 gì mà máy tính xử lý.

Chương trình = thuật tốn + cấu trúc liệu

Kiểu liệu gồm 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), ghi (record), tập hợp

(set), tập tin (file) - Kiểu trỏ (pointer).

1 Kiểu số nguyên (Integer Type):

* Từ khóa:Free Pascal đã khắc phục bài tốn số lớn 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 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 nlên đơn vị)

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

(8)

* 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 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 là số thực

Abs(x) Lấy trị tuyệt đối số x

Sqr(x) Lấy bình phương số x

Sqrt(x) Lấy bậc hai số x

Sin(x) Lấy sin số x

Cos(x) Lấy cosin số x

Arctan(x) Lấy arctang số x

Ln(x) Lấy logarit nepe số x (e=2.71828)

Exp(x) Lấy logarit nepe số e số x (ex)

Trunc(x) Lấy phần nguyên lớn < 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ể qua giá trị TRUE (đúng) 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

(9)

- Phép OR : Cho kết FALSE A=B=FALSE

- Phép XOR: Cho kết TRUE 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 bằng

<= Nhỏ bằng

<> Khác

4 Kiểu ký tự (Char type) :

* Từ khóa: tất liệu viết dạng chữ ký tự khai báo từ khóa CHAR. * Các hàm chuẩn:

Ký hiệu Ý nghĩa

Ord(c) Cho thứ tự c bảng mã ASCII

Chr(n) hay #n Cho ký tự có số thứ tự là n 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ả số thứ tự kytu bảng mã ASCII CHR(so) Trả kí tự vị trí so (có thể viết tắt là #so)

PRED(kytu) Trả kí tự nằm trước kí tự kytu bảng mã ASCII SUCC(kytu) Trả kí tự nằm sau kí tự kytu bảng mã ASCII ASB(x) Giá trị tuyệt đối x.

SQR(x) x bình phương.

SQRT(x) căn bậc x.

ROUND(x) làm tròn phần lẻ thập phân 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 đơn vị.

(10)

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 dao động âm với tần số F; số nguyên, cho

đến ta gọi Nosound

InsLine chèn một dịng trống vào hình ở vị trí trỏ.

DelLine Xóa tồn bộ dịng hình chứa trỏ sau dồn

dịng ở lên

Exit Thốt vơ điều kiện khỏi chương trình Halt Dừng hẳn chương trình

Break Thốt khỏi vịng lặp chứa lệnh Break.

KeyPressed cho giá trị True ta nhấn phím bàn phím,

và kí tự cịn chờ nhớ đệm bàn phím,

chưa đưa 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 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 khoảng và (0 <= Random < 1) Random(Number) cho giá trị số nguyên Random, Random một số ngẫu

nhiên nằm khoảng 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 biến kiểu có tên 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ị Nêu không đổi đc,code là sơ ngun cho biêt vtrí gây lỗi.

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

DEC(x,r) Giảm giá trị x xuống r đơn vị Tương đương với

x=x-r DEC(x) xem giảm x đơn vị

Insert(S,T,vt) Chèn chuoi S vào chuoi T vtrí vt Delete(S,P,L) Xố L ký tự từ vị trí P khỏi

Break kết thúc vòng lặp

(11)

HÀM CHỨC NĂNG

Odd(I:Integer) Cho True I sô lẻ và False I sô chẵn

Pos(X,S) Cho vị trí bắt đầu chuỗi X 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ộ phần tử mảng a = 0

THỦ TỤC TRONG Unit Crt

Clrscr xóa tồn bộ màn hình đưa trỏ góc trái trên ClrEol Xóa ký tự nằm bên phải trỏ.

Gotoxy(x,y) đặt trỏ tới tọa độ x, y màn hình (x tọa độ cột từ

– 80, y tọa độ hang từ – 25)

TextColor(Color) Định màu cho văn (với Color có giá trị từ – 15) TextBackGround(color) Đặt màu nền văn bản.

NormVideo Định độ sang bình thường.

LowVideo Định độ sáng yếu đi.

WhereX Tọa độ cột trỏ màn hình hiện hành WhereY Tọa độ hàng trỏ màn hình hiện hành Readkey Đọc 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 để 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 liệu từ File vào biến.

Readln(F1, <DS sách biến>)

Đọc liệu từ File vào biến, 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 trỏ cuối File.

EOln(F1) có giá trị True trỏ sau ký tự cuối cùng của

dòng (File văn bản).

(12)

HÀM CHỨC NĂNG

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

FileSize(F1) cho biết số record tập tin kiểu Record.

FilePos(F1) Cho biết vị trí hành của trỏ file Record

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

Seek(F1, n) Đưa trỏ file đến cuối Record thứ n.

Erase(F1) Xố file, khơng xố file mở.

Rename(F1, tên mới) Đổi tên file F1 thành tên mới, không đổi tên file

đang mở.

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

write() in hình liền sau kí tự cuối.

writeln() in xuống 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 cho nhập và xuất liệu:

PROGRAM Tên_chương_trình;  Tên chương trì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

Thủ tục đọc liệu từ File văn bản: Nếu file có số N

Procedure Nhap; Var …;

Begin

Nếu file có N dịng N phần tử thuộc mảng số A đó.

(13)

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

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

Close(F); End;

Thủ tục ghi liệu ỉa File văn bản: Nếu ghi 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 đó ra N dòng của file

Procedure xuat; Begin

assign(F,Fo);rewrite(F); For i:=1 to N

writeln(F,A[i]); Close(F);

End;

Bài 1: Tìm mối liên h

Cứ 02 điểm cho trước có 02 mối liên hệ qua lại với Xem

hình minh họa bên, ta thấy, với 03 điểm cho trước A, B, C có 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 mối liên hệ qua lại từ N điểm cho trước.

- Dữ liệu vào:file văn moilienhe.inp chứa số tự nhiên N (N41.108)

- Dữ liệu ra: file văn moilienhe.out chứa kết là tổng số tất

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

2 999 997002

3 9999999 99999970000002

4 1000000000 999999999000000000

5 4100000000 16809999995900000000

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

(14)

Bài 2: Tìm mi liên h

Cứ 02 điểm A, B cho trước có 01 mối liên hệ với AB

hoặc BA Xem hình bên ta thấy, với điểm A, B, C cho trước có

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 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 moilienhe.inp chứa số nguyên dương N

(N  60.108)

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

moilienhe.inp moilienhe.out

3

ĐÁP ÁN, CHẤM

Test moilienhe.inp moilienhe.out Điểm

1 0,5

2 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 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 01 dấu

cách) số tự nhiên K (K  N  100) Hãy viết chương trình ghi phần tử dãy A có số lần xuất từ K lần trở lên theo thứ tự tăng dần, khơng có thì ghi chữ ‘NO’

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

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

indayso.inp indayso.out

10

1 1 5 20 20 5

20

5

0

NO

ĐÁP ÁN, CHẤM

Test indayso.inp indayso.out Điểm 5

5 5 5

5

2 10

0 3 5

0

A

B

(15)

3 10

5 5 5 10 10 10 10 10

NO

4 13

12 15 15 15 20 20 17 19 17 17 20 19 19

15 17 19 20

5 20

1 50 2 1 100 100 100 100 1

1 100

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) 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 inc(b[a[i]]); For i:=0 to 100

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ố sử dụng số và 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 2to10.inp chứa chuổi nhị phân S (dài không 63 ký tự). - Dữ liệu ra:file văn 2to10.out chứa kết 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

2 111110000011111 31775

3 1001010100000010111110001111111111 9999999999

4 10 60 số 4611686018427387905

5 11 60 số 1 9223372036854775807

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

(16)

Bài 5: Tìm ẩn

Với dãy số tự nhiên: a[1]=a[2]=a[3]=1 a[n]=a[n-1]+a[n-3]

- Dữ liệu vào:file văn timan.inp chứa số nguyên dương n (n < 119).

- Dữ liệu ra:file văn timan.out chứa kết là giá trị a[n] cần tìm (khơng chứa số ở đầ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 1

2 10 19

3 50 83316385

4 101 24382819596721629

5 118 16188319274058017956

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 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ố coi là bạn tổng ước số số này bằng số ngược lại,

cụ thể: tổng ước số M = N và tổng ước số N = M thì M N bạn.

Hãy viết chương trình nhập số nguyên dương K (K  20.000) liệt kê tất cả cặp

số M, N là bạn (1  M, N  K; M < N cặp M, N là nhất, khơng tính cặp

hốn vị) Nếu khơng có cặp M, N nào điền số 0.

- Dữ liệu vào:file văn solaban.inp chứa số nguyên dương K.

- Dữ liệu ra: file văn solaban.out chứa i dòng, mỗi dòng một cặp số M, N thoả điều kiện nêu (M N cách 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

2 500 220 284

3 3000

220 284 1184 1210 2620 2924

1

4 6300

220 284 1184 1210 2620 2924

(17)

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

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 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 xâu F1, F2, F3, , FN, đó: F1 = ‘0’, F2 = ‘1’, F3 = ‘01’, F4 = ‘100’, F5 = ‘01110’, FK+1 = FK + FK-1 ( phủ định và  K 13) xếp liên tục nhau.

Cho xâu S độ dài không 255, chỉ bao gồm ký tự ‘0’ và ‘1’ Hãy xác định số lần

xuất xâu S xâu FK (Chú ý: hai lần xuất S FK không nhất thiết phải là xâu rời hoàn toàn)

- Dữ liệu vào: file văn fibo01.inp bao gồm i dịng, mỗi dịng có dạng K S (K và S

cách đúng 01 khoảng cách).

- Dữ liệu ra: file văn fibo01.out, bao gồm i dòng, mỗi dòng kết ứng với

dòng từ liệu vào Xem ví dụ:

fibo01.inp fibo01.out

3 3 10 8 011

1 0 3

ĐÁP ÁN, CHẤM

Test fibo01.inp fibo01.out Điểm

1

3 10

1

(18)

8 011

2

8 111 0110 10001

2

1

3

10 00 11 11000 12 101010

13

1

4 13 10 64

5 12 1011011 13 10110100000

5

0

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 := to 13 begin

tam1:=S[i-1]; tam2:=S[i-2];

for j:=1 to length(tam1) if tam1[j]='0' then tam1[j]:='1' else tam1[j]:='0';

for j:=1 to length(tam2) 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

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)

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 (trừ nó) (ví dụ: = + + 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 sohoanhao.inp chứa số nguyên dương N (N10.107)

- Dữ liệu ra: file văn sohoanhao.out kết phân tích số hoàn hảo (mỗi số cách nhau 01 khoảng cách) Nếu khơng thể phân tích thì ghi số Xem ví dụ dưới:

sohoanhao.inp sohoanhao.out

6 1

7 0

ĐÁP ÁN, CHẤM

Test sohoanhao.inp sohoanhao.out Điểm

1 28 14

2 29

(19)

4 8128 16 32 64 127 254 508 1016 2032 4064

5 100000000

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

if (m mod i)=0 then begin

S:=S+i; str(i,st);

if hoanhao='' then hoanhao:=st else hoanhao:=hoanhaớ '+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ự đưa tất cách thay đổi vị trí ký tự chuỗi ký tự cho trước để tạo thành chuỗi ký tự khác (Ví dụ: cho chuỗi ký tự “abc” kết đảo ký tự là chuỗi “abc”, “acb”, “bac”, “bca”, “cab”, “cba”)

Yêu cầu: viết chương trình thực đảo ký tự cách trên. - Dữ liệu vào: tệp vă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] ≤ ký tự);

- Dliệu ra: tệp văn daokytu.out gồm tất cách thay đổi vị trí ký tự

chuỗi S[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

Le

Le eL

1

2 Le Ket

Le eL Ket Kte

(20)

Test daokytu.inp daokytu.out Điểm eKt

etK tKe teK 3

Ket Nap Dang

Ket Kte eKt etK tKe teK Nap Npa aNp apN pNa paN Dang

(22 từ) gnaD

1

4 a ab c d abc

a ab ba c d abc acb bac bca cab cba

1

5 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 write(fo,x[i]); writeln(fo);

end;

procedure GhiChuoi(i:integer); var j:integer;

begin

for j:=1 to l 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

begin

readln(fi,chuoi);l:=length(chuoi); fillchar(c,sizeof(c),true);

GhiChuoi(1); end;

(21)

Bài 9:Đếm tam giác cân

Cho N (N<=100) điểm lưới tọa độ Oxy, tính xem điểm tạo tối đa

bao nhiêu tam giác cân?

- Dữ liệu vào : file văn bản

+ Dòng : ghi số N là số điểm lưới tọa độ Oxy

+ N dòng tiếp: dòng thứ i ghi số x, y (x, y <=100) nguyên thể tọa độ điểm thứ

i, cách nhất dấu cách.

- Dữ liệu ra : file văn chứa số là số tam giác cân tối đa tạo

Xem ví dụ:

demtgcan.inp demtgcan.out 4

0 1 2 1

ĐÁP ÁN, CHẤM ĐIỂM

Test demtgcan.inp demtgcan.out Điểm

0 1

3

2 0 1 2 -1 -2 -3

0 1

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

4 1

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

2 1

5 15 0 -1 -3

(22)

Test demtgcan.inp demtgcan.out Điểm 25 11

7 -2 -11 -9 14 23 23 -12 -5 -7 -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 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 for j:=i+1 to n-1 for k:=j+1 to n 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 xâu F1, F2, F3, , FN, đó: F1 = 'A', F2 = 'B', FK+1 = FK + FK-1 (K  2) Ví dụ:

F1 = 'A'

F2 = 'B' F3 = 'BA'

F4 = 'BAB'

F5 = 'BABBA'

(23)

F7 = 'BABBABABBABBA'

F8 = 'BABBABABBABBABABBABAB'

F9 = 'BABBABABBABBABABBABABBABBABABBABBA'

Cho xâu S độ dài không 255, chỉ bao gồm ký tự 'A' và 'B' Hãy xác định số lần

xuất xâu S xâu FN, N  35 Chú ý: hai lần xuất S FN không nhất thiết phải là xâu rời hoàn toàn

- Dữ liệu vào: từ file văn FIBISTR.INP, bao gồm nhiều dòng, mỗi dòng có dạng N

S Giữa N S có dấu cách Dữ liệu vào chuẩn, không cần kiểm tra.

- Dữ liệu ra: đưa file văn FIBISTR.OUT, dòng dữ liệu ứng với dịng kết

quả 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 26 ABBABABBABBABABBA

30 ABBABBABABBABBABABBABABB 11 ABBABABBABBABABBABABBA 34 BABABBABABBABBABABBABBAB 25 BBA 24 ABBA 10945 28656 196417 17711 10945

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 1596 196417 17710 121392 376

(24)

Test fibistr.inp fibistr.out Điểm 25 BABB 32 BBABABBABABBABBABABBAB 19 ABABBABABBABBABABBABBABAB 14 BBABABBABBABABBABBABABBAA 10 ABBABABBABBABABBABABBABB 12 BABA 17711 121392 143 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 10945 2584 144 4180 28657 6764 232 609 10945 1596 232 54 121392 10945 46367 232 2583 54 377 28657 987 986 1596 196417 89

5 29 B 317811

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 Inc(k); FillChar(F, k shl 2, 0);

F[k] := Count(S[k]);

F[k + 1] := Count(S[k + 1]); if n <= k + then

begin

Solve := F[n]; Exit;

end;

OddCount := Count(Copy(OddCenter, OddP - t, t + t));

EvenCount := Count(Copy(EvenCenter, EvenP - t, t + t));

(25)

begin c := 0;

for i := to Length(S) - l 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 := to 13

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)

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 thực 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 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 tốn kết

kinh doanh

- Dữ liệu vào: file văn kinhdoanh.inp gồm:

+ Dòng đầu tiên chứa số N.

+ N dòng tiếp theo, dòng chứa hai số M và B cách 01 khoảng cách.

- Dữ liệu ra: file văn kinhdoanh.out chứa kết là số tiền huề vốn, lời lỗ

Xem ví dụ bên dưới:

kinhdoanh.inp kinhdoanh.out 2

5 6

2 5 10 6

2 5 6

-2

ĐÁP ÁN, CHẤM

Test kinhdoanh.inp kinhdoanh.out Điểm

1 50 65 150 141 15 30 121 200

(26)

300 300 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

123456 123489 1111 2222 456789 234567 1234567 123456 5678910 567899

1500000000000000000 1500000000000000010

-6443190 0,5

4

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

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 B Hãy tính tổng chúng.

- Dữ liệu: file văn sum.inp chứa hai số nguyên dương A B, số nằm trên 01 dòng (A, B ≤ 10250)

- Dữ liệu ra: file văn sum.out chứa kết 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 12345

02016

(27)

2 097984 002016

100000

3 012345678910999990000 2016

12345678910999992016

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

9999…9 (200 số 9)

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

1100…0 (249 số 0)

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) s1:='0'+s1; while(length(s2)<250) s2:='0'+s2; i:=1;c:=0;

while (i<=l1) or (i<=l2) 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 begin

Str(m[i],s3); Tong2S:=Tong2S+s3; end; i:=1;

While Tong2S[i]='0' 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 An có bánh kem hình trịn, bánh được viền quanh

loạt Dâu và Táo Một bạn gái nêu một câu hỏi “Đố bạn cắt bánh

một nhát dao thành phần cho số lượng Dâu và Táo phần bánh

nhau”

Hãy viết chương trình để giúp An và bạn trong buổi sinh nhật giải câu đố trên

- Dữ liệu vào: file vă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 Dâu và Táo 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’ ký tự thứ i là quả Táo) Các vị trí gắn bánh đánh số

thứ tự từ đến N theo chiều kim đồng hồ vị trí tùy ý

- Dữ liệu ra: file vă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ách cắt bánh trên K dòng, mỗi dòng ghi 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à quả thuộc hai

phần bánh (i và j cách nhau 01 khoảng cách).

(28)

chiabanh.inp chiabanh.out 6

DTTTDT

3 4 6 5

DTDDT

-1

ĐÁP ÁN, CHẤM

Test chiabanh.inp chiabanh.out Điểm

DTDDTTTT

-1 0,5

2 12

DTTDDTTDDTTD

1 10 12 11

0,5

3 12

TDTDTDTDTDTD

1 10 11 12 10 11 12

0,5

4 20

TTTTTTTTTTDDDDDDDDDD

6 15 16

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 S[i]:='T';

for i:=1 to n 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 if S[k]='D' then dec(Sd);

for k:=1 to j 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 begin

j:=i+c-1;

if j>n then j:=j-n;

if CatDuoc(i,j) then

(29)

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

Close(f); End; BEGIN

dau:=0; Nhap; XuLy; END

Bài 14: Tìm s

Dãy số tự nhiên 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 dãy số trên (chạy càng nhanh tốt).

- Dữ liệu vào:file văn timso.inp chứa số nguyên dương K (K ≤ 16.1018)

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

timso.inp timso.out

10

ĐÁP ÁN, CHẤM

Test timso.inp timso.out Điểm

1 11 0,5

2 99999 0,5

3 1234567890 0,5

4 789789789789 0,5

5 111222333444555 0,5

6 15000000000000000000 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

begin

coso := coso * 10; Inc(chuso); Inc(tongso, coso * * chuso); end;

Dec(tongso, coso * * chuso);

Dec(k, tongso);

coso:= coso+ (k - 1) div chuso; k:= (k - 1) mod chuso + 1; i:=1;

while i<=chuso-k 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 phân tích dưới dạng tổng 02 số nguyên tố Viết chương

trình thực tách số tự nhiên thành tổng số nguyên tố (tất trường hợp),

nếu khơng phân tích thì ghi lại nó.

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

- Dữ liệu ra: file văn ptso.out chứa kết (mỗi dòng một trường hợp, số

trên dịng cách đúng 01 khoảng cách). Xem ví dụ bên dưới:

ptso.inp ptso.out

(30)

5

11 11

ĐÁP ÁN, CHẤM

Test ptso.inp ptso.out Điểm

1 20 17

7 13

2 59 59

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 997

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 begin

if (a mod j) = 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 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 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 timan.inp chứa số nguyên dương n (n ≤109)

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

mẫu:

timan.inp timan.out

(31)

ĐÁP ÁN, CHẤM

Test timan.inp timan.out Điểm

1 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 ký tự chữ và số, bắt đầu ký số Hãy viết chương trình để

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

- Dữ liệu vào:file văn xepchuoi.inp chứa chuỗi S.

- Dữ liệu ra:file văn xepchuoi.out chứa kết là chuỗi S đã sắp xếp theo thứ tự tăng dần giảm dần theo điều kiện nêu 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

2 a a

3 19JJk40lmmjAbx5abdD77 0145779AabbdDJJjklmmx

4 09JJk40lmmjAbx5abdD77 xmmlkJJjdDbbAa9775400

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 For j:=l downto i

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

(32)

For i:=2 to l For j:=l downto i

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 dòng nhất chứa ngày/tháng/năm số N cách khoảng cách.

- Dữ liệu ra: file văn ngaythangnam.out chứa kết 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 nhiều số tự nhiên liên tiếp hay không? Nếu có, thì cách liệt kê tất cách có Nếu khơng, thì thơng báo bằng số và ghi lại số đó.

(33)

- Dữ liệu ra:file văn phantichso.out chứa kết là i dòng Dòng đầu tiên ghi số

cách phân tích, i-1 dịng tiếp theo, dòng một cách, số tự nhiên liên tiếp trên một

dòng cách đúng 01 dấu +.

Chú ý: thứ tự xếp phần tử từ nhỏ đến lớn, từ trái sang phải và 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

4+5 2+3+4

1

2 2048

2048

1

3 76

6+7+8+9+10+11+12+13

1

4 99

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

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

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 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]

(34)

- Dữ liệu ra:file văn timan.out chứa kết 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 20 1,5

2 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 tachchuoi.inp chứa chuỗi S.

- Dữ liệu ra: file văn tachchuoi.out chứa kết gồm dòng Dòng chuỗi

chữ, dòng chuỗi số Nếu 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) 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);

(35)

Bài 22: Phân tích s

Mọi số tự nhiên N phân tích dạng tổng 02 số nguyên tố Viết chương trình tìm tổng số cách để tách số tự nhiên thành tổng 02 số nguyên tố.

- Dữ liệu vào:file văn phantichso.inp chứa số N  18.000

- Dữ liệu ra:file văn phantichso.out chứa kết 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 1,5

2 150 12 1,5

3 999 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 begin

if (a mod j) = 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 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ừ dãy n phần tử gồm số 0, cho trước Hãy viết chương trình kiểm tra xem

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

- Dữ liệu vào: từ file văn day01xenke.inp chứa dãy 01

- Dữ liệu ra: file văn day01xenke.out chứa kết là K cặp 01 xen kẽ thoả điều kiện, ngược lại ghi số i j (trong đó, i và j hai vị trí sai đầu tiên, i<j, i j cách

đúng dấu cách) Xem ví dụ dưới:

day01xenke.inp day01xenke.out

10101 2

10011 2

ĐÁP ÁN, CHẤM

Test day01xenke.inp day01xenke.out Điểm

1 101010100

(36)

3 0101010101010101010

4 01010110101101010101

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 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]=   

n

n ai Tìm a[n]

- Dữ liệu vào:file văn timso.inp chứa số nguyên dương n (n ≤ 75).

- Dữ liệu ra: file văn timso.out chứa kết 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 1

2 25 978793

3 60 1792344042191491

4 75 16717180390659349953

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 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 nhiều

Viết chương trình tìm những ký tự xuất nhiều (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).

(37)

- Dữ liệu ra: file văn kytu.out chứa kết là xâu liên tục chứa ký tự xuất

hiện nhiều 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

2 aEbeEcddcC ce

3 Z z

4 ZzaaabcjJjSSSZZzzAKtAAsCCsjBbjfjs ajsz

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) inc(x[lowercase(s[i])]);

max:=0;

for j:='a' to 'z' if (x[j]>max) and (max>0) then max:=x[j];

for j:='a' to 'z'

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 biểu diễn thành tổng

của hai nhiều số tự nhiên liên tiếp hay khơng? Nếu có, hãy liệt kê tất cách

có Nếu khơng, thì thơng báo bằng số 0.

- Dữ liệu vào:file văn phantichso.inp chứa số N.

- Dữ liệu ra: file văn bản phantichso.out chứa kết là i dòng, mỗi dòng một

cách, số tự nhiên liên tiếp trên một dòng cách đúng 01 dấu +.

Chú ý: thứ tự xếp 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 2+3+4

4+5

0,5

2 2048 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

(38)

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

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 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 số nguyên tố có N chữ số

Số nguyên tố là số tự nhiên lớn 1, có ước số là chính Cho trước

số tự nhiên N, tìm tổng tất số nguyên tố có N chữ số.

- Dữ liệu vào:file văn sumnt.inp chứa số N.

- Dữ liệu ra: file văn sumnt.out chứa kết là Tổng 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 1,5

2 1043 1,5

3 75067 1,5

4 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 aLTb:=aLTb*a; end;

function KTnt(a:Qword):boolean; var b:Qword;

kt:boolean; begin

kt:=true; b:=2;

while (b<=trunc(sqrt(a))) 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

begin

if KTnt(tu) then Tong:=Tong+tu; inc(tu,2);

end;

assign(F,Fo); rewrite(F); write(F,Tong);

(39)

Bài 28: Đếm cặp 01

Từ chuỗi vịng trịn khép kín S gồm số 0, cho trước Hãy viết chương trình đếp số cặp 01 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 cap01.inp chứa

chuỗi S.

- Dữ liệu ra: file văn cap01.out chứa kết 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

2 1001100011010101

3 10010101000000101111100011111111110

4 10001010110001110010001100000100100010011110100000000 00000000000

12

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)

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 a[n]=1n1a[i] +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 timan.out chứa kết 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,5

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

1

0

1 0

(40)

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 phần tử từ đến Phép rút gọn là chỉ ghi lại

phần tử (0 9) mà tổng phần tử giống là lớn Hãy tìm dãy số liên tục

mới là rút gọn dãy đã cho (theo thứ tự tăng dần).

- Dữ liệu vào:file văn rutgon.inp chứa dãy số liên tục.

- Dữ liệu ra: file văn rutgon.out chứa kết 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, số và 3+3+3=9 lớn nhất):

rutgon.inp rutgon.out

1934334 39

ĐÁP ÁN, CHẤM

Test rutgon.inp rutgon.out Điểm

1 1934334 39

2 1122113451231 123

3 1

4 0000111222222222222944545556774848784333336 663393

23468

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) inc(a[s[i]]);

max:=0;

for j:='0' to '9' if (a[j]*(ord(j)-48))>max then max:=a[j]*(ord(j)-48);

for j:='0' to '9'

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ố sử dụng số và 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 doi10to2.inp chứa số N.

- Dữ liệu ra: file văn doi10to2.out chứa kết là số nhị phân vừa đổi từ số N

Xem ví dụ mẫu:

doi10to2.inp doi10to2.out

3 11

(41)

ĐÁP ÁN, CHẤM

Test doi10to2.inp doi10to2.out Điểm

1 10 1010 1,5

2 9999999999 1001010100000010111110001111111111 1,5

3 9223372036854775807 111111111111111111111111111111111111111111

111111111111111111111 1,5

4 10000000000000000000 100010101100011100100011000001001000100111

1010000000000000000000 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

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 tốn ni th

Bài toán cổ việc sinh sản cặp thỏ đặt sau:

(1) Giả sử thỏ không chết;

(2) 02 tháng sau đời, cặp thỏ sinh 01 cặp thỏ (01 đực, 01 cái); (3) Khi đã sinh rồi thì cứ tháng chúng lại sinh 01 cặp (01 đực, 01 cái).

Giả sử từ tháng có 01 cặp thỏ thì đến tháng thứ n (n ≤ 1.000) có tổng

cộng bao nhiêu thỏ Hãy viết chương trình để giải bài tốn

- Dữ liệu vào:file văn nuoitho.inp chứa số tự nhiên n (tháng thứ n).

- Dữ liệu ra:file văn nuoitho.out chứa kết là tổng số thỏ có tháng thứ n.

nuoitho.inp nuoitho.out

5 10

ĐÁP ÁN, CHẤM

Test nuoitho.inp nuoitho.out Điểm

1 10

2 50 25172538050

3 92 15080227609492692858

4 1000 8693311537387491287137705535008125160512932103474356 0804963458179073110835898103780807759680158510338591 8451861606452695504193792464797466449423232859928818 1306637587659793929985703200740895227559033369845775

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;

BEGIN

assign(F,'nuoitho.inp'); reset(F); readln(F,thang);close(F);

if thang>2 then Begin

(42)

m: array[1 250] of integer; begin

Tong2S:='';

l1:=length(s1); l2:=length(s2); while(length(s1)<220) s1:='0'+s1; while(length(s2)<220) s2:='0'+s2; i:=1;c:=0;

while (i<=l1) or (i<=l2) 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 begin Str(m[i],s3); Tong2S:=Tong2S+s3; end; i:=1;

While Tong2S[i]='0' 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 (trừ nó) bằng (ví dụ: = + + 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 từ đến N:

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

- Dữ liệu ra: file văn timsohh.out chứa kết quả là số hoàn hảo vừa tìm được Nếu

khơng có 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

2 28 28

3 500 496

4 10000 8128

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) 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)) dec(j);

assign(F, Fo); rewrite(F);

if j=1 then write(F,0) else write(F,j); Close(F);

(43)

Bài 34: Sắp xếp chuỗi

Cho một chuỗi S (không là chuỗi rỗng) một số nguyên N, 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) giảm dần (nếu N=1), chuỗi khơng có chữ 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 chứa chuỗi S (S  255 ký tự)

- Dữ liệu ra: file văn sapxepchuoi.out chứa kết quả gồm 02 dòng, dòng chuỗi

số, dòng 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

Zm973b9jf022gg

0223799 bfggjmZ

1

2

0123456789

9876543210 -

1

3

AbcdefGHijk

-

kjifedcbHGA

1

4

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

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 For j:=n downto i

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

(44)

Begin

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

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 người) đánh số từ đến N Khi có

một đồn khách đến thuê phịng, tiếp tân khách sạn xếp khách vào phòng theo nguyên tắc sau: cặp khách xếp vào phịng có chỉ số nhỏ số

phòng trống Nếu số lượng khách đoàn 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ỏ số 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ẽ xếp tuần tự người vào phịng có chỉ số

nhỏ số phịng mới có khách (của đồn khách trước đó) Đầu tiên phịng của khách sạn trống và giả thiết rằng, đồn khách đến khách sạn

cùng thời điểm và tổng số khách tất cảcác đồn khơng vượt q sức chứa khách sạn

( 2N)

Yêu cầu

Cho trước trình tự đến đoàn khách số lượng khách đoàn Hãy xác

định số lượng khách phòng của khách sạn. - Dữ liệu vào:file văn ROOMS.INP

+ Dòng đầu tiên chứa 2 số nguyên dương N (1<=N<=100) G ghi cách

bởi dấu cách N là số phịng của khách sạn, G là số lượng đồn khách đến khách sạn.

+ Dòng thứ i số G dòng tiếp theo chứa số lượng khách đoàn khách thứ i (các đoàn khách đánh số theo số thứ tự đến khách sạn, 1).

- Kết quả: file vă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 1 4

2 1 1 2 2 0 0

ĐÁP ÁN, CHẤM

Test rooms.inp rooms.out Điểm

1

2 2 2 2

1

2 10

2 2 2

(45)

2

2 2 2 10

3

2 2 2

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

begin

readln(F,x);

while (t<n) and (x>1) 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) 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 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, a2, …, aN, với N ≤ 1.000

Yêu cầu: Hãy tìm cách thực hiện một số phép đổi chỗ số hạng dãy

để thu 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 DAYSO.INP

+ Dòng đầu tiên chứa số nguyên dương N

+ Dòng thứ i số N dòng tiếp theo chứa số hạng a

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

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

- Kết quả:file văn DAYSO.OUT Dòng đầu tiên ghi số lượng phép đổi chỗ cần

(46)

Ví dụ:

DAYSO.INP DAYSO.OUT DAYSO.INP DAYSO.OUT 6

1 2 3 4 6 5

1 5

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 3

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 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 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 begin

i:=1; j:=1;

while A[i]<>1 inc(i); while A[j]<>2 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;

(47)

Bài 3: Chuỗi chuẩn(2 điểm)

Chuỗi chuẩn là chuỗi qui định:

- Đầu chuỗi phải là một ký tự chữ (‘a’ ‘z’ ‘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) 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 dấu câu khác.

- Cuối câu là dấu chấm.

Trong một đoạn văn khơng tính tới lỗi sai tả mà chỉ tính lỗi sai

nêu viết chương trình sửa lỗi đó.

Dữ liệu vào:file văn IN.INP chứa đoạn văn

Dữ liệu ra: file văn OUT.OUT chứa đoạn vă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

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

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)

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

(48)

delete(s,length(s),1);kt:=false;end; end;

procedure XuLy; var i: integer; begin

CatDauChuoi; CatCuoiChuoi; i:=1;

while i<=length(s) 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]=' ' begin

dec(i);

delete(s,i,1); end;

while s[i+1]<>' ' insert(' ',s,i+1);

end;

inc(i); end;

end;

insert('.',s,length(s)+1); end;

BEGIN Nhap; XuLy;

ChuanChuoi; Xuat;

END

Ngày đăng: 01/04/2021, 07:29

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w