- 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 (N41.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 mối 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 (N10.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ự);
- Dữ liệ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]=1n1a[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