You are on page 1of 11

BÀI TẬP DẠNG FILE

Bài 1: Hai số được gọi là giao nhau nếu có ít nhất một chữ số của số này có mặt trong
số kia và ngược lại. Các chữ số này được gọi là chữ số giao nhau của hai số.
Yêu cầu: Cho 2 số nguyên m và n. Hãy tìm các chữ số giao nhau của hai số đã cho.
Dữ liệu: Cho vào từ tệp văn bản sogiao.inp gồm 1 dòng ghi 2 số nguyên m và n cách
nhau một dấu cách (0<m<n<109)
Kết quả: Ghi ra tệp văn bản sogiao.out các chữ số giao nhau của hai số đã cho trên
cùng một dòng theo thứ tự từ nhỏ đến lớn. Giữa các số cách nhau một khoảng trắng.
Nếu hai số không giao nhau thì ghi -1
Ví dụ:
SOGIAO.INP SOGIAO.OUT SOGIAO.INP SOGIAO.OUT
1234 3456 34 123 789 -1

program giaonhau;
var st1,st2:string;
i,j,code,k,x,tam,l:integer;
a,b:longint;
m:array[1..100] of integer;
f,g:text;
procedure xoatrung(st:string);
begin
l:=length(st);i:=1;j:=1;
while i<l do
begin
j:=i+1;
repeat
if st[i]=st[j] then
begin
delete(st,j,1);
l:=length(st);
end
else inc(j);
until j>length(st);
i:=i+1;
end;
end;
begin
assign(f,'d:\SN.inp');
reset(f);
read(f,a,b);
str(a,st1);
str(b,st2);
assign(g,'d:\sogiao.out');
rewrite(g);
xoatrung(st1);xoatrung(st2);write(st1,#32,st2);
for i:=1 to length(st1) do
if pos(st1[i],st2)<>0 then
begin
val(st1[i],x,code);
k:=k+1;
m[k]:=x;
end;
for i:=1 to k-1 do
for j:=i+1 to k do
if m[i]>m[j] then
begin
tam:=m[i];
m[i]:=m[j];
m[j]:=tam;
end;
for i:=1 to k do write(g,m[i],#32);
close(f);
close(g); readln
end.
Bài 1: Hoán vị
Hai dãy số A và B được gọi là hoán vị của nhau nếu chúng có cùng một tập
phần tử và chỉ khác nhau về vị trí của các phần tử trong dãy.
Dữ liệu vào: Được ghi trên tệp Hoanvi.INP
- Hàng đầu tiên ghi 2 số nguyên dương n, m
- n hàng tiếp theo, mỗi hàng là một dãy số có m phần tử, các phần tử
cách nhau ít nhất một khoảng trắng.
Dữ liệu ra: Được ghi lên tệp Hoanvi.OUT là các cặp chỉ số của các dãy số là
hoán vị của nhau, ghi 0 nếu không có hoán vị nào.
Ví dụ:
Hoanvi.INP Hoanvi.OUT
45 12
12345 14
54321 24
56789
15342

program d;
uses crt;
var A,B : array[1..100,1..100] of integer ;
i,j,m,n : integer;

begin
clrscr;
write('Nhap vao so hang cua ma tran A: ');
readln(m,n);
for i := 1 to m do
for j := 1 to n do
begin
write('Nhap vao cac phan tu A[' ,i, ',' ,j, '] : ');
readln(A[i,j]);
end;
writeln('Ma tran : ');
for i := 1 to m do
begin
for j := 1 to n do
write(A[i,j]:6);
writeln;writeln;
end;
writeln('Ma tran chuyen vi : ');
for i := 1 to m do
for j := 1 to n do
B[j,i] := A[i,j];
for j := 1 to n do
begin
for i := 1 to m do
write(B[j,i]:6);
writeln;
writeln;
end;
readln;
end.
const fi='b1.inp'; fo='b1.out';
var f:text;
dd:array[1..21] of boolean;
x:array[1..21] of byte;
n:byte;
procedure inp;
begin
assign(f,fi);
reset(f);
readln(f,n);
close(f);
fillchar(dd,sizeof(dd),true);
end;
procedure pri1;
var i:byte;
begin
for i:=1 to n do write(f,x[i],' ');
writeln(f);
end;
procedure try(i:byte);
var j:byte;
begin
for j:=1 to n do if dd[j] then
begin
x[i]:=j;
dd[j]:=false;
if (i=n) then pri1 else try(i+1);
dd[j]:=true;
end;
end;
procedure pri;
begin
assign(f,fo);
rewrite(f); try(1);
close(f);
end;
begin
inp; pri; end.

Bài 2: Số đơn điệu


Các số nguyên dương: 3748, 58, 859, 32435465768 được gọi là các số đơn
điệu do nếu quan sát các chữ số của các số này, ta thấy chúng luân phiên tăng giảm
hoặc giảm tăng. Chẳng hạn:
- 3748: 3<7>4<8
- 58: 5<8
- 859: 8>5<9
- 32435465768: 3 > 2 < 4 > 3 < 5 > 4 < 6 > 5 < 7 > 6 < 8
Yêu cầu: Viết chương trình xác định số chữ số đầu tiên lớn nhất tạo thành số đơn
điệu của một số cho trước.
Dữ liệu vào: Cho trong tập tin văn bản DONDIEU.INP, gồm một dòng duy nhất
chứa một số nguyên dương duy nhất có không quá 75 chữ số.
Dữ liệu ra: Cho trong tập tin văn bản DONDIEU.OUT gồm 2 dòng
- Dòng đầu: chứa một số nguyên là số lượng chữ số lớn nhất tạo thành số đơn điệu.
- Dòng tiếp theo: Chứa số đơn điệu được trích ra từ số trên

Ví dụ:

Dondieu.INP Dondieu.OUT
37489121695 6
891216

C©u 1:Tªn file ch¬ng tr×nh lµ BL1.PAS


T¹i v¬ng quèc Ba T xa xa, ngêi ta tæ chøc c¸c cuéc thi t×m d·y sè h¹nh phóc : c¸c
chµng trai c« g¸i th«ng minh trong thêi gian ng¾n nhÊt ph¶i t×m ra ®îc mét d·y sè
h¹nh phóc cã nhiÒu phÇn tö nhÊt.
D·y sè tù nhiªn a1, a2,.., ak ®îc gäi lµ h¹nh phóc nÕu nã tho¶ m·n c¸c ®iÒu
kÖn sau :
D·y trªn lµ d·y gi¶m dÇn .
Víi mäi i (1<i<=k) ai hoÆc lµ sè nguyªn tè, hoÆc ph¶i lµ íc cña mét trong c¸c sè
a1, a2,.., ai-1.
Em h·y viÕt ch¬ng tr×nh gióp c¸c chµng trai c« g¸i Ba T.
- D÷ liÖu vµo: Tõ file BL1.INP gåm 1 dßng chøa sè nguyªn N
- D÷ liÖu ra: Ghi vµo file BL1.OUT lµ d·y sè h¹nh phóc dµi nhÊt víi sè h¹ng
®Çu tiªn lµ N.
VÝ dô :
BL1.INP BL1.OUT
8 8 7 54 3 2 1
C©u 4: Tªn file ch¬ng tr×nh lµ BL4.PAS
Yªu cÇu tÝnh tæng c¸c gi¸ trÞ sè n»m trong chuçi:
Cho mét chuçi kÝ tù bao gåm c¶ c¸c sè. ViÕt ch¬ng tr×nh t¸ch c¸c sè trong chuçi vµ
tÝnh tæng c¸c sè ®ã.
Ch¼ng h¹n: Ta cã chuçi “abc021kih14mnh20th”. Chóng ta sÏ t¸ch ra ®îc c¸c sè 21,
14, 20 vµ tæng cña chóng lµ 55.
- D÷ liÖu vµo: Chuçi ®îc lu trong file BL4.INP
- D÷ liÖu ra: Ghi vµo file BL4.OUT, trong ®ã
+ C¸c dßng ®Çu lµ gi¸ trÞ c¸c sè ®îc t¸ch ra trong chuçi
+ Dßng cuèi cïng lµ gi¸ trÞ tæng c¸c sè
VÝ dô:
BL4.INP BL4.OUT
abc021kjh14mnh20t 21
h 14
20
55
procedure tach;
var l,code:integer;
b:string;
begin
i:=1;
l:=length(st);
n:=0;
repeat
if (st[i] in ['0'..'9']) then
begin
b:='';
repeat
b:=b+st[i];
i:=i+1;
Until (not(st[i] in ['0'..'9'])) or (i>l);
n:=n+1;
val(b,mang[n],code);
end;
i:=i+1;
until i>l;

end;
BÀI 4 : (5 điểm)
Palindrome là xâu ký tự mà nếu đọc nó từ trái sang phải cũng như từ phải sang trái ta
được cùng một xâu. Một xâu ký tự bất kỳ luôn có thể biểu diễn như là một dãy các
palindrome nếu như ta coi xâu chỉ gồm một ký tự luôn là palindrome.
Ví dụ: Xâu ‘bobseesanna’ có thể biểu diễn dưới dạng dãy các palindrome theo nhiều
cách, chẳng hạn
‘bobseesanna’ = ‘bob’ + ‘sees’ + ‘anna’
‘bobseesanna’ = ‘bob’ + ‘s’ + ‘ee’ + ’s’ + ‘anna’
‘bobseesanna’ = ‘b’ +’o’ + ‘b’ + ‘sees’ + ‘a’ + ‘n’ + ‘n’ + ‘a’
Yêu cầu: Cho xâu ký tự s, cần tìm cách biểu diễn xâu s dưới dạng một dãy gồm một
số ít nhất các palindrome.
Ví dụ: Cho s = ‘bobseesanna’, do ta có ‘bobseesanna’ = ‘bob’ + ‘sees’ + ‘anna’ và
không thể biểu diễn ‘bobseesanna’ bởi ít hơn là 3 palindrome nên biểu diễn này chính là
biểu diễn cần tìm.
Dữ liệu: Vào từ file văn bản PALINDR.INP gồm một dòng chứa xâu ký tự s gồm
không quá 255 ký tự.
Kết quả: Đưa ra màn hình đồng thời ghi vào file văn bản PALINDR.OUT:
- Dòng đầu tiên ghi k là số lượng ít nhất các palindrome trong biểu diễn tìm được;
- Dòng thứ i trong số k dòng tiếp theo ghi palindrome pi (i = 1, 2, ..., k) sao cho :
s = p1p2...pk.
Ví dụ
PALINDR.INP PALINDR.OUT PALINDR.INP PALINDR.OUT
bobseesanna 3 aabbaaaabb 2
bob aa
sees bbaaaabb
anna

Câu 1: (3,0 điểm) Phần thưởng PT.PAS


Trong cuộc thi giải toán qua mạng internet mỗi học sinh đều có số điểm tích lũy
riêng của mình. Số điểm tích lũy của mỗi học sinh là một số nguyên dương K (0 < K ≤ 2´109). Đội
tuyển của trường THCS Tài Năng có N học sinh tham gia dự thi (2 ≤ N ≤ 100). Tại buổi gặp mặt
trước kỳ thi cấp tỉnh, thầy hiệu trưởng quyết định thưởng cho các học sinh trong đội tuyển Q triệu
đồng, biết rằng điểm tích lũy của mỗi học sinh đều chia hết cho Q.
Yêu cầu: Hãy tìm số nguyên dương Q lớn nhất.
Dữ liệu vào: Cho trong file văn bản PT.INP có cấu trúc như sau:
- Dòng 1: Ghi số nguyên dương N là số lượng học sinh.
- Dòng 2: Ghi N số nguyên dương lần lượt là điểm tích lũy của N học sinh, các số được ghi cách
nhau ít nhất một dấu cách.
Dữ liệu ra: Ghi ra file văn bản PT.OUT theo cấu trúc như sau:
- Dòng 1: Ghi số nguyên dương Q tìm được.
Ví dụ:
PT.INP PT.OUT
5 3
15 24 45 36 27
Câu 1: (3,0 điểm) Phần thưởng
Program Phan_thuong;
Const fi='PT.INP';
fo='PT.OUT';
Type mmc=Array[0..101] of Longint;
Var N:Longint;
A:mmc;
Function UCLN(x,y:Longint):Longint;
Var sodu:Word;
Begin
sodu:=x mod y;
While sodu<>0 do
Begin
x:=y;
y:=sodu;
sodu:=x mod y;
End;
UCLN:=y;
End;
Procedure Read_Data;
Var f:text;
i:Longint;
Begin
Assign(f,fi);
Reset(f);
Readln(f,N);
For i:=1 to N do
Read(f,A[i]);
Close(f);
End;
Function USC:Longint;
Var f:text;
i,mUSC:longint;
Begin
mUSC:=UCLN(A[1],A[2]);
for i:= 3 to N do
mUSC:=UCLN(mUSC,A[i]);
USC:=mUSC;
End;
Procedure Write_Data;
Var f:Text;
Begin
Assign(f,fo);
Rewrite(f);
Write(f,USC);
Close(f);
End;
BEGIN
Read_Data;
Write_Data;
End.
Bài 3: (6 điểm)
Từ 5 chữ số 1, 2, 3, 4, 5 ta lập ra tất cả các con số có đúng 5 chữ số. Các con số này
được xếp theo thứ tự từ nhỏ đến lớn, con số nhỏ nhất là 11111 được đánh mã số 1; số
kế tiếp là 11112 được đánh mã số 2; số kế tiếp 11113 được đánh mã số 3; tiếp tục cho
đến hết các con số.
Yêu cầu:
Cho trước một số n có đúng 5 chữ số lấy từ các chữ số 1, 2, 3, 4, 5.
a) Tìm số chữ số khác nhau của con số n.
b) Tìm mã số của con số n.

Dữ liệu: Vào từ file văn bản DL.INP


- Gồm 1 dòng chứa số n
Kết quả: Lưu vào file text KQ.OUT
- Dòng đầu tiên chứa số chữ số khác nhau của số n.
- Dòng thứ hai chứa mã số của con số n

DL.INP KQ.OUT
11121 2
6
Câu 3: (6.0 điểm) Khi đào hầm Thủ Thiêm người ta dùng một Robot để đào, ban đầu người
ta đào đường hầm 1 đơn vị độ dài sau đó đặt Robot xuống. Robot này được điều khiển bởi 2
lệnh là: C1 và N2.
- Lệnh C1 là đào thêm 1 đơn vị độ dài thì tốn 2 đơn vị năng lượng.
- Lệnh N2 là đào thêm một đoạn đường hầm bằng độ dài đang có thì tốn 4 đơn vị
năng lượng.
Hãy viết chương trình ra lệnh cho Robot đào một đường hầm có độ dài k đơn vị độ
dài với các lệnh là ít nhất và sự tiêu tốn năng lượng là thấp nhất. Biết ban đầu đường hầm
dài 1 đơn vị độ dài.
Yêu cầu:
- Dữ liệu vào trong tập tin Robot.inp gồm một số k là độ dài đường hầm cần đào.
- Dữ liệu ra trong tập tin Robot.out gồm hai dòng:
+ Dòng đầu là số năng lượng ít nhất đã tiêu tốn cho Robot đào hầm.
+ Dòng tiếp theo chứa các lệnh C1 hoặc N2, mỗi lệnh cách nhau 1 khoảng trắng.
Ví dụ:

Robot.inp Robot.out
10 12
C1 N2 C1
N2

Câu 3: (3,5 điểm) Tần suất TS.PAS


Cho tập hợp S có N phần tử nguyên dương {s1, s2,…, sN}.
(1 ≤ N ≤ 32000; 0 < si ≤ 32000; 1 ≤ i ≤ N)
Yêu cầu: Hãy liệt kê các phần tử trong S có số lần xuất hiện lớn hơn một lần.
Dữ liệu vào: Cho trong file văn bản TS.INP có cấu trúc như sau:
- Dòng 1: Ghi số nguyên dương N.
- Dòng 2: Ghi N số nguyên dương là giá trị các phần tử của tập hợp S, các số được
ghi cách nhau ít nhất một dấu cách.
Dữ liệu ra: Ghi ra file văn bản TS.OUT trên nhiều dòng, dòng thứ i ghi 2 số si di, hai số
cách nhau một dấu cách. Trong đó s i là phần tử xuất hiện trong S lớn hơn một lần và d i
tương ứng là số lần si xuất hiện.
Ví dụ:
TS.INP TS.OUT
7 3 2
2 5 5 3 5 3 9 5 3

Bài 3: (7 điểm) CHỌN PHẦN THƯỞNG


Trong kỳ thi học sinh giỏi môn Tin học, em là người đạt giải đặc biệt. Ban tổ chức cho
phép em chọn các phần thưởng cho mình. Các phần thưởng xếp thành một dãy được đánh
số từ 1 đến N (0 ≤ N ≤ 10000), phần thưởng thứ i có giá trị là a i (1 ≤ ai ≤ 100). Em được
phép chọn các phần thưởng cho mình theo nguyên tắc không chọn 3 phần thưởng liên tiếp
nhau trong dãy.
Viết chương trình để máy tính hướng dẫn em chọn các phần thưởng sao cho tổng giá
trị của các phần thưởng nhận được là lớn nhất.
Dữ liệu vào: cho file PTHUONG.INP gồm các dòng:
- Dòng đầu tiên là số phần thưởng N
- N dòng tiếp theo lần lượt là giá trị của các phần thưởng.
Dữ liệu ra: ghi ra file PTHUONG.OUT gồm các dòng:
- Dòng đầu tiên ghi tổng giá trị lớn nhất của các phần thưởng đã chọn
- Dòng tiếp theo ghi vị trí của các phần thưởng đã chọn theo thứ tự tăng dần.
Ví dụ:

PTHUONG.INP PTHUONG.OUT
5 23
6 1245
9
1
3
5
Hoặc

PTHUONG.INP PTHUONG.OUT
7 32
6 12467
9
1
3
5
10
4
Câu 1: ĐỘI ĐẶC NHIỆM (3 điểm)
Có không quá 1000 chiến sỹ công an tham gia chiến dịch truy quét tội phạm ở
tỉnh X. Các chiến sỹ công an được chia thành không quá 26 đội. Để dễ điều hành, bộ
chỉ huy chiến dịch kí hiệu cho mỗi đội là một chữ cái in thường nằm trong khoảng từ
‘a’ đến’z’. Hai đội khác nhau thì có kí hiệu khác nhau. Các chiến sỹ công an thuộc
đội nào thì được gắn một kí hiệu là kí hiệu của đội đó. Nếu lấy kí hiệu đã gắn cho tất
cả các chiến sĩ công an tham gia chiến dịch ghép lại với nhau thì được một xâu kí tự.
Yêu cầu: Hãy xác định số lượng các chiến sỹ công an trong mỗi đội.
Dữ liệu vào lấy từ văn bản file hsg1.inp gồm có 1 xâu S là ký hiệu của các
chiến sỹ công an tham gia chiến dịch.
Kết quả ghi vào file hsg1.out gồm có các đội và số thành viên của mỗi đội.
Ví dụ:
HSG1.INP HSG1.OUT
abcad a2
b1
c1
d1
Bài 2: (7 điểm)
Cho đa thức bậc n: A = anxn + an-1xn-1 +…+ a1x + a0
Trong đó an, an-1,…a1,a0 là các hệ số nguyên có giá trị tuyệt đối không quá 100.
Biết rằng phương trình A = 0 nếu có nghiệm nguyên thì nghiệm nguyên đó chỉ có thể là ước
số của hệ số a0.
Yêu cầu: Hãy tìm tất cả các nghiệm nguyên (nếu có) của phương trình A = 0.
Dữ liệu vào từ file ‘INTROOT.INP’:
 Dòng đầu là số nguyên n (2≤n≤100)
 Dòng thứ 2 ghi n+1 số nguyên tương ứng là các hệ số a n, an-1,…a1,a0 của đa thức (các số
cách nhau ít nhất một khoảng trắng).
Kết quả ghi vào file ‘INTROOT.OUT’ mỗi dòng ghi 1 nghiệm tìm được (nếu không có kết
quả thì ghi ‘khong co’).
Ví dụ:
INTROOT.INP INTROOT.OUT
4 -1
1 -1 0 -2 -4 2
(Giải thích: trong ví dụ trên thì phương trình x4-x3-2x-4=0 có 2 nghiệm nguyên là -1 và 2)
Hướng dẫn thêm: để tính biều thức A một cách hiệu quả nhất, người ta phân tích A thành
dạng như sau:
A = (…((anx + an-1)x + an-2)x + …)x +a1)x + a0
Program bai2;
Var i,n:shortint;f:text; a:array[0..100]of shortint;
Procedure Ini;
Begin
assign(f,'introot.inp');
reset(f);
readln(f,n);
For i:=n downto 0 do read(f,a[i]);
close(f);
assign(f,'introot.out');
rewrite(f);
end;
Function polynormial(x:integer):real;
Var i:shortint;y:real;
Begin
y:=a[n];
For i:=n-1 downto 0 do y:=y*x+a[i];
polynormial:=y;
End;
Procedure introot;
Begin
For i:=abs(a[0]) downto -abs(a[0]) do
if (i<>0) and(a[0] mod i = 0) then
if polynormial(i)=0 then writeln(f,i);
close(f);
end;
Begin
ini;
introot;
End.

You might also like