Professional Documents
Culture Documents
procedure xuli;
begin
for i:=1 to n do if c[i]<>-1 then begin
inc(y); f2[y]:=c[i]; s2:=s2+c[i]; end;
if (min>s1-s2) and (s1-s2>0) then begin
min:=s1-s2;
d1:=x;
d2:=y;
for i:=1 to d1 do k1[i]:=f1[i];
for i:=1 to d2 do k2[i]:=f2[i];
end;
for i:=1 to n do c[i]:=t[i];
for i:=1 to x+y do begin f1[i]:=0; f2[i]:=0;
end;
end;
procedure try(i:longint);
var j:integer;
begin
for j:=a[i-1]+1 to n-k+i do begin
a[i]:=j;
if i=k then begin incauhinh; xuli; end
else try(i+1);
end;
end;
begin clrscr;
write('Nhap n '); readln(n);
for i:=1 to n do begin
write(i,'. '); readln(c[i]); end;
for i:=1 to n do begin t[i]:=c[i]; min:=min+c[i]; end;
for k:=1 to n do begin try(1); i:=0; d:=0; end;
writeln(min);
for i:=1 to d1 do write(k1[i],' ');
writeln;
for i:=1 to d2 do write(k2[i],' ');
readln end.
Bài 26. Kí hiệu S(n) là tổng các chữ số của n trong hệ số thập phân. Hãy viết
chương trình
A) Tính tổng s(n) của số nguyên dương n
b) In ra số nguyên y nhỏ nhất thoả mãn s(y)=s(n)
c) In ra số nguyên z nhỏ nhất thoả mãn s(z+n)=s(z)+s(n);
program sn;
uses crt;
var y,z,n,i,j,b,c,d:longint; s:string[255];
t,t1,t2,tong:longint; r:integer;
begin clrscr;
write('Nhap n '); readln(n);
str(n,s);
for i:=1 to length(s) do begin val(s[i],b,r);
tong:=tong+b; end;
writeln('TONG SN LA: ',tong);
for i:=1 to n do begin
str(i,s);
for j:=1 to length(s) do begin val(s[j],b,r); t:=t+b;
end;
if t=tong then begin writeln('SO Y LA: ',i); break;
end;
t:=0; end; t:=0;
for i:=1 to n do begin
d:=i+n; str(d,s);
for j:=1 to length(s) do begin val(s[j],b,r);
t1:=t1+b; end;
str(i,s);
for j:=1 to length(s) do begin val(s[j],b,r);
t2:=t2+b; end;
if t1=t2+tong then begin writeln('SO Z LA: ',i);
break; end;
t1:=0; t2:=0; end;
readln end.
Bài 27. Viết chương trình cộng, trừ, nhân, chia hai phân số. Rút gọn kết quả
sau khi tính.
program phanso;
uses crt;
var
i,n,j,b,c,d,ts1,ts2,ms1,ms2,ms,ts,ucln,bcnn:longint;
chung:byte;
procedure cong;
begin
ts:=ts1+ts2;
ms:=ms1;
for i:=ms downto 1 do if (ms mod i=0) and (ts mod i=0)
then begin ucln:=i; break; end;
ms:=ms div ucln;
ts:=ts div ucln;
writeln(ts,'/',ms);
end;
procedure tru;
begin
ts:=ts1-ts2;
ms:=ms1;
for i:=ms downto 1 do if (ms mod i=0) and (ts mod i=0)
then begin ucln:=i; break; end;
ms:=ms div ucln;
ts:=ts div ucln;
writeln(ts,'/',ms);
end;
procedure nhan;
begin
ts:=ts1*ts2; ms:=ms1*ms2;
for i:=ms downto 1 do if (ms mod i=0) and (ts mod i=0)
then begin ucln:=i; break; end;
ts:=ts div ucln; ms:=ms div ucln;
writeln(ts,'/',ms);
end;
procedure chia;
begin
ts:=ts1*ms2; ms:=ms2*ts2;
for i:=ms downto 1 do if (ms mod i=0) and (ts mod i=0)
then begin ucln:=i; break; end;
ts:=ts div ucln; ms:=ms div ucln;
write(ts,'/',ms);
end;
begin clrscr;
write('Nhap phan so 1 '); readln(ts1,ms1);
write('Nhap phan so 2 '); readln(ts2,ms2);
for i:=1 to ms1*ms2 do if (i mod ms1=0) and (i mod
ms2=0) then begin bcnn:=i; break; end;
chung:=bcnn div ms1;
ts1:=ts1*chung; ms1:=ms1*chung;
chung:=bcnn div ms2;
ts2:=ts2*chung; ms2:=ms2*chung;
write(ts1,' ',ms1); writeln;
write(ts2,' ',ms2); writeln; cong; tru; nhan;
chia;
readln end.
Bài 28. Bờm là một chủ cửa hiệu giày. Một ngày, khi vào kho, bờm thấy còn
2*n chiếc giày chưa bán, chiếc giày bên chân trái có kích thước lần lượt là
a1,a2,a3…an. Chiếc giáy bên chân phải có kích thước lần lượt là b1,b2,b3…
bn. Hai chiếc giày có thể hợp cùng một đôi nếu chúng có cùng kích thước.
Bờm quyết định mang một số giày đến nhà sản xuất để đổi.
Hãy xác định số giày ít nhất mà Bờm cần đổi để bán được n chiếc giày.
Ví dụ:
Bom.inp Bom.Out
3 1
131
123
Giải thích: Đổi 1 chiếc giày chân trái kích thuóc 1 thành 1 chiếc giày chân
phải kích thước 2. Hoặc đổi 1 chiếc giày chân phải kích thước 2 thành 1 chiếc
giày chân trái kích thước 1.
program h;
uses crt;
var x,i,n,j,d:longint; a,b:array[1..100] of longint;
f:text;
begin clrscr;
assign(f,'bom.inp'); reset(f);
readln(f,n);
while not eof(f) do
begin
while not eoln(f) do begin inc(x);
read(f,a[x]); end;
x:=0; readln(f);
while not eoln(f) do begin inc(x);
read(f,b[x]); end;
end;
close(f);
assign(f,'bom.out'); rewrite(f);
for i:=1 to n do
begin
for j:=1 to n do if a[i]=b[j] then begin
b[j]:=-1; break; end;
end;
for i:=1 to n do if b[i]<>-1 then inc(d);
write(f,d);
close(f);
readln end.
Bài 29. Một vòng tròn chứa 2n vòng tròn nhỏ. Các vòng tròn nhỏ được đánh số
từ 1 đến n theo chiều kim đồng hồ. Cần điền một số tự nhiên từ 1 đến 2n vào
mỗi vòng tròn nhỏ (mỗi số chỉ được phép điền một lần) sao cho tổng của hai số
trên hai vòng tròn nhỏ liên tiếp là số nguyên tố. Số điền ở vòng tròn nhỏ 1 luôn
là số 1.
Ví dụ:
Circuit.inp Circuit.Out
4 12385674
12583476
14765832
16743852
Program Circuit;
Uses crt;
Var i,n,j,s,i1,x,kt,d:longint; a,f,c:array[0..1000]
of longint;
t:array[1..1000] of boolean;
Procedure incauhinh;
begin
x:=0; kt:=0;
For i:=1 to n do begin d:=a[i]; inc(x); f[x]:=c[d];
end;
d:=0;
For i:=1 to x do begin
s:=f[i]+f[i+1];
For i1:=1 to s do if s mod i1=0 then inc(d);
If d=2 then inc(kt);
d:=0; end; d:=0;
for i:=1 to f[x] do if f[x] mod i=0 then inc(d);
if (kt=x-1) and (d<>2) and (f[1]=1) then begin for
i:=1 to n do begin d:=a[i]; Write(c[d]); end; writeln;
end;
end;
{----------------------------------------------------}
procedure try(i:longint);
var j:integer;
begin
for j:=1 to n do if t[j] then begin
a[i]:=j;
if i=n then incauhinh else begin t[j]:=false;
try(i+1); t[j]:=true; end;
end; end;
{----------------------------------------------------}
begin clrscr;
write('Nhap n '); readln(n); n:=n*2;
for i:=1 to n do c[i]:=i;
fillchar(t,sizeof(t),true);
try(1);
readln end.
Bài 30. Viết chương trình chuyển đổi giữa 2 hệ cơ số vào và ra (từ 1 → 16).
Nhập vào màn hình số n ở hệ cơ số vào, xuất ra kết quả n ở hệ cơ số ra.
Chuyển số n từ hệ cơ số vào sang hệ cơ số 10 bằng công thức:
Hệ cơ số 10=Cơ số vào^ vị trí-1*vị trí trong hằng mảng
Vd: 1001=2^3*1+2^2*0+2^1*0+2^0*1=9 9 (hệ cơ số 2)
Chuyển số đó sang hệ cơ số ra.
Nhập từ màn hình In kết quả ra màn hình
Hệ cơ số vào: 16 Số ở hệ thập phân là: 378
Nhập số: 17A Số ở hệ cơ số 3 là: 112000
Hệ cơ số ra: 3
program Coso;
uses crt;
const a:array[0..15] of
char=('0','1','2','3','4','5','6','7','8','9','A','B','C
','D','E','F');
var i,cs1,kt,gt,cs2,n,kq,j,x,k:byte; s,s2:string[255];
{------------------NHAP CO VAO RA----------------------}
procedure nhap;
begin
repeat
if kt>=1 then writeln('XIN NHAP LAI: ');
kt:=0;
write('Nhap co so vao: '); readln(cs1);
write('Nhap so do: '); readln(s);
x:=length(s);
write('Nhap co so ra '); readln(cs2);
if (cs1<1) or (cs2<1) or (cs1>16) or (cs2>16)
then inc(kt);
until kt=0;
end;
{--------------CHUYEN SANG THAP PHAN-------------------}
procedure chuyenTP(s:string);
begin
for i:=1 to length(s) do
begin
dec(x); gt:=1;
for j:=1 to x do gt:=gt*cs1;
for j:=0 to 15 do if s[i]=a[j] then begin
k:=j; break; end;
kq:=kq+(k*gt);
end;
writeln('SO O HE CO SO 10: ',kq);
end;
{---------------------CHUYEN DOI-----------------------}
procedure chuyendoi(kq:longint);
begin
k:=0;
while kq>=1 do begin
k:=kq mod cs2;
s2:=s2+a[k];
kq:=kq div cs2; end;
write('SO DA CHUYEN DOI LA: ');
for i:=length(s2) downto 1 do write(s2[i]);
end;
{------------------------------------------------------}
begin clrscr;
nhap;
chuyenTP(s); chuyendoi(kq);
readln end.
Program Tho;
Uses crt;
Var i,n,j,i1,i11,j1,k,max,dong,cot,kt,m:longint;
a,b:array[1..10,1..10] of longint;
f:text; dodai:byte; dong1,cot1,x1,y2,x2,y1:byte;
{TIM HCN CO DIEN TICH LON NHAT}
procedure tim;
begin
for i:=1 to dong do
for j:=1 to cot do begin
for i11:=i to dong do begin
for i1:=i to i11 do
for j1:=j to cot do if a[i1,j1]=1 then inc(kt);
if (kt=i11*(cot-j)) and (max<(i11*(cot-j))) then begin
y2:=cot; y1:=j;
x1:=i; x2:=i11; max:=i11*(cot-j); end;
kt:=0; end;
end;
end;
{----------------------------------------------------}
procedure dichuyen;
begin
writeln('DI CHUYEN: '); kt:=0;
if dong1>x1 then while dong1>x1 do begin dec(dong1);
inc(kt); writeln(dong1,' ',cot1); end;
if dong1>x2 then while dong1>x2 do begin dec(dong1);
inc(kt); writeln(dong1,' ',cot1); end;
if (dong1=x1) or (dong1=x2) then begin
while cot1<=y1 do begin inc(cot1); writeln(dong1,'
',cot1); end;
while cot1>=y2 do begin inc(cot1); writeln(dong1,'
',cot1); end;
end;
end;
{----------------------------------------------------}
begin clrscr;
assign(f,'tho.inp'); reset(f);
read(f,dong1); read(f,cot1); readln(f);
while not eof(f) do begin
inc(dong);
while not eoln(f) do begin inc(cot);
read(f,a[dong,cot]); end;
m:=cot; cot:=0; readln(f); end;
close(f); cot:=m;
tim; writeln(max);
dichuyen;
readln end.
x:=0;
for i:=1 to k do begin d:=a[1]; inc(X);
f[x]:=c[d]; end;
fillchar(t,sizeof(t),true); i1:=0; d:=0;
try1(1);
end;
procedure try(i:longint);
var j:integer;
begin
for j:=a[i-1]+1 to n-k+i do begin
a[i]:=j;
if i=k then incauhinh else try(i+1); end;
end;
begin clrscr;
for i:=1to 3 do c[i]:=1;
for i:=4 to 6 do c[i]:=2;
for i:=7 to 9 do c[i]:=3; for i:=10 to 12 do
c[i]:=4;
for i:=13 to 15 do c[i]:=5; for i:=16 to 18 do
c[i]:=6;
for i:=19 to 21 do c[i]:=7; for i:=22 to 24 do
c[i]:=8;
for i:=25 to 27 do c[i]:=9; n:=27; k:=6;
try(1);
readln end.
Bài 35. Nhập vào một mảng hai chiều gồm các số 0 và 1. Trong đó, số 1 biểu thị
một đoạn thẳng. Hãy viết chương trình đếm số số hình chữ được tạo thành
trong mảng đó (các hình chữ nhật không được chồng lên nhau)
Ví dụ:
OVUONG.INP OVUONG.OUT
010110 3
010110
000000
111111
111111
program ovuong;
uses crt;
var
cot,dong,i1,i,n,j1,j,cotd,cotc,dongd,d,dongc:longint;
a:array[0..100,0..100] of longint; kt:longint; f:text;
procedure xacdinh;
begin
for i:=1 to dong do
for j:=1 to cot do begin
if a[i,j]=1 then begin
dongd:=i; cotd:=j;
for i1:=i to dong do if (a[i1,cotd]=1) and
(a[i1+1,cotd]=0) then begin dongc:=i1; break; end;
for i1:=j to cot do if (a[dongd,i1]=1) and
(a[dongd,i1+1]=0) then begin cotc:=i1; break; end;
for i1:=dongd to dongc do
for j1:=cotd to cotc do if a[i1,j1]=0 then inc(kt);
if (kt=0) and (a[dongd,cotd-1]=0) then inc(d);
end;
kt:=0; end;
end;
procedure docfile;
begin
assign(f,'ovuong.inp'); reset(f);
while not eof(f) do begin
inc(dong);
while not eoln(f) do begin inc(cot);
read(f,a[dong,cot]); end;
n:=cot; cot:=0; readln(f); end;
cot:=n; close(f);
end;
begin clrscr;
docfile;
xacdinh;
write(d);
readln end.
Bài 36. Nhập vào 2 mốc thời gian bất kì, (ngày đầu – tháng đầu – năm đầu) và
(ngày cuối- tháng cuôi – năm cuối). Tính số ngày hai mốc thời gian đó
Tính số ngày từ ngày đầu – tháng đầu đến tháng 12 năm đầu
Tính số ngày từ ngày 1 – tháng 1 đến ngày cuối, tháng cuối của năm cuối
Tính tổng số ngày của các năm nằm giữa hai năm đầu và năm cuối
Cộng tất cả kết quả với nhau, ta được số ngày
program tinhngay;
uses crt;
var
i,n,j,ngaydau,thangdau,namdau,ngaycuoi,thangcuoi,namcu
oi,s1,s2,kt,s:longint;
begin clrscr;
write('NHAP MOCS THOI GIAN DAU ');
readln(ngaydau,thangdau,namdau);
write('NHAP MOC THOI GIAN CUOI ');
readln(ngaycuoi,thangcuoi,namcuoi);
for i:=thangdau+1 to 12 do begin
if (i=1) or (i=3) or (i=5) or (i=7) or (i=8) or (i=10)
or (i=12) then s1:=s1+31;
if (i=4) or (i=6) or (i=9) or (i=11) then s1:=s1+30;
if i=2 then if (namdau mod 4=0) or (namdau mod 400=0)
then s1:=s1+29 else s1:=s1+28;
end;
case thangdau of
1: s1:=s1+31-ngaydau;
2: if (namdau mod 400=0) or (namdau mod 4=0) then
s1:=s1+29-ngaydau else s1:=s1+28-ngaydau;
3: s1:=s1+31-ngaydau;
4: s1:=s1+30-ngaydau;
5: s1:=s1+31-ngaydau;
6: s1:=s1+30-ngaydau;
7: s1:=s1+31-ngaydau;
8: s1:=s1+31-ngaydau;
9: s1:=s1+30-ngaydau;
10: s1:=s1+31-ngaydau;
11: s1:=s1+30-ngaydau;
12: s1:=s1+31-ngaydau; end;
for i:=1 to thangcuoi-1 do begin
if (i=1) or (i=3) or (i=5) or (i=7) or (i=10) or (i=8)
or (i=12) then s2:=s2+31;
if (i=4) or (i=6) or (i=9) or (i=11) then s2:=s2+30;
if i=2 then if (namcuoi mod 4=0) or (namcuoi mod
400=0) then s2:=s2+29 else s2:=s2+28;
end;
s2:=s2+ngaycuoi;
for i:=namdau+1 to namcuoi-1 do if (i mod 400=0) or (i
mod 4=0) then s:=s+366 else s:=s+365;
s:=s+s1+s2; write(s);
readln end.
Bài 37. Mỗi chuỗi kí tự được gọi là đối xứng nếu nó có không ít hơn 1 kí tự
và nếu ta đọc từ phải sang trái hay từ trái sang phải đều giống nhau. Ví dụ:
'Z' , 'TOT' , 'NAN' là các chuỗi đối xứng còn
'NAM' không phải.
Yêu cầu:
Viết chương trình nhận vào chuỗi kí tự cho trước S và hãy cho biết có bao
nhiêu chuỗi con khác nhau của S là chuỗi đối xứng. Chuỗi con của S là chuỗi
gồm một số kí tự nằm liên tiếp nhau trong S.
Dữ liệu vào: Dữ liệu vào cho trong tập tin văn bản CHUOI.INP gồm nhiều
dòng,
mỗi dòng là một chuỗi kí tự cần xem xét (các chuỗi có độ dài không quá
80 kí tự).
Dữ liệu ra: Kết quả ghi trong tập tin văn bản CHUOI.OUT có số dòng bằng
với số dòng của CHUOI.INP. Mỗi dòng chứa một số nguyên là con số cho biết
số chuỗi con đối xứng của chuỗi ở dòng tương ứng trong CHUOI.INP.
program doixung;
uses crt;
var kt,i,n,i1,j,b,cuoi,d:longint; s:array[1..100] of
string; f:text;
s2,s3,s1:string[255];
begin clrscr;
assign(f,'doixung.inp'); reset(f);
while not eof(f) do begin
inc(n); read(f,s[n]); readln(f); end; close(f);
assign(f,'doixung.out'); rewrite(f);
for i:=1 to n do begin
s1:=s[i];
for i1:=1 to length(s1) do begin
for j:=i1-1 downto 1 do if s1[j]=s1[i1] then inc(kt);
if kt=0 then inc(d); kt:=0; end;
for i1:=1 to length(s1) do begin
cuoi:=length(s1);
while cuoi>i1 do begin
for j:=i1 to cuoi do s2:=s2+s1[j];
for j:=length(s2) downto 1 do s3:=s3+s2[j];
for j:=1 to length(s2) do if s2[j]=s3[j] then inc(kt);
if kt=length(s2) then inc(d);
kt:=0; dec(cuoi); s2:=''; s3:=''; end;
end;
writeln(f,d); d:=0; end;
close(f);
readln end.
Bài 38. Viết chương trình nhập vào một số la mã. Kiểm tra xem số la ma đó có
hợp lệ hay không
Cộng hai kí tự i và i+1 của chuỗi s, kiểm tra xem đó có phải là nhóm chữ số không,
nếu là nhóm chữ số → lưu vào mảng a sau đó cho hai kí tự đó thành kí tự trắng.
Nếu không kiểm tra và dịch kí tự s[i] sang số thập phân sau đó lưu vào mảng
Nếu mảng đã tạo trên là mảng tăng dần thì đó là số la mã ngược lại không
program lama;
uses crt;
var i,n,j,x,kt,tong,k1,k2,y,d,max:longint;
a,vt,b:array[1..1000] of longint; s,s2:string[255];
s1:string;
begin clrscr;
write('Nhap so ' ); readln(s);
{-----KIEM TRA QUI TAC LAP LAI CAC CHU SO------------}
for i:=1 to length(s) do begin
if (s[i]='I') and (s[i+1]='I') and (s[i+2]='I') and
(s[i+3]='I') then inc(kt);
if (s[i]='X') and (s[i+1]='X') and (s[i+2]='X') and
(s[i+3]='X') then inc(kt);
if (s[i]='C') and (s[i+1]='C') and (s[i+2]='C') and
(s[i+3]='C') then inc(kt);
if (s[i]='M') and (s[i+1]='M') and (s[i+2]='M') and
(s[i+3]='M') then inc(kt);
if (s[i]='V') and (s[i+1]='V') then inc(kt);
if (s[i]='L') and (s[i+1]='L') then inc(kt);
if (s[i]='D') and (s[i+1]='D') then inc(kt); end;
{--DICH CAC SO VA CHU SO LA MA SANG DAY THAP PHAN----}
for i:=1 to length(s) do begin
s1:=s[i]+s[i+1];
case s1 of
'IV':tong:=4;
'IX': tong:=9;
'XL': tong:=40;
'XC': tong:=90;
'CD': tong:=400;
'CM': tong:=900; end;
if tong<>0 then begin inc(X); b[x]:=tong; s[i]:=' ';
s[i+1]:=' '; end;
{------------KIEM TRA CAC NHOM CHU SO---------------}
if tong=0 then begin s1:=s[i];
case s1 of
'I': tong:=1;
'V': tong:=5;
'X': tong:=10;
'L': tong:=50;
'C': tong:=100;
'D': tong:=500;
'M': tong:=1000; end;
inc(x); b[x]:=tong; end;
tong:=0;
{------------KIEM TRA CAC CHU SO---------------------}
end; s1:=''; y:=0;
for i:=1 to x do if b[i]<>0 then begin inc(y);
a[y]:=b[i]; end;
for i:=1 to y do if a[i]>=a[i+1] then inc(d);
if (d=y) and (kt=0) then write('DUNG') else
write('SAI');
readln end.
Bài 39. Viết chương trình nhập vào một số tự nhiên, chuyển số đó thành số la
mã (n≤3000)
Tách hàng nghìn, hàng trăm, chục, đơn vị của số đó, chuyển lần lượt nghìn, trăm,
chục, đơn vị sang số la mã
Ví dụ: 1256 hàng nghìn 1, số la mã tương ứng 1000 là M
Hàng trăm là, số la mã ứng với 200 là CC
Hàng chục là 5, số la mã ứng với 50 và L
Hàng đơn vị là 6, số la mã ứng với 6 là VI
Nối M-CC-L-VI ta được số la mã tương ứng
program chuyendoilama;
uses crt;
var i,n,j,nghin,chuc,t,tram,dv,d:longint;
s:string[255]; s1,s2,s3,s4,s5:string[255];
procedure tachso;
begin
nghin:=n div 1000;
t:=n div 100; tram:=t mod 10;
dv:=n mod 10;
t:=n div 10; chuc:=t mod 10;
end;
procedure chuyendoi; begin
case nghin of
1: s1:='M'; 2: s1:='M'; 3: s1:='MMM'; end;
case tram of
1: s2:='C'; 2: s2:='CC'; 3: s2:='CCC'; 4:
s2:='CD'; 5: s2:='D';
6: s2:='DC'; 7: s2:='DCC'; 8: s2:='DCCC'; 9:
s2:='CM'; end;
case chuc of
1: s3:='X'; 2: s3:='XX'; 3: s3:='XXX'; 4:
s3:='XL'; 5: s3:='L';
6: s3:='LX'; 7: s3:='LXX'; 8: s3:='LXXX'; 9:
s3:='XC'; end;
case dv of
1: s4:='I'; 2: s4:='II'; 3: s4:='III'; 4:
s4:='IV'; 5: s4:='V';
6: s4:='VI'; 7: s4:='VII'; 8: s4:='VIII'; 9:
s4:='IX'; end;
s:=s1+s2+s3+s4; end;
begin clrscr;
write('Nhap n '); readln(n);
tachso; chuyendoi;
write(s);
readln end.
Bài 40. Viết chương trình nhập vào một số la mã, chuyển số đó sang số tự nhiên
program lama;
uses crt;
var i,n,j,b,c,d:longint; s,s1:string[255];
r,tong:integer; a:array[1..1000] of longint;
begin clrscr;
write('Nhap so '); readln(s);
for i:=1 to length(s) do begin
s1:=s1+s[i]+s[i+1];
case s1 of
'IX': tong:=9;
'IV': tong:=4;
'XL': tong:=40;
'CD': tong:=400;
'CM': tong:=900;
'XC': tong:=90; end;
if tong<>0 then begin inc(n); a[n]:=tong; s[i]:=' ';
s[i+1]:=' '; end;
if tong=0 then begin s1:=s[i];
case s1 of
'I': tong:=1;
'V': tong:=5;
'X': tong:=10;
'L': tong:=50;
'C': tong:=100;
'D': tong:=500;
'M': tong:=1000; end;
inc(n); a[n]:=tong; end;
tong:=0; s1:=''; end; tong:=0;
for i:=1 to n do tong:=tong+a[i]; write(tong);
readln end.
Bài 41. Trên một khu đất hình chữ nhật được chia thành từng thửa ruộng đều
nhau có cạnh là 1 để cho các tá điền thuê cày ruộng. Tại một số thửa ruộng, bạn
Bờm cho đào giếng để lấy nước tưới. Vì ănm nay trời hạn nên chỉ đủ nước tưới
cho các thửa ruộng xung quanh phạm v bán kính 2 ô vuông đơn vị. Các tá điền
không thể đưa nước đi xa vì họ không đủ sức cũng không có dụng cụ hỗ trợ. Em
hãy tính xem có bao nhiêu thửa ruộng không đủ nước tưới.
Dữ liệu vào: từ file văn bản FARM.inp gồm
+ Dòng 1: chứa 2 số nguyen m, n (m,n≤106) là chiều dài, rộng của khu đất
+ Dòng 2: chứa số nguyên k là số giếng bạn Bờm đã đào
+ Trong k dòng tiếp theo, mỗi dòng chứa 2 số nguyên là vị trí (dòng – cột) của
từng giếng
Dữ liệu ra: file văn bản FARM.out gồm 1 số nguyên duy nhất là số thủa ruộng
không đủ nước tưới
Ví dụ:
FARM.INP FARM.OUT
69 6
3
26
32
57
Cách làm:
Ví dụ: giếng 5 – 7
For dong≔5-2 to 5+2 do
For cot≔7-2 to 7+2 do a[dong,cot]≔1;
Program Farm;
uses crt;
var
i,n,j,cot,dong,d,i1,j1,cotd,dongd,cotc,dongc:longint;
a:array[-5..30,-5..30] of longint;
b,c:array[1..1000] of longint; f:text;
begin clrscr;
assign(f,'farm.inp'); reset(f);
read(f,dong,cot); readln(f); read(f,n); readln(f);
while not eof(f) do begin inc(i); read(f,b[i],c[i]);
readln(f); end; close(F);
assign(f,'farm.out'); rewrite(f);
for i:=1 to n do begin
dongd:=b[i]-2; dongc:=b[i]+2;
cotd:=c[i]-2; cotc:=c[i]+2;
for i1:=dongd to dongc do
for j1:=cotd to cotc do a[i1,j1]:=1;
end;
for i:=1 to dong do
for j:=1 to cot do if a[i,j]=0 then inc(d);
write(f,d); close(f);
readln end.
Bài 42. Kẹt xe do phương tiện cá nhân quá nhiều và ý thức tham gia chưa tốt là
một vấn nạn của các thành phố lớn tại Việt Nam. Để khuyến khích mọi người sử
dụng các phương tiện giao thông công cộng trong thành phố, ngoài việc bán rời
từng vé với giá p1, ta có cách bán cả tập k vé với giá p2 cho mỗi tập. Bờm dự
định đến thành phố tham quan và sẽ di chuyển n chuyến trên các phương tiện
giao thông công cộng. Vấn đề đặt ra là nên mua vé như thế nào để tiết kiệm tiền
nhất. Dĩ nhiên, Bờm sẽ không đi lậu vé
Yêu cầu: cho 4 số nguyên dương n, k, p1, p2. Nếu k=1 thì p1=p2. Hãy tính chi phí
tối thiểu cần thiết để mua vé
Dữ liệu vào: Vào từ tập tin BTICK.INP chứa 4 số nguyên n, k, p1, p2. Mỗi số cách
nhau một kí tự trắng
Dữ liệu ra: Ghi vào tập tin BTICK.OUT một số nguyên duy nhất là chi phí tối thiểu
mà Bờm phải bỏ ra
program btick;
uses crt;
var i,n,j,b,c,d,p1,p2,k:longint; f:text;
begin clrscr;
assign(f,'btick.inp'); reset(f); read(f,n,k,p1,p2);
close(f);
assign(f,'btick.out'); rewrite(f);
while n>=k do begin n:=n-k; d:=d+p2; end;
while n>=1 do begin dec(n); d:=d+p1; end;
write(f,d); close(f);
readln end.
program dinhdoi;
uses crt;
var
i,n,j,b,j1,cot,d,k,i1,dong,cotd,dem,dongd,cotc,dongc:l
ongint; kt,kt1,kt2,kt3,kt4:longint;
a:array[0..10,0..10] of longint; f:text;
procedure xacdinh;
begin
for i:=1 to dong do
for j:=1 to cot do begin
dongd:=i; cotd:=j;
for i1:=i to dong do begin
if a[i1,cotd]=a[i,j] then inc(kt); inc(d);
if (a[i1+1,cotd]<a[i,j]) and (kt=d) then begin
dongc:=i1; break; end;
end; kt:=0; d:=0;
for j1:=j to cot do begin
if a[i,j]=a[dongd,j1] then inc(kt); inc(d);
if (a[i,j]>a[dongd,j1+1]) and (kt=d) then begin
cotc:=j1; break; end;
end; kt:=0; d:=0;
for i1:=cotd to cotc do if a[dongd,i1]>a[dongd-1,i1]
then inc(kt1);
for i1:=dongd to dongc do if a[i1,cotd]>a[i1,cotd-1]
then inc(kt2);
for i1:=dongd to dongc do if a[i1,cotc]>a[i1,cotc+1]
then inc(kt3);
for i1:=cotd to cotc do if a[dongc,i1]>a[dongc+1,i1]
then inc(kt4);
if (kt1=cotc-cotd+1) and (kt4=kt1) and (kt2=dongc-
dongd+1) and (kt3=kt2) then
begin inc(kt); inc(dem); end;
if (a[i,j]=a[dongc+1,cotc+1]) and (kt=1) then inc(k);
kt1:=0; kt2:=0; kt3:=0; kt4:=0; kt:=0;
dongc:=0; cotc:=0; cotd:=0; dongd:=0; end;
end;
begin clrscr;
assign(f,'doi.inp'); reset(f);
readln(f);
while not eof(f) do begin
inc(dong);
while not eoln(f) do begin inc(cot);
read(f,a[dong,cot]); end;
n:=cot; cot:=0; readln(f); end;
cot:=n;
for i:=1 to dong do
for j:=1 to cot do begin write(a[i,j]); if j=cot then
writeln; end;
close(f); xacdinh; write(dem-k);
readln end.
Program Zdist;
Uses crt;
Var i,n,j,b,c,d,s:longint; a:array[1..10000] of longint;
Begin clrscr;
Write(‘Nhap n ‘); readln(n);
For i≔1 to n do begin write(i,’. ‘); readln(a[i]);
end;
For i≔1 to n do begin
Inc(d);
If a[i]>0 then begin s≔s+a[i]; a[i]≔0; end;
If (a[i]<0) and (s+a[i]>0) then begin s≔s+a[i];
a[i]≔0; end;
For j≔i downto 1 do if (a[j]<0) and (s+a[j]>0) then
begin
S≔s+a[j]; a[j]≔0; d≔d+i-j+1; end;
End;
Write(d);
Readln end.
Giải thích: Khách thứ 1 có thể đến điểm tham quan 4 ở tuyến 1 và đổi xe sang
tuyến 2 có thể đến được điểm tham quan thứ 2.
Khách thứ 2 không thể dùng xe điện để đi đến điểm tham quan thứ 5
program langhoa;
uses crt;
var i,k,n,j,d:longint; b,c,a:array[1..1000] of
longint; f:text;
begin clrscr;
assign(f,'langhoa.inp'); reset(f); read(f,n,k);
readln(f);
while not eoln(f) do begin inc(i); read(f,a[i]); end;
i:=0; readln(f);
while not eoln(f) do begin inc(i); read(f,b[i]); end;
i:=0; readln(f);
while not eoln(f) do begin inc(i); read(f,c[i]); end;
close(f);
assign(f,'langhoa.out'); rewrite(f);
for i:=1 to k do begin
for j:=c[i] to n do if (a[j]=1) and (b[j]=1) and
(b[i]=1) then begin write(f,'1',' '); break; end;
end; close(f);
readln end.
Bài 47. Đoạn đường đẹp nhất
Trong thời gian vừa qua, người dân thành phố XYZ đã vui mừng chào đón sự
xuất hiện của con đường ven biển, con đường được đầu tư rất nhiều kinh phí
xây dựng và các toà nhà đẹp nằm cùng phía với con đường. Con đường có n
ngôi nhà, được đánh thứ tự từ 1 đến n, tính từ đầu đường, toà nhà thứ i có độ
cao là hi. Theo các chuyên gia kiến trúc và thẩm mĩ, đoạn đường đẹp nhất là
đoạn đường mà ở đó độ cao trung bình đúng bằng k
Yêu cầu: Hãy tìm đoạn đường có các toà nhà liên tiếp nhau nhiều nhất sao
cho đoạn đường này là đoạn đường đẹp nhất
Dữ liệu vào: từ tệp văn bản DDUONG.INP gồm
+ Dòng thứ nhất ghi 2 số nguyên dương n và k
+ Dòng thứ hai ghi n số nguyên dương hi là độ cao của từng ngôi nhà
Các số trên cùng dòng ghi cách nhau một dấu cách
Dữ liệu ra: Ghi vào tệp văn bản DDUONG.OUT gồm
+ Dòng thứ nhất ghi số nguyên u là chỉ số bắt đầu của toà nhà thuộc đoạn
đường đẹp nhất
+ Dòng thứ hai ghi số nguyên v là số ngôi nhà trong đoạn đường
DDUONG.INP DDUONG.OUT
45 2
2456 3
program dduong;
uses crt;
var cuoi,i,n,j,b,c,max,s,dau,d,k:longint;
a:array[1..1000] of longint; tb:real; f:text;
begin clrscr;
assign(f,'dduong.inp'); reset(f); read(f,n,k);
readln(f);
while not eoln(f) do begin inc(i); read(f,a[i]); end;
cuoi:=n; close(f);
assign(f,'dduong.out'); rewrite(f);
for i:=1 to n do begin
while cuoi>=i do begin
for j:=i to cuoi do s:=s+a[j];
tb:=s/(cuoi-i+1);
if (tb=k) and (max<cuoi-i+1) then begin dau:=i;
max:=cuoi-i+1; end;
tb:=0; s:=0; dec(cuoi); end;
cuoi:=n; end;
write(f,dau,' ',max); close(f);
readln end.
Bài 48. Viết chương trình tạo ra một ma trận cấp n (3n10), các phần tử là
các số tự nhiên ngẫu nhiên từ 0..99, sau đó sắp xếp theo thứ tự tăng dần theo
hình trôn ốc từ ngoài vào trong
Ví dụ:
123456789 123
894
765
program xoanoc;
uses crt;
var i,n,j,c,i1,d,x,t:longint; b:array[1..1000] of
longint;
a:array[1..100,1..100] of longint;
begin clrscr;
write('Nhap n '); readln(n); randomize;
for i:=1 to n*n do b[i]:=random(99);
for i:=1 to n*n-1 do
for j:=i to n*n do if b[i]>b[j] then begin t:=b[i];
b[i]:=b[j]; b[j]:=t; end;
writeln;
for i:=1 to n do begin inc(d); a[1,i]:=b[d]; end;
for i:=2 to n do begin inc(d); a[i,n]:=b[d]; end;
for i:=n-1 downto 1 do begin inc(d); a[n,i]:=b[d];
end;
for i:=n-1 downto 2 do begin inc(d); a[i,1]:=b[d];
end;
inc(d); x:=d;
for i:=1 to n-2 do begin
if (i mod 2<>0) then begin
for i1:=d to d+n-3-1 do
for j:=i1 to d+n-3 do if b[i1]>b[j] then begin
t:=b[i1]; b[i1]:=b[j]; b[j]:=t; end;
end;
if (i mod 2=0) then begin
for i1:=d to d+n-3-1 do
for j:=i1 to d+n-3 do if b[i1]<b[j] then begin
t:=b[i1]; b[i1]:=b[j]; b[j]:=t; end;
end;
d:=d+n-2; end; d:=x;
for i:=2 to n-1 do
for j:=2 to n-1 do begin a[i,j]:=b[d]; inc(d); end;
writeln;
for i:=1 to n do
for j:=1 to n do begin write(a[i,j],' '); if j=n then
writeln; end;
readln end.
Bài 51. Cho biết một dãy các số chính phương viết liên tục 1491625....Nhập
vào số N hãy cho biết chữ số thứ N trong dãy.
ví dụ : N=5 kq là 6
N=6 kq là 2
Program chinhphuong;
Uses crt;
Var i,n,j,b,c,d:longint; s:string[255];
Begin clrscr;
Write(‘Nhap n ‘); readln(n);
While d<n do begin
Inc(i); b≔i*i; str(b,s);
For j≔1 to length(s) do begin inc(d); if d=n then
begin write(s[j],’ ‘); break; end; end;
End;
Readln end.
Bài 52. Chi phí cộng số
Nhập vào từ bàn phím số nguyên dương N ( 1<N<30) và N số nguyên dương
có gía trị nhỏ hơn 1000.
Dòng 1 ghi N số đã cho sau khi đã sắp xếp theo thứ tự giảm.
Dòng 3 ghi số thực R với hai chữ số sau dấu phẩy là chi phí nhỏ nhất khi thực
hiện các phép cộng để tính tổng T, biết rằng mỗi khi tính tổng của hai số
nguyên dương X và Y phải trả chi phí lượng tiền bằng 1% của tổng X + Y. Ví
dụ, khi tính tổng T của bốn số 35, 19,21,25 chi phí tối thiểu là R = 2,00
program chiphi;
uses crt;
var i,n,j,c,d:longint; chiphi:real; b,a:array[1..1000]
of longint;
begin clrscr;
write('Nhap n '); readln(n);
for i:=1 to n do begin write(i,'. '); readln(a[i]);
end;
for i:=1 to n do b[i]:=a[i];
for i:=1 to n-1 do
for j:=i to n do if a[i]<a[j] then begin d:=a[i];
a[i]:=a[j]; a[j]:=d; end;
for i:=1 to n do write(a[i],' '); writeln; d:=0;
for i:=1 to n do d:=d+a[i];
writeln(d); d:=0;
for i:=1 to n do a[i]:=b[i];
for i:=1 to n do begin
d:=d+a[i]+a[i+1];
end;
d:=d-a[n]; d:=d+a[1]+a[n]; chiphi:=d/100;
write(chiphi:2:2);
readln end.
Bài 53. Gặp mặt
Một nhóm bạn gồm n học sinh đang tham gia một câu lạc bộ tin học trong dịp
nghỉ hè. Biết rằng khoảng thời gian có mặt tại câu lạc bộ là a[i],b[i] (trong đó:
a[i] là thời gian đến, b[i] là thời gian về) Cô giáo chủ nhiệm muốn đến thăm
các bạn trong câu lạc bộ này. Em hãy xác định thời điểm cô giáo đến sao cho
lúc đó cô có thể gặp được nhiều bạn nhất
Dữ liệu vào: vào từ file MEETING.INP gồm các dòng:
+ Dòng 1 chứa số nguyên dương n là số học sinh có mặt tại câu lạc bộ
+ Trong n dòng tiếp theo, mỗi dòng chứa 2 số nguyên dương a[i] và b[i] tương
ứng là thời gian đến và về của từng bạn. Các số trên cùng dòng ghi cách nhau
một dấu cách
Dữ liệu ra: file văn bản MEETING.OUT gồm 1 dóng chứa số nguyên k là số
học sinh nhiều nhất mà có giáo có thể gặp được
program meeting;
uses crt;
var i,n,j,c,max,d:longint; vt,b,kq,a:array[1..10000]
of longint;
begin clrscr;
write('Nhap n '); readln(n);
for i:=1 to n do begin write(i,'. ');
readln(a[i],b[i]); end;
for i:=1 to n do begin
for j:=1 to n do if (a[i]>=a[j]) and (a[i]<=b[j]) then
begin inc(d); vt[d]:=j; end;
if (max<d) then begin max:=d;
for j:=1 to max do kq[j]:=vt[j];
end;
d:=0; end;
for i:=1 to max do write(kq[i],' ');
readln end.
Bài 54. Tên thiêng
Thuở cưa, có một bộ tộc cổ đại giữ tập tục đặt tên cho những đứa con của
mình theo tên của vị thần năm đó với hi vọng chúng được thần linh phù hộ
hạnh phúc, khoẻ mạnh và có thể chống lại các thế lực đen tối, ma quỷ xung
quanh. Mỗi gia đình có một tên thiêng do trưởng làng lựa chọn. Tên các thành
viên trong gia đình phải là một xâu con gồm một hay nhiều kí tự liên tiếp
nhau của tên Thiêng (tên các thành viên không được trùng nhau và không
được trùng với tên Thiêng).
Ví dụ: với tên thiêng là alubala, các tên có thể đặt là: alu, uba, ala... các tên
không được đặt là aba, ala, ua...
Yêu cầu: Hãy nhập vào màn hình một tên Thiêng, hãy xuất ra số tên tối đa có
thể đặt từ tên Thiêng đó
aluba 23
program tenthieng;
uses crt;
var i,n,j,cuoi,d,kt,x:longint; s1:array[1..100] of
string; s2,s:string[255];
begin clrscr;
write('Nhap s '); readln(s); cuoi:=length(s);
for i:=1 to length(s) do begin
while cuoi>=i do begin
for j:=i to cuoi do s2:=s2+s[j];
for j:=1 to x do if s1[j]=s2 then inc(kt);
if kt=0 then begin inc(x); s1[x]:=s2; end;
kt:=0; s2:=''; dec(cuoi); end;
cuoi:=length(s); end;
write(x-1);
readln end.