Professional Documents
Culture Documents
Begin clrscr;
Write(‘Nhap n ‘); readln(n);
For i≔1 to n do begin write(I,’. ‘); readln(s[i]);
end;
Fillchar(t,sizeof(t),true);
Try(1); write(max);
Readln end.
program Xeplaidayso;
uses crt;
var m,n,i,j,j1,i1,s,kt,x,p,d:longint;
f,a,c:array[1..100] of longint;
t:array[1..100] 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;
for i:=1 to x do begin
for j1:=1 to i-1 do begin
for i1:=i+1 to x do if (f[i]*2=f[j1]+f[i1]) then
inc(kt);
end;
if kt=0 then for i:=1 to n do begin d:=a[i];
write(c[d]); 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;
{---------------------------------------------------}
begin clrscr;
write('Nhap n '); readln(n);
fillchar(t,sizeof(t),true);
for i:=1 to n do begin
write(i,'. '); readln(c[i]); end;
try(1);
readln end.
11. Bài toán quân hậu. Tìm tất cả các cách xếp 8 quân hậu trên bàn cờ sao cho
không có quân nào có thể ăn được nhau.
Program Hau;
Uses crt;
Var I,n,j,b,c,d:longint; t1,t2,t:array[-100..1000]
of Boolean;
A: array[1..1000] of longint;
Procedure incauhinh;
Begin
For i≔1 to 8 do write(‘( ‘,I,’ ; ‘,a[i],’ ) ‘);
writeln;
End;
Procedure try(i:longint);
Var j:integer;
Begin
For j≔1 to 8 do if t[j] and (t1[i+j]) and (t2[i-j])
then begin
A[i]≔j;
If i=8 then incauhinh else begin t[j]≔false;
t1[i+j]≔false; t2[i-j]≔false;
Try(i+1); t[j]≔true; t1[i+j]≔true; t2[i-
j]≔true; end;
End; end;
Begin clrscr;
Fillchar(t,sizeof(t),true);
fillchar(t1,sizeof(t1),true);
fillchar(t2,sizeof(t2),true);
Try(1);
Readln end.
Bài 12. Viết chương trình nhập vào một xâu tối đa 1000 kí tự, viết chương trình
tìm xâu đối xứng dài nhất trong xâu đó
program xaudoixungdainhat;
uses crt;
var i,n,j,b,max,d,kt,cuoi:longint;
s,kq,s1,s2: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 s1:=s1+s[j];
for j:=length(s1) downto 1 do s2:=s2+s1[j];
for j:=1 to length(s1) do if s1[j]=s2[j] then inc(kt);
if (kt=length(s1)) and (max<length(s1)) then begin
max:=length(s1); kq:=s1; end;
kt:=0; dec(cuoi); s1:=''; s2:=''; end;
cuoi:=length(s); end;
write(kq);
readln end.
Bài 13. Cho trước một xâu S, viết chương trình thêm vào xâu S đó ít kí tự
nhất để xâu S trở thành xâu đối xứng.
Ví dụ: edbabcd → e,c
program Themkitu;
uses crt;
var i,n,j,vt,b,k,j1,kt,max,t,d:longint;
a:Array[0..10000] of longint; c:array[0..100000]
of string;
s1,s2:string[255]; kq,ss1,ss2:string[255];
procedure incauhinh;
begin
vt:=0; ss1:=''; ss2:=''; kt:=0;
for i:=1 to k do begin d:=a[i]; ss1:=ss1+c[d]; end;
for i:=1 to length(ss1) do begin
for j1:=vt+1 to length(s2) do if s2[j1]=ss1[i] then
begin vt:=j1; ss2:=ss2+s2[j1]; break; end;
end;
for i:=1 to length(ss1) do if ss1[i]=ss2[i] then
inc(kt);
if (kt=length(ss1)) and (max<length(ss1)) then begin
max:=length(ss1); kq:=ss1; end;
end;
procedure try(i:longint);
var j:integer;
begin
for j:=a[i-1]+1 to length(s1)-k+i do begin
a[i]:=j;
if i=k then incauhinh else try(i+1); end;
end;
begin clrscr;
write('Nhap s '); readln(s1);
for i:=1 to length(s1) do c[i]:=s1[i];
for i:=length(s1) downto 1 do s2:=s2+s1[i];
writeln(s2);
for k:=1 to length(s1) do begin try(1); i:=0; d:=0;
end;
for i:=1 to length(kq) do begin
for j:=1 to length(s1) do if s1[j]=kq[i] then begin
delete(s1,j,1); break; end;
end;
write(s1);
readln end.
Bài 14. Tìm dãy con chung lớn nhất của 2 dãy.
Program Chung;
Uses crt;
Var i,n,j,d,t,vitri:longint;
a:array[0..1000] of longint;
s1,s2,st1,st2,max:string[255];
s:array[0..1000] of string;
Procedure incauhinh;
Begin st1≔’’; st2≔’’;
For i≔1 to k do begin d≔a[i]; st1≔st1+s[d]; end;
End;
Procedure kiemtra;
Begin
vitri≔0;
For i≔1 to length(st1) do begin
For t≔vitri+1 to length(s2) do if s2[t]=s1[i] then
Begin
St2≔st2+s2[t];
Vitri≔t;
Break; end;
End;
If (length(st1)=length(st2)) and
(length(max)<length(st1)) then max:=st1;
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; kiemtra; end else
try(i+1); end;
End;
Procedure nhap;
Begin
Write(‘Nhap xau 1 ‘); readln(s1);
Write(‘Nhap xau 2 ‘); readln(s2);
N≔length(s1);
For i≔1 to n do s[i]≔s1[i];
For k≔1 to n do begin try(1); d≔0; i≔0; end;
Write(max);
End;
{---------------------------------------------------}
Begin clrscr;
Nhap;
Readln end.
Bài 15. Trò chơi với băng số
Nhập vào một mảng gồm n số nguyên dương. Hãy tìm cách chia mảng này
thành nhiều phần nhất có thể sao cho tổng mỗi phẫn là bằng nhau
Ví dụ:
BANGSO.INP BANGSO.OUT
10 3
5 1 2 2 10 2 3 2 1 2 5 1 2 2 10 23212
Program Bangso;
Uses crt;
Var i,n,j,sday,s,tong,x:longint;
a,uoc: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 s≔s+a[i];
for i≔1 to s do if (s mod i=0) and (i<n) then begin
inc(x); uoc[x]≔i; end;
for i≔1 to x do begin
sday≔s div uoc[i];
for j≔1 to n do begin
tong≔tong+a[j];
If tong=sday then begin tong≔0; inc(kt); end;
End;
If kt=uoc[i] then write(uoc[i],’ ‘);
Kt≔0; tong≔0; end;
Readln end.
Bài 16. Tìm dãy con dài nhất có qui luật đi xuống rồi lên lại (giá vàng ổn định)
program Giavang;
uses crt;
var i,n,j,b,d,t,max,k,kt,vt,k1,k2,x:longint;
a,f1,kq,c:array[0..1000] of longint; f:text;
procedure Docfile;
begin
assign(f,'giavang.inp'); reset(f);
read(f,n);
while not eof(f) do
begin
inc(i);
read(f,c[i]);
end;
close(f);
end;
procedure incauhinh;
begin x:=0;
for i:=1 to k do
begin
d:=a[i];
x:=x+1;
f1[x]:=c[d];
end;
end;
procedure kiemtra;
begin k1:=0; k2:=0;
for i:=1 to x do
begin
if (f1[i]>f1[i+1]) and (k2=0) then
inc(k1);
if (f1[i]<=f1[i+1]) then inc(k2);
end;
if (k2+k1=x-1) and (max<x) then
begin
max:=x;
for i:=1 to max do kq[i]:=f1[i];
end;
for i:=1 to max do f1[i]:=0;
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; kiemtra; end else
try(i+1);
end;
end;
procedure CT;
begin
i:=0; Docfile;
for k:=1 to n do
begin
try(1); i:=0; d:=0;
k1:=0; k2:=0;
end;
assign(f,'giavang.out'); rewrite(f);
for i:=1 to max do write(f,kq[i],' ');
close(f);
end;
begin clrscr;
CT;
readln end.
Bài 17. Tìm dãy con đơn điệu dài nhất
program Daycondondieudainhat;
uses crt;
var k1,k2,n,k,kt,i,j,d,max,x:longint;
kq,a,c,f:array[0..1000] of longint;
procedure incauhinh;
begin x:=0;
for i:=1 to k do begin d:=a[i]; x:=x+1;
f[x]:=c[d]; end;
end;
procedure kiemtra;
begin k1:=0; k2:=0; kt:=0;
for i:=1 to x do
begin
if (f[i]>f[i+1]) then begin k1:=i;
break; end;
if (f[i]<f[i+1]) then begin k2:=i;
break; end;
end;
if k1=1 then
begin
for i:=1 to x do
begin
if k1 mod 2<>0 then
begin
if (f[i]>=f[i+1]) and
(i mod 2<>0) then kt:=kt+1;
if (f[i]<=f[i+1]) and
(i mod 2=0) then kt:=kt+1;
end;
if k1 mod 2=0 then
begin
if (f[i]>=f[i+1]) and
(i mod 2=0) then inc(kt);
if (f[i]<=f[i+1]) and
(i mod 2<>0) then inc(kt);
end;
end;
end;
{-----------------------------------------------------
--------------------------------------}
if k2=1 then
begin
for i:=1 to x do
begin
IF k2 mod 2<>0 then
begin
if (f[i]<=f[i+1]) and
(i mod 2<>0) then inc(kt);
if (f[i]>=f[i+1]) and
(i mod 2=0) then inc(kt);
end;
if k2 mod 2=0 then
begin
if (f[i]<=f[i+1]) and
(i mod 2=0) then inc(kt);
if (f[i]>=f[i+1]) and
(i mod 2<>0) then inc(kt);
end;
end;
end;
if (kt=x-1) and (max<x) then
begin
max:=x;
for i:=1 to max do kq[i]:=f[i];
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; kiemtra;
end else try(i+1);
end;
end;
procedure nhap;
begin
write('Nhap n '); readln(n);
for i:=1 to n do
begin
write(i,'. '); readln(c[i]);
end;
for k:=1 to n do begin try(1); i:=0; d:=0;
end;
for i:=1 to max do write(kq[i]:5);
end;
begin clrscr;
nhap;
readln end.
Bài 18. Tìm tất cả các số tự nhiên (>10,<65535) thoả điều kiện:
a) Là số fibonacci
b) Có ít nhất một số nguyên tố được tạo thành khi đổi chỗ các chữ số của nó
Chương trình:
Program timso;
Uses crt;
Var i,n,j1,x,i1,j,so,d,kt,f0,f1,f2:longint;
r:integer; t:array[0..1000] of boolean;
A,c:array[0..100] of longint; s1,s2:string[255];
s:array[0..1000] of string;
{---------------TIN SO FIBONACCI---------------------}
Procedure Fibon;
Begin
F0≔1; f1≔1;
While f2≤65535 do begin
F2≔f0+f1; F0≔f1; F1≔f2;
Inc(n); c[n]≔f2; end;
End;
{------------KIEM TRA, DAO SO VA KT NGUYENTO--------}
Procedure incauhinh;
Begin
S2≔’’;
For i≔1 to x do begin d≔a[i]; s2≔s2+s[d]; end;
End;
Procedure nguyento;
Begin
Kt≔0; d≔0;
Val(s2,so,r);
For i≔1 to so do if so mod i=0 then inc(d);
If d=2 then inc(kt);
End;
Procedure try(i:longint);
Var j:integer;
Begin
For j≔1 to x do if t[j] then begin
A[i]≔j;
If i=x then begin incauhinh; nguyento; end else begin
t[j]≔false; try(i+1);
T[j]≔true; end;
End; end;
Begin clrscr;
Fibon;
For i1≔1 to n do begin
Str(c[i1],s1); x≔length(s1);
For j1≔1 to x do s[j1]≔s1[j1];
Fillchar(t,sizeof(t),true); kt≔0;
Try(1);
If kt≥1 then write(c[i1],’ ‘);
End;
Readln end.
Bài 19. Nhập vào một mảng gồm n phần tử. Hãy tìm dãy con có tổng lớn nhất
sao cho không có 3 phần tử nào được đứng liên tiếp nhau.
Vd: 1 2 3 4 5
Dãy thoả điều kiện: 1 2 4 5
Dãy không thoả điều kiện: 1 2 3 5: (1 2 3 là 3 phần tử liên tiếp nhau trong dãy
mẹ).
program phanthuong;
uses crt;
var i,n,j,j1,i1,d,s,dai,x,k,kt,max:longint;
a,c,f,f1,f2,kq:array[0..1000] of longint;
procedure incauhinh;
begin
x:=0;
for i:=1 to k do begin d:=a[i]; s:=s+c[d];
inc(x); f[x]:=c[d]; end;
end;
{----------------------------------------------------}
procedure xuli;
begin
d:=0; kt:=0;
for i:=1 to x do begin
for j1:=1 to n do if f[i]=c[j1] then
begin
f1[1]:=f[i]; f1[2]:=f[i+1];
f1[3]:=f[i+2];
f2[1]:=c[j1]; f2[2]:=c[j1+1];
f2[3]:=c[j1+2];
for i1:=1 to 3 do if (f1[i1]=f2[i1])
and (f1[i1]<>0) and (f2[i1]<>0) then inc(d);
if d>=3 then inc(kt);
d:=0;
end;
end;
if (kt=0) and (max<s) then
begin
for i:=1 to x do kq[i]:=f[i];
dai:=x;
max:=s;
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 k:=1 to n do begin try(1); i:=0; d:=0; end;
for i:=1 to dai do write(kq[i]:5);
readln end.
Bài 20. Nhập một danh sách nhân viên gồm họ tên, ngày tháng năm sinh, sắp
xếp danh sách đó tăng dần theo tuổi
program hoso;
uses crt;
type hoso=record
ten:string[35];
ngay,thang,nam:longint;
end;
var i,n,j,b,c,d,t:longint; a:array[1..1000] of hoso;
s:string[255];
begin clrscr;
write('Nhap n '); readln(n);
for i:=1 to n do begin
writeln('NHAP THONG TIN NHAN VIEN THU ',i);
write('Nhap ten: '); readln(a[i].ten);
write('Nhap - ngay - thang nam sinh: ');
readln(a[i].ngay,a[i].thang,a[i].nam);
end;
for i:=1 to n-1 do
for j:=i to n do if (a[i].nam>a[j].nam) or
((a[i].nam=a[j].nam) and (a[i].thang>a[j].thang))
or ((a[i].nam=a[j].nam) and (a[i].thang=a[j].thang)
and (a[i].ngay>a[j].ngay)) then begin
t:=a[i].nam; a[i].nam:=a[j].nam; a[j].nam:=t;
t:=a[i].thang; a[i].thang:=a[j].thang; a[j].thang:=t;
t:=a[i].ngay; a[i].ngay:=a[j].ngay; a[j].ngay:=t;
s:=a[i].ten; a[i].ten:=a[j].ten; a[j].ten:=s; end;
for i:=1 to n do write(a[i].ten,' ');
readln end.
Bài 21. Viết chương trình tạo một bảng cho phép nhập câu hỏi, 4 đáp án ABCD
và đáp án đúng. Sau đó, nhập câu trả lời của bạn cho từng câu hỏi. Nếu câu trả
lời đúng với đáp àn thì in ‘DUNG’ ngược lại ‘SAI’.
program Hoso;
uses crt;
type tracnghiem=record
cauhoi:string[25];
d1,d2,d3,d4:char;
dapan:char;
kq:string[8];
end;
var a:array[1..10] of tracnghiem; d:array[1..10] of
char; ch:char;
i,n,j,b,c:longint;
begin clrscr;
for i:=1 to 3 do begin
writeln('Nhap thong tin cau hoi so ',I);
write('Nhap cau hoi: '); readln(a[i].cauhoi);
write('A. '); readln(a[i].d1);
write('B. '); readln(a[i].d2);
write('C. '); readln(a[i].d3);
write('D. '); readln(a[i].d4);
write('Nhap dap an: '); ch:=readkey;
ch:=upcase(ch); a[i].dapan:=ch; WRITELN; END;
writeln('Nhap dan an cua ban ');
for i:=1 to 3 do begin
write(i,'. '); readln(d[i]); d[i]:=upcase(d[i]); end;
for i:=1 to 3 do if a[i].dapan=d[i] then a[i].kq:='DUNG'
else a[i].kq:='SAI';
for i:=1 to 3 do
with a[i] do begin
write('|',cauhoi,#32:25-length(cauhoi),'|',dapan,#32:8-
1,'|',d[i],#32:8-1,'|',kq,#32:8-length(kq),'|');
writeln; end;
readln end.
Bài 22. Phần tử a[i,j] được gọi là phần tử yên ngựa nếu nó là phần tử lớn nhất
trong dòng i và nhỏ nhất trong cột j. Cho trước một mảng có kích thước nxm.
Viết chương trình tìm phần tử yên ngựa trong đó.
Program PTYN;
Uses crt;
Var max,min,cot,dong,i,j,n,j1:longint;
a:array[1..100,1..100] of longint; f:text;
Begin clrscr;
Assign(f,’PTYN.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);
For i≔1 to dong do
For j≔1 to cot do begin
For j1≔1 to dong do if max<a[j1,j] then max≔a[j1,j];
For j1≔1 to cot do if min>a[i,j1] then min≔a[i,j1];
If max=min then writeln(i,’ ‘,j);
Max≔0; end;
Readln
End.
Dòng thứ i trong n dòng tiếp theo ghi thẻ của người chơi gồm k số; số cuối cùng là
số điểm
OUTPUT: Ghi ra kết quả file Xoso.out, mỗi dòng là k số thể hiện kết quả mà máy
tính đã chọn.
XOSO.INP XOSO.OUT
594 1234
24682 2347
56890
24562
12373
35691
program xoso;
uses crt;
var i,n,j,m,k,kt,i1,j1,dong,cot,d,t,x:longint;
a,f,c,dapan:array[0..1000] of longint;
xoso:array[0..100,0..100] of longint; file1:text;
procedure docfile;
begin
assign(file1,'xs.inp'); reset(file1);
read(file1,n,m,k); readln(file1);
while not eof(file1) do begin
inc(dong);
while not eoln(file1) do begin inc(cot); if cot<=k
then read(file1,xoso[dong,cot]) else
read(file1,dapan[dong]); end;
x:=cot; cot:=0; readln(file1); end; close(file1);
cot:=x-1; x:=0;
end;
procedure incauhinh;
begin
x:=0; kt:=0;
for i:=1 to k do begin d:=a[i]; inc(x); f[x]:=c[d];
end; d:=0;
for i:=1 to dong do
for t:=1 to cot do begin
for j1:=1 to x do if f[j1]=xoso[i,t] then inc(kt);
if t=cot then begin if kt=dapan[i] then inc(d); kt:=0;
end;
end;
if d=dong then begin for i:=1 to x do write(f[i],'
'); writeln; end;
end;
procedure try(i:longint);
var j:integer;
begin
for j:=a[i-1]+1 to m-k+i do begin
a[i]:=j;
if i=k then incauhinh else try(i+1); end;
end;
begin clrscr;
docfile;
for i:=1 to m do c[i]:=i; try(1);
readln end.
Bài 24. Nhà bác học Neli Soloan đưa ra khái niệm độ bền của số như sau:
+ Nếu n có 1 chữ số thì độ bền bằng 0
+ Nếu n có 2 chữ số trở lên thì độ bền bằng độ bền có số nguyên x (với x là tích
các chữ số của n) cộng 1.
Hãy viết chương trình tính độ bền của 1 số
Vs: 99 = doben(81)+1 = doben(8)+1+1=0+1+1=2
Program Doben;
Uses crt;
Var i,d,n,j,tich,r:integer; s:string[255];
Begin clrscr;
Write(‘Nhap n ‘); readln(n);
Str(n,s);
While length(s)>1 do begin
Tich≔1;
For i≔1 to length(s) do begin val(s[i],j,r);
tich≔tich*j; end;
Str(tich,s); inc(d); end; inc(d);
Write(‘DO BEN LA: ‘,d);
Readln end.
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 Milk;
uses crt;
var i,n,max,s,kt,j,d:longint; t1,t2:longint; f:text;
a,b:array[1..1000] of longint;
begin clrscr;
assign(f,'milk.inp'); reset(f);
readln(f,n);
while not eof(f) do begin
inc(i);
while not eoln(f) do begin read(f,a[i]); break; end;
readln(f); end;
close(f);
assign(f,'milk.inp'); reset(f); i:=0; readln(f);
while not eof(f) do begin
inc(i);
while not eoln(f) do read(f,b[i]);
readln(f); end;
close(f);
for i:=2 to n do begin
for j:=1 to i do if a[i]<b[j] then begin
s:=b[i]-a[j]; s:=abs(s); if max<s then max:=s; end;
end;
assign(f,'milk.out'); rewrite(f);
writeln(f,max); max:=0; s:=0;
for i:=2 to n do begin
for j:=1 to i do if a[i]>b[j] then inc(kt);
if kt=i-1 then begin s:=a[i]-b[i-1]; s:=abs(s); if
max<s then max:=s; end; {Tìm thời gian rảnh lâu nhất}
kt:=0; end;
write(f,max);
close(F);
readln end.
Bài 34. Dùng các phép toán +/ - /*/ : để điền vào biểu thức dưới đây sao cho kết
quả bằng 35.
((((1 ? 2)? 3)? 4)? 5)? 6
program diendau;
uses crt;
var so1,so2,i1,j1,y,i11,x,i,n,j,d,kt,k:longint;
f,c,f1,a,a1:array[0..1000] of longint; l:byte;
t:array[0..1000] of boolean; ss:array[0..10000] of
string; s,s1,s2:string[255];
procedure incauhinh1;
begin
s1:=''; s2:=''; s:=''; kt:=0; so1:=0;
so2:=0;
for i1:=1 to x do begin d:=a1[i1];
f1[i]:=f[d]; end;
so1:=so1+100*f1[1]+10*f1[2]+f1[3];
str(so1,s1);
so2:=so2+100*f1[4]+10*f1[5]+f1[6];
str(so2,s2); s:=s1+s2;
if so1*2=so2 then writeln(so1,' ',so2);
end;
procedure try1(i1:longint);
var j1:integer;
begin
for j1:=1 to x do if t[j1] then begin
a1[i1]:=j1;
if i1=x then incauhinh1 else begin
t[j1]:=false; try1(i1+1); t[j1]:=true; end;
end;
end;
procedure incauhinh;
begin
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.
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 50. Xét tập các số F(N) (1≤ N ≤100 tấc cả các số hữu tỉ trong đoạn [0,1] có
mẫu số từ 1 đến N ta có
0 1 1 1 2 1 3 2 3 4 1
; ; ; ; ; ; ; ; ; ;
F(N) gồm có 1 5 4 3 5 2 5 3 4 5 1
Program fn;
Uses crt;
Var i,n,j,i1,x,kt,d:longint; kq:real;
a:array[1..10000] of real;
Begin clrscr;
Write(‘Nhap n ‘); readln(n);
For i≔0 to n do begin
For j≔1 to n do begin
Kq≔i/j;
For i1≔1 to x do if a[i1]=kq then inc(kt);
If (kt=0) and (kq≥0) and (kq≤1) then begin inc(x);
a[x]≔kq; write(i,’-‘,j,’ ‘); end;
Kt≔0; end; 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.
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.
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.
Bài 55. Xếp gạch
Cường rất thích trò chơi xếp gạch. Cậu đặt các viên gạch chồng lên nhau và
xây thành nhiều chồng có độ cao khác nhau. Sau đó, cậu đem khoe với chị
Hoá: “Chị trông em đã xếp được một bức tường rồi này”. Nhưng chị bảo:
“Em phải xếp các chồng gạch cao đều nhau thì mưới gọi là bức tường được”.
Sau khi nghe vậy, Cường suy nghĩ một tí rồi thấy có ý đúng. Vì vậy, em bắt
đầu xếp lại các chồng gạch. Khi công việc đã hoàn tất, Cường mệt lả và muốn
có người nào đó giúp mình di chuyển số gạch với số thao tác ít nhất
Yêu cầu: Em hãy giúp Cường xác định số lần di chuyển gạch ít nhất mà bạn
ấy cần thực hiện
Dữ liệu vào: tệp văn bản GACH.INP gồm 2 dong:
+ Dòng 1: chứa số nguyên n là số các chồng gạch
+ Dòng 2: chức n số nguyên ai là độ cao của chồng gạch thứ i. Biết rằng tổng
số viên gạch chia hết cho n. Các số trên cùng dòng cách nhau một dấu cách
Dữ liệu ra: ghi vào tệp văn bản GACH.OUT gồm 1 số nguyên duy nhất là số
thao tác ít nhát mà Cường cần thực hiện
Ý tưởng: Tìm số viên gạch x mỗi chồng trong bức tường bằng cách lấy tổng chia
cho n. Sau đó tìm các số nhỏ hơn x trong mảng, nếu số đó nhỏ hơn x thì cộng số
chênh lệch cả hai.
GACH.INP GACH.OUT
6 5
524175
program gach;
uses crt;
var i,n,j,s,b,tam,c,d:longint; a:array[1..10000] of
longint; f:text;
begin clrscr;
assign(f,'gach.inp'); reset(f); read(f,n); readln(f);
while not eoln(f) do begin inc(i); read(f,a[i]); end;
close(f);
for i:=1 to n do s:=s+a[i];
tam:=s div n;
assign(f,'gach.out'); rewrite(f);
for i:=1 to n do begin
if a[i]<tam then d:=d+tam-a[i];
end;
write(f,d); close(f);
readln end.
Bài 56. Trong một bức thư Einstein gửi giáo sư Euler, ông ta nêu rằng mọi số
tự nhiên chẵn lớn hơn 2 đều có thể phân tích thành tổng của hai số nguyên tố
bất kì. Hãy viết chương trình kiểm nghiệm tính đúng đắn của phỏng đoán
trên.
Yêu cầu: nhập vào từ bàn phím số nguyên dương chẵn n (2<n<106). Xuất ra
mà hình cặp số nguyên tố có tổng bằng n.
program phongdoan;
uses crt;
var i,n,j,b,c,d,kt1,kt2,kt,so1,so2:longint;
begin clrscr;
write('Nhap n '); readln(n); so1:=n;
while kt=0 do begin
kt1:=0; kt2:=0; kt:=0;
dec(so1); so2:=n-so1;
for i:=1 to so1 do if so1 mod i=0 then inc(kt1);
for i:=1 to so2 do if so2 mod i=0 then inc(kt2);
if (kt1=2) and (kt2=2) then inc(kt);
end;
write(so1,' ',so2);
readln end.
Bài 57. Khi đào hầm Thủ Thiên, người ta co một robot đào hầm. Ban đầu,
người ta đào đường hầm dài 1 đơn vị độ dài sau đó đặt robot xuống. Robot
được điều khiển bởi 2 lệnh là: C1 và N2
+ C1: đào một đường hầm với độ dài 1 đơn vị, tiêu tốn 1 năng lượng
+ N2: đào một đường hầm bằng đúng độ dài đường hầm đang có, tốn 2 năng
lượng
Yêu cầu: Hãy viết chương trình yêu cầu robot đào một đường hầm với k đơn
vị độ dài và tiêu tốn ít năng lượng nhất có thể. Biết ban đầu đường hầm dài 1
đơn vị
Ví dụ:
12 12
C1 C1 N2 N2
Program robot;
Uses crt;
Var i,n,j,b,c,x,k:longint; s:array[1..10000] of
string;
Begin clrscr;
Write(‘Nhap k ‘); readln(k);
While k>2 do begin
If (k mod 2=0) then begin k≔k div 2; inc(x);
s[x]≔’N2’; end;
If (k mod 2<>0) then begin dec(k); inc(x); s[x]≔’C1’;
end;
End;
Inc(x); s[x]≔’C1’;
For i≔x downto 1 do write(s[i],’ ‘);
Readln end.