Sunteți pe pagina 1din 241

.

LJlL_ PASOI
,
Dana Lica Mircea P a o i
'tetI
INFORMATICA
...,
FUNDAMENTELE PROGRAMARII
Culegere de probleme - Pascal i C/C++
pentru clasa a X-a
Editura L&S Info-mat
CopyrigllJ20Q?
Toate drepturile asupra acestei editurii L&S INFO-MAT.
Reproducerea sau a textului din carte este
doar cu acordul n scris al editurii L&S INFO-MAT.
Editura L&SINFO-MAT:
Adresa: Str. Stnjeneilor nr. 8, bl. 29, se. A, et. 1, apt. 12, sector 4,
Telefon: 021-3321315; 021-6366344; 0722-530390; 0722-573701;
Fax: 021-3321315;
E-mail: tsorin@ls-infofnat.ro;
Web Site: www.ls-infomat.ro.
Descrierea CIP a Bibliotecii a Romniei
LICA,DANA
fundamentele / Dana Lica,
Mircea - Editura L&S Soft, 2005-
3 vol.
ISBN 973-86022-9-7
VoI. 2 : Culegere de probleme - Pascal C++
pentru clasa a X-a. - Editura L&SJnfomat,
2005. - ISBN 973-7658-02-7
Mircea
004.42 PASCAL(075.35)(076)
004.42 3C(075.35)(076)
004.42 C++(075.35)(076)
Tiparul executat la S.c. LUMINA TIPO s.r.l.
Str. Luigi Galvani nr. 20 bis, sect. 2, teL/fax211.32.60
Tel. 212.29.27, e-mail: office@luminatipo.com, www.luminatipo.com.
Cuprins
Capitolull
Tipuri structurate de date
1.1 de caractere
1.1.1 Teste cu alegere :?
1.1.2 Probleme rezolvate !.'!.
1.1.3 Probleme propuse ?:?
1.2 nregistrare - }}
1.2.1 Teste cu alegere JJ
1.2.2 Probleme rezolvate J?
1.2.3 Probleme propuse
1.3 Probleme de concurs ce date structurate
1.3.1.Probleme rezolvate :5.!.
1.3.2 Probleme propuse ZJ
Capitolul 2
Subprograme definite de utilizator
2.1 Subprograme implementate n .-?1.
2.1.1 Teste cu alegere !?l
2.1.2 Probleme rezolvate .J.fJ.J.
2.1.3 Probleme propuse
2.2 Subprograme implementate n U.9..
2.2.1 Teste cu alegere l??
2.2.2 Probleme rezolvate !.'!.fJ.
2.2.3 Probleme propuse
2.3 Probleme de concurs l.fi.
2.3.1 Probleme rezolvate
2.3.2 Probleme propuse
Indicatii J.QJ,
3
Tipuri de Date Structurate
fiii de caractere
1.1.1 Teste cu alegere
1. Care dintre sunt corecte sintactic? Variabilele care
intervin sunt de tip string / char *.
a) pos('a',s):=2;
b) e:=delete(s,2,2);
e) writeln(length('ana'));
d) insert('red' ,s,4);
a) p=strehr('a',b);
b) k = strehr(s,x)-s;
e) eoutstrlen(Uana");
d) k = streat ("ma" ,"ma") ;
2. Se variabila s de tip string / char *. Care dintre
valoarea variabilei s din care lipsesc primul ultimul caracter? Variabila i
unui tip ntreg.
a) delete(s,l,l);
delete(s,length(s) ,1);
writeln (s) ;
b) for i:=2 to length(s)-l do
write(s[i]);
e) n:=length(s);
delete(s,l,l);
delete(s,n,l) ;
writeln(s) ;
d)
write(eopy(s,2,length(s)));
a) strepy(s,s+l);
strepy(s+strlen(s)-l,
s+strlen(s)) ;
eoutsendl;
b) for(i=l; i<strlen(s)-l; i++)
eouts[i] ;
e)
strcpy(s,strehr(s,s[strlen(s)-l])+l);
strepy(s,s+l);
eouts;
d) for(i=O; i<strlen(s)-2; i++)
eouts [il ;
3. Ce se va n urma de
s:='Primavara' ;
for i:=l to 3 do
delete(s,2,1) ;
writeln(s);
a = "Primavara";
for (int i=1;i<=3;i++)
strepy(a+1,a+2);
eouta;
a) Pavara; b) ara; e) rim; d) Para.
5
4. Ce se va n urma de
x:='Mama'; y: = 'Macara' ;
if x>y then write(x}
else if x<y then write(y)
else'writeln('Incorect'};
x = "Mama"; y = II Macara II i
if (strcmp(x,y}>O) coutx;
else
if (strcmp(x,y}==O)
cout"Incorect";
else couty;
5. Care dintre expresii sunt corecte? Toate variabilele care intervin
sunt de tip string / char *.
6. Ce se va la finalul de Toate
care intervin sunt de tip string / char *.
a} a := b+'c' ; a} strcat (x , "abi")';
b) a := pos (a,b); b} x = strcmp (x , y) ;
c} a .- a+b; c} strcat(strcpy(x,x+l} ,"abi"};
d} s := insert('red' ,s,2}; d} x = strstr(x,y}-x;
x = "albacazapada";
x[O]=x[O]-32;
p=strchr (x , 'a' ) ;
coutx[O]p[O]x[strlen(x}-l];
c} MamaIncorect d ) Incorect b) Mama
a :.=' albacazapada '
x :=upcase(a[l]} + a[l] +
a [length (a) ] ;
writeln(x} ;
a} Macara
a} aaa; b} AaA; c} Aaa; d} AM.
7. Considernd variabila x este de tip string n varianta Pascal, ce valoare va
avea variabila de caractere s Variabila
i unui tip ntreg.
8. Considernd variabila x este de tip string / char *, care dintre
variante n mod corect, primul caracter al este o
6
for i:=l to 6 do
x:=s[i]+x;
d} AracaM. c} AMAM;
a}
if (x[O]<'z')
cout"Corect";
b}
if (x[O]<'z' II x[O]>'a')
cout"Corect";
s = "MacarA";
for (i=O;i<strlen(s}/2;i++){
char x= s[i];
s[i]= s[strlen(s}-i-l];
s[strlen(s}-i-l] = x;}
b} Macara; a} MMMMMM;
a}
if (x[l]>='a'}OR(x[l]<='z') then
write('Corect'} ;
b}
if (x[l]>=a}AND(x[l]<=z) then
write('Corect') ;
s:=x;
s: = 'MacarA' ;
X
"= ' 1:.
. ,
c)
if upcase(x[l])=x[l] than
write('Corect') ;
d)
if (ord{x[1]=97)AND
(ord{x[1])<=122) than
write{ '.corect')
c)
if (! (x[0]>122&&x[0]<97))
cout"Corect";
d)
if {! (x[O]<'a' )&&(x[0]<=122))
cout"Corect";
9. Ce se va pe ecran n urma program?
var
a:array[l .. 3] of string[6];
bagin
a [1] : = 'vector' ;
a [2] : =' de' ;
a [3 L: =' siruri' ;
write(a[2] , , ');
write(a[2] [1],' ');
write{a[3] [4],' ');
write{a[l] [2]);
and.
#include<iostream.h>
#include<string.h>
char a[3] [10];
void main{) {
strcpy{a[O], "vector");
s trcpy (a [ 1] , "de" ) ;
strcpy{a[2], "siruri");
couta[l]' ';
couta[l] [0]' ';
couta[2] [3]' ';
couta[O] [1]; }
a) de d r e b) de e r d c) e e r d d) de d u e
10. Ce pe ecran n urma program?
11.
var a,b,c:string;
i:byte;
bagin
a:='mama.'; b:=.'cana';
c:=' casa';
L==poF,('a ' ,a) ;
whilai<>O do bagin
dE!lete (a 1) ;
delete{c,i,l) ;
i : =pos ( , a' ,a) ;
and;
insert{a,p,2);
writeln{a,' ',b,' ',c)
and.
#include<iostream.h>
#include<string.h>
char *a,*b,*c,k[256]; int i;
void main() {
a=ll mamall; b=lI cana " ; c="casa
ll
i
int i=strchr{a, 'a')-a;
whila (i>O) {
strcpy(a+i,a+i+1) ;
strcpy(c+i,c+i+1) ;
i=strchr(a, 'a')-a;
strncpy{k, b , 1) ;
strcat (k, a) ;
strcat{k,b+1);
couta' 'k' 'cendl;
d)
rom cana cs
c)
rom cn cs
b)
rom cmmana cs
a)
mcanam cana casa
a)var a:array [1 .. 9,1 .. 9]ofchar;
b) var a: char[9];
c)var a:array [O.. 9] of word;
d) var a: string[2O];
a) char a[9][9];
b) char a;
c) unsignad int a[10];
d) char* a;
Care dintre acestea a unei variabile care poate avea
valoarea 'dimineata' n Pascal, respectiv "dimineata" pentru C/C++?
7
12.
var x,y,z:string[200]i
1
char* Zi
char x[200],y[200];
expresiile corecte sintactic din lista
13. de program, n care x y sunt variabile din
tipul de caractere. Ce se va n urma lor?
a) x .- '12 ' + 'zile' ; a) z = z++;
b) z .- y + X b) streat (x, y) ; ,
e) y .- y + str(13, x) ; e) z (x!=y && y!=z) ;
d) x .- dee(z) ; d) x "12Azile";
e) x .- eopy('12Azile',4,2); e) z strehr("exereitii", ' ') ;
f) x .- insert('dimineata' ,y,3); f) z = strepy( 'A' ,"BBB");
x: =' dimineata' i
y:='min' + x[length(x)];
writeln(pos(y,x)) ;
d) dieta e) ta
x="dimineata"; y="min";
streat(y,x+strlen(x)-l) ;
p=strstr(y,x) ;
eout(p!=NULL) ? (p-y) : O;
b) 3 a) O
14.
var a:string[200]; i:byte; I char a[200]; unsigned int ii
Se de caractere a numai caractere distincte,
ultimele care sunt identice. care dintre de
este cu length() / strlen() ?
a) i:=l; a) i=O;
while a[i]<>a[i +1] do ine(i) ; while(a[i] != a[i+l]) i++;
writeln(i+l) ; eouti+2;
b) i:=Oi b) i=O;
while a[i]<>a[i +1] ine(i) ; while (a[i] != a[i+l]) i++;
writeln(i); eouti+l;
e) i:=l; e) i=O;
if ari] = a[i+l] then write(i) if (a[i]
--
a[i+l]) eouti;
d) i:=l; d) i=O;
if a[i]<>a[i+l] then ine(i) if (a[i] != a[i+l]) i++ ;
else write(i+l); else eouti ;
15.
var a, b: string[100] ;
I char *a, *b;
Ce se va n urma de
8
a := 'mama'; b := 'Mamaie'
if a>b then write(a)
else
if a=b then write('identiee')
else write(b);
a = "mama"; b="Mamaie";
if (stremp(a,bO) eouta;
else
if (stremp(a,b)==O)
eout"identiee";
else eoutb;
a) Mamaie;
b) mama;
c) identice;
d) de nu nici o
16.
var a: array[l. .9] of string[2O];
n, i, j :byte; x: string[20];
de program:
readln(n) ;
for i:=l to n do readln(a[i]);
for i:=l to n-l do
for j:=i+l to n do
if a[j]<a[i] then begin
x:=a[j]; a[j]:=a[i]; a[i]:=x;
end;
I
char a[20][20] ;unsigned int n , i, j;
char x[20];
einn;
for(i=O; i<n;i++) eina[i];
for
for (j=i+l; j<n;j++)
if (stremp(a[j],a[i])<O) {
strepy (x, a[j]); strepy (a[j], a[i]) ;
strepy(a[i],x); }
Ce prelucrare asupra elementelor vectorului a?
a) elementele tabloului a lungimea de caractere;
b) lexicografic elementele tabloului a;
c) elementele tabloului cu de caractere maxim din punct de vedere
lexicografic;
d) elementele tabloului cu de caractere de lungime
17. programul
var a,b: string;
i, x , y: integer;
begin
readln(a);readln(b) ;
i:=l;
x:=length(a); y:=length(b);
while (y-x+l>=i)
and(eopy(b,i,x)<>a) do ineei);
if i > y-x+l then i:=O;
writeln(i) ;
end.
#inelude <iostream.h>
#include <string.h>
char a[256],b[256]; int i,x,y;
void main () {
cina; cinb;
x=strlen(a); y=strlen(b);
for(i=O; y-x>=i &&
strncmp(b+i,a,x) !=O; i++);
if (i>y-x) i=-l;
coutiendl;
}
9
care dintre expresiile sunt echivalente cu de programul de
mai sus (la evaluarea expresiei se valoare cu cea prin
program).
a) eoneat(a,b)
b) length(a + b);
e) pos (a,b);
d) eopy (a, b , i) ;
a) strlen(a);
b) strlen (b) ;
e) strstr(b,a)-b;
d ) stremp (a, b) ;
18. Fie de
a este un de caractere 1 o de tip ntreg,
prelucrarea asupra caracterelor sale.
a) transformarea caracterelor de tip n majuscula
b) inserarea de caractere 32 fiecare caracter de tip
c) transformarea caracterelor de tip n minuscula
d) ordonarea a majusculelor n cadrul
e) caracterelor
For i :=1 to length(a) do
if a[i] in' ['A' .. 'Z'] then
a[i] :=ehr(ord(a[i])+32)
19. Fie program:
var s:string[10];
i:integer; x:ehar;
begin
s : = ' clasa' ;
for i:=l to length(s)- do'begiri
if(s[i]>s[i+1]) then begin
x:=:=s,[i] ;
s li] : =s [i+1] ;
s [i+1] : =x;
end;
write(s,' ');
end;
end.
for(i=O;i<strlen(a) ;i++)
if (a[i]>= 'A' && a[i]<=' Z' )
a[i] += 32';
#inelude<iostream.h>
#inelude<string.h>
char s[10] ;int i; char X;
void main()
r strepy(s, "clasa");
for(i=O;i<strlen(s)-l;i++) {
if(s[i]>s[i+l]) {
x=s[i]; s[i] [i+1];
s[i+l]=x;
eouts" ";
Ce se va pe ecran n urma acestui program?
a) clasa clasa calas calas
b) clasa calsa calas
c) clasa calsa calsa calas
d) clasa aclsa aclas acals
10
21. program. Ce trebuie pentru ca n
urma acestuia se mesajul Corect?
20. Se de caractere a b. care dintre
de valoarea b prin primei a
lui a n b. n n care a nu se n b, valoarea acestuia din
trebuie Variabila x este de tip integer pentru Pascal,
respectiv de tip int pentru C/C++.
a)
delete(b,pos(a,b),length(a));
b)
x: =pos (a, b) ;
b:=copy(b,l,x-l)+
copy(b,x+length(a) ,x)
c)
delete(a,pos(a,b),length(b)) ;
d)
x: =pos (a, b) ;
if x<>O then
b:=copy(b,l,x-l)+
copy(b,x+length(a) ,x);
var a,b:string;
begin
readln(a) ;
readln(b) ;
while(a[l]=b[l])and(a<>' ')and
(b<>" )do
begin
delete(a,l,l) ;
delete(b,l,l) ;
end;
if(a=' ')and(b=' ') then
wri te ( 'Corect' )
else
write('Incorect') ;
end.
a)
x=strstr(b,a)-b;
if (x>=O)
strcpy(b+x,b+x+strlen(a)) ;
b)
x=strstr(b,a)-b;
strcpy(b+x,b+x+strlen(a)-l) ;
c)
x=strstr(a,b)-a;
if (x>=O)
strcpy(a+x,a+x+strlen(b)) ;
d)
x=strstr(a,b)-a;
strcpy(a+x,a+x+strlen(b)) ;
#include<iostream.h>
#include<string.h>
char a[256],b[256];
void main()
{
cina;
cinb;
while(a[O]==b[O]&&a[O] !=O
&&b[O] ! =O) {
strcpy(a,a+l) ;
strcpy(b,b+l) ;
}
if (a[O]==O &&, b[O]==O)
cout"Corect";
else cout"Incorect";
a) mesajul Corect doar a b au lungimi egale;
b) mesajul Corect doar a b au valori identice;
c) mesajul Corect doar a b au lungimi nule;
d) mesajul Corect doar a b au valori identice de lungime 1;
11
22. Se program:
var ..a, b: string;
i:integer;
begin
b ' = " . . ,
for i:=l to 3 do begin
readln(a);
b:=b+eopy(a,i,length(a)-i+l) ;
end;
writeln(b)
end.
#inelude<iostream.h>
#inelude<string.h>
char a[256] ,b[256]; int i;
void main()
{ strepy(b,"");
for(i=O; i<3; i++){
eina; streat(b,a+i);
}
cout c-cb r
}
ce se va de la se vor introduce, n ordine, de
caractere: "copil"," masina", "bloc".
a) opilsinae b) emb e) eopilmasinbl d) eopilasinaoe
23. program:
var a,b:string;
begin
readln (a) ;
readln(b) ;
while (pos(a[l] ,b)<>O) do
begin
delete(b,pos(a[l],b),l);
delete(a,l,l);
end;
if (a=") and(b=' ') then
write( 'Da')
else
write( 'nu');
end.
#inelude<iostream.h>
#inelude<string.h>
char a[256],b[256],*p; int i;
void main()
{eina; einb;
while (strehr(b,a[O]) !=NULL &&
a[O] !=O) {
p=strehr(b,a[O]) ;
strepy(p,p+l);strepy(a,a+l);
}
if (a[O]==O && b[O]==O)
eout "da";
else eout"nu";
}
La acestuia se va mesajul Da numai
a) a b au valori egale;
b) a b au lungimi identice;
c) a b sunt formate din exact caractere, eventual n ordine.
d) fiecare caracter al a apare n b;
24. Fie a un de caractere (string / char *) x o Care dintre
de caractere identice .de la nceputul
a (pentru a fi va minimum 2 caractere):
a)x:=length(a);
whilea[1])=a[2])and
(length(al) do delete(a,l,l);
if length(a)<>x
delete(a,l,l);
12
a) x=strlen(a);
while (*a==*(a+l {a=a++;}
if (strlen(a) !=x)
strepy(a,a+l);
b) whilea[1])=a[2])and b) while (*a==*a+i)
(length(ai) do delete(a,i,i); a=a++;
}
e) while( (a[i]) <> a[2])and strepy(a,a+i) ;
(length(ai) do delete(a,i,i);
e) while (*a! =* (a+i) ) {a=a++;}
d) while( (a[i]) <> a[2])and strepy(a, a+i) ;
(length(ai) do delete(a,i,i);
delete(a,i,i); d) while (*a==*(a+i)) {a=a++;}
strepy(a, a+i) ;
25. Fie a un de caractere (string I char *) i, j variabile ntregi. Care dintre
permit mesajului "Da" numai
valoarea lui a este palindrom?
a)i:=i; j:=length(a);
while (a[i]<>a[j])and(i<j) do
begin dee(i); ine(j); end;
if (i>j) then write('DA')
else write ('NU') ;
b)i:=i; j:=length(a);
while (a[i]<>a[j])and(i<j) do
begin ine(i); dee(j); end;
if (i>=j) then write('DA')
else write('NU');
e) i:=i; j:=length(a);
while (a[i]=a[j])and(i<j) do
begin ine(i); dee(j); end;
if (i>=j) then write('DA')
else write('NU');
d)
i:=i; j:=length(a);
while (a[i]=a[j]) and (i<j) do
begin dee(i); ine(j); end;
if (i>=j) then write('DA')
else write ('NU') ;
a)i=O; j=strlen(a)-i;
while a[i]==a[j])&&(i<j))
{i--; j++;}
if(i>=j) eout"DA
ll;
else eout"NU
ll;
b)i=O; j=strlen(a)-i;
while a[i] !=a[j] )&&(i<j))
{ i++; j--; }
if(i<=j) eout"DA
ll;
else eout"NU
ll;
e)i=O; j=strlen(a)-i;
while a[i]==a[j])&&(i<j))
{ i++; j--; }
if (i>=j) eout"DAll;
else eout"NU
ll;
d)i=O; j=strlen(a)-i;
while a [i] ! =a [j ] ) && ( i <j ) )
{ i--; j++; }
if (i>=j) eout"DA
ll;
else eout"NU
ll;
26. variabila a este pentru a memora, ca de caractere, numele
unei discipline studiate n liceu (maximum 50 caractere), o declarare
a sa:
a) var a=string; a) char a;
b) var a: string[39]; b) char a[39];
e) var a: string[50]; e) char a[50];
d) var a: array[i .. 50] of string; d) char* a[20];
27. variabila a este pentru a memora numele celor 7 zile ale
cum trebuie ea
13
a)var a: string[7] [7] ; a)char a[7T;
b)var a: array[l .. 7] of string; b)char a[7][17T;
e)var a: string[7] ;
e)char a;
d)var a: array[l .. 7] of char;
d) char* * a[7];
28. de n care variabi la s este de
caractere, i k variabile ntregi, x o din tipul char iar ok este o
din tipul boolean(Pascal) - int(pentru C/C++):
Care dintre atribuirile conduc la valori pentru k, ca
cea n urma prezentate?
i := 1; ok := truei k := o;
while (i<=length(s))and ok do
begin
if s[i]=x then bElgin
k:=i; ok:=false;
end;
ine(i) ;
end;
a) k := eoneat(s,x)
b) k := length(s)
e) k := pos(x,s)
d) k := pos(s,x)
i = o;
ok=>l; k", o;
while(i<strlen(s) && ok){
if (s[i]==x)
{
k = i;
ok = o;
}i++;}
a) k streat(s,x)
b) k strlen(s)
e) k
d) k strehr(s,x)
1.1.2 Probleme rezolvate
1. Se un text n care unicul separator este ntre oricare
cuvinte pot exista mai separatori, se determine de cuvinte
din text.
Exemplu: Pentru textul' Am venit repede' se va 3.
Solutie
Algoritmul presupune parcurgerea caracter cu caracter a textului identificarea
de perechi de caractere care pot finalul unui cuvnt
(caracter diferit de urmat de un separator).
var s:string;
2 i,nr:integer;
3 begin
4 readln(s);
5 s : =s+' '; nr: =0;
6 for i:=l to length(s)-l do
7 if(s[i]<>" )and
8 (s[i+1]=' ')then ine(nr);
9 writeln (nr) ;
10 end.
11
14
#inelude <stdio.h>
#inelude <string.h>
char s[256] ;int nr,i;
void main() {
gets (s);
streat(s," a); nr=O;
for (i=0;i+1<strlen(s);i+i;)
if (s[i] !=' '&&s[i+1]==' ')
nr++;
printf ("%d\n" ,nr);
}
2. Se de la un vers al unei poezii o se realizeze un
program care de al silabeicitite n textul respectiv.
Exemplu: Pentru versul 'Un curcubeu multicolor' silaba 'cu' se va 2.
Solutie
Att versul citit ct silaba vor fi n variabile de tip de caractere vers
s. Algoritmul propus se pe a s, folosindu-ne de
pos() / strstr().
1 var vers,s:string;
2 nr,p,l:integer;
3 begin
4 readln(vers);
5 readln ( s) ;
6 nr:=O;
7 while pos(s,vers)<>O do begin
8 p :=pbs (s , vers) ;
9 l:=length(s);
10 delete(vers,p,l);
11 inc(nr); {nr:=nr+1}
12 end;
13 writeln(nr) ;
14 and.
#include <stdio.h>
#include <string.h>
char vers[256] ,s[256];
int nr,p,l;
void main() {
gets(vers); gets(s); nr=O;
while (strstr(vers,s) !=NULL) {
p=strstr(vers,s)-vers;
l=strlen(s);
?trcpy(vers+p,vers+p+l) ;
nr++;
}
printf ( "%d\n" ,nr) ;
}
3.' O se fiind palindrom ignornd dintre
minuscule majuscule ignornd separatorii, va fi cu
prin citirea literelor de la dreapta spre stnga. De exemplu, 'Ele fac
cafele' este palindrom, se realizeze un program care permite citirea
de la ea poate fi palindrom. Cuvintele vor fi
separate n cadrul prin (singurul separator prezent).
Solutie:
Algoritmul propus trei etape:
dintre cuvinte;
transformarea n majuscule a litere;
cuvntul astfel se este palindrom.
1 var s:string; ok:boolean;
2 i,p:integer;
'3 bagin
4 readln (s) ;
5 whila pos(' ',s)<>O do begin
6 p : =pos (' ", s ) ;
7 delete (s ,p, 1) ;
8 and;
9 for i:=1 to length(s) do
10 s[i] :=upcase(s[i]);
11 ok:=true;
#include <string.h>
#include <stdio.h>
char s[256]; int i,p,ok;
void main() {
gets (s);
whila (strstr(s," ") !=NULL)
p=strstr(s," ")-s;
strcpy(s+p,s+p+1) ;}
for (i=O;i<strlen(s) ;i++)
if (s [i] >=' a' &&s [i] <= ' z ' )
s [i] +=' A' - 'a' ;
15
12 for i:=l to length(s)div 2 do
13 if s[i]<>s[length(s)-i+1]
14 then
15 ok:=false;
15 writeln(ok);
16 end.
17
ok=l;
for(i=0;i<strlen(s)/2;i++)
if (s li] !=s [strlen(s) -i-l])
ok=O;
printf("%d\n",ok) ;
}
4. Se de la un de caractere care un n baza 16.
se realizeze un program care permite conversia n baza IOa citit. n
n care caractere nepermise se va mesajul "Imposibil".
Exemplu: Pentru hexazecimal AlB se va 2587.
Solutie
singurele cifre permise la scrierea unui ntr-o baza b sunt
O..b-l, resturilor care se pot la cu b. baza
este mai mare ca 10, atunci fiecare din resturile vor fi codificate n ordine
cu literele A,B,C, n baza 16 resturile mai mari ca 9 sunt codificate astfel:
'A'=lO; 'B'=11 ; 'C'=12; 'D'=13 ; 'E'=14; 'F'=15.
De exemplu, 2*16
2+10*161+12*16=
684(10);
Pentru a evita calcularea puterii lui 16 din cadrul termen putem rescrie
expresia de mai sus sub forma: 2*16
2
+ 10*16
1
+ 12*16 = ((0*16 + 2)*16 +
10)*16 + 12.
n cazul n care cifrele sunt exprimate prin litere se va realiza o ntre
codul ASCII al pe care l n baza 16:
Caracter Codul ASCII Restul pe care l n
baza 16
'A' 65 10 =65-55
'B' 66 11=66-55
'C' 67 12=67-55
'D' 68 13=68-55
'E' 69 14=69-55
'F' 70 15=70-55
ord(Litera)-55
1 var s: string;
2 i,nr,c,er:integer;
3 begin
4 readln(s); nr:=O;
for i:=l to length(s) do
6 begin
7 if s[i]<='9' then
8 val(s[i],c,er)
9 eise
10 c:=or9(upcase(s[i]-55;
11 nr:=nr*16 + c;
12 end;
13 writeln(nr) ;
14 end.
16
#include <string.h>
#include <stdio.h>
ehar s[256];
int i,nr,c;
void main() (
gets(s); nr=O;
for (i=O;i<strlen(s);i++) (
if (s[i]<='9') c=s[i]-'O';
Elise c=s[i]-55;
nr=nr*16+c;
}
printf ("%d\n" ,nr);
}
5. Se de la un vers al unei poezii. se realizeze un program care
de cuvinte din text. Cuvintele sunt separate ntre ele prin
caracterele: (, -), virgula (,), punctul (.) sau punct virgula (;).
Exemplu: Pentru 'Vremea trece... vremea vine,' se va valoarea 4.
Solutie
n cadrul algoritmul pe care l vom cte cuvinte sunt n vers
folosindu-ne de
O n cadrul versului nceputul unui nou cuvnt tipul
caracterului de pe este iar cel precedent este un separator.
Pentru a indentifica mai tipul unui caracter vom folosi o de
caractere a valoare o va reprezenta de separatori. " .i ' un
caracter al versului nu se printre caracterele acestuia atunci el este de tip
n C++ se poate folosi functia strtok().
var s,sep:string;
x,y,nr,i:integer;
begin
readln(s) ;
nr:=O;
1
2
3
4
5
6 sep: =I ,. i I i
7 s:='. I + s + 1. li
8 for i:=2 to length(s) do
9 begin
10 x:=pos(s[i] ,sep);
11 y:=pos(s[i-l],sep);
12 if (x=O)and(y<>O) then
13 nr:=nr+l;
14 end;
15 writeln(nr) ;
16 end.
#include <string.h>
#include <stdio.h>
char s[256] ,*p;
int nr;
void main()
{
gets (s) ;
nr=O;
p=strtok(s," ,.;");
while (p!=NULL) {
nr++;
p=strtok(NULL," ,.;");
}
printf("%d\n",nr);
}
6. Se cuvinte formate din literele mari mici ale alfabetului englez.
ele sunt anagrame.
de caractere sunt anagrame, unul dintre ele este format din
caracterele celuilalt, eventual ntr-o ordine. Exemplu: 'are', 'era'.
Solutie:
Algoritmul propus succesiv prima a primului cuvnt citit (x), n cel de
al doilea (y). n cazul n care este ea va fi din ambele cuvinte.
Procedeul cnd fie litera nu este fie cnd lungimea lui x este
0, caz n care cuvintele sunt anagrame.
O ar consta n ordonarea caracterelor ambelor cuvinte compararea
acestora la final.
17
1 var x,y:string;
begin
readln(x) ;
4 readln (y) ;
5 iflength(x)=length(y) then
6 begin
7 while pos(x[l],y)<>O do
8 begin
9 delete(y,pos(x[l] ,y) ,1);
10 delete(x,l,l);
11 end;
if (x=' ')and(y=' ')then
write('Da' )
14 else
15 write('Nu')
16 end
17 else write('Nu')
18 end.
#inc1ude <iostream.h>
#include <string.h>
char x[21],y[21] ,*p;
void main(){
cinxy;
if (strlen(x)==strlen(y)) {
while (strchr(y,x[O]) !=NULL
&& x[O]!=O){
p=strchr(y,x[O]
strcpy(p,p+1) ;
strcpy(x,x+1) ;
}
if (x[O]==O && y[O]==O)
cout"Da" ;
else cout"Nu";
}
else cout"Nu";
7. De la se un text codificat regula n
caracter este scris de consecutive ale acestuia. un
program care textul. de consecutive ale unui caracter
este strict mai mic dect 10.
Exemplu: Pentru codificarea 'lclol p3i' se va textul 'copiii'
Solutie
n de tipul caracter se decide trebuie
caracterului curent sau actualizarea cifrei care va reprezenta de
scrieri ale caracterului
Exemplu: Pentru ,,25AB32042Xs23"se va 32042.
8. Se de la un de caractere. n cadrul acestuia o
de lungime care poate fi o de tip ntreg.
#include <stdio.h>
#include <string.h>
char s[256];
int i,j,cifra;
void main() {
gets (s);
for (i=O;i<strlen(s);i++)
if (s[i]>='0'&&s[i]<='9')
cifra=s li] -' O' ;
else
for (j=O;j<cifra;j++)
printf ("%c", s [i]);
1 var s: string;
2 i,j,er,cifra:integer;
3 begin
4 readln(s) ;
5 for i:=l to length(s) do
begin
if s[i] in ['O' .. '9'] then
va1(s[i],cifra,er)
else
for j:=l to cifra do
write (s li] ) ;
end;
13 end.
18
Solutie
Algoritmul propus o parcurgere a caracterelor din care
este de lungime ce poate fi o de tip numeric.
Se va n final, de nceput (poz) a n cadrul
lungimea acesteia(max).
var s,c:string;
i,lung,max,poz,er,x:integer;
begin
readln(s); lung:=O;
1
2
3
4
5 s: =s+' ';
6 for i:=l to length{s) do
7 begin
8 val(s[i],x,er);
9 if (er=O) then inc(lung)
10 else begin
11 if max<lung then begin
12 max:=lung;
13 poz:=i-lung;
14 end;
15 lung:=O;
16 end;
17 end;
18 for i: =poz topoz+max-1 do
19 write(s[i]);
20 end.
#include <stdio.h>
#include <string.h>
char s[256];
int i,lung,max,poz;
void main() {
gets(s); strcat(s," ");
lung=O;
for (i=O;i<strlen(s);i++)
if (s[i]>='O'&&s.[i]<='9')
lung++;
else {
if (max<lung)
max=lung;
poz=i-lung;
}
lung=O;
}
for (i=poz;i<poz+max;i++)
printf ("%c", s [i]);
9. Se ca Find-Replace fie asupra unui text care nu
mai mult de 250 de caractere. n nlocuirea tuturor
unui si cu un alt s2. n cazul de cele se
a fi diferite de lungimi egale. un program care

Exemplu: Considernd textul "care caracatita", "ca" se va nlocui cu
"ta" atunci textul va fi "tare taratatita".
Solutie
Programul realizat pentru varianta Pascal apeluri la subprogramele
predefinite pentru tipul de caractere. Sursa CIC++ un nou de
caractere S n care si a fost nlocuit cu s2.
1 var
2 s,sl,s2:string;
3 c:integer;
4
5 begin
6 readln (s ) ;
7 readln{sl);
8 readln(s2);
9 c:=pos{sl,s);
#include <stdio.h>
#include <string.h>
char 8[256],s2[256];
int u,i,p;
char s[56],sl[56];
void main() {
gets (s) ;
gets(sl) ;
gets (s2) ;
19
Solutie
Algoritmul pentru oricare cuvinte sunt anagrame. Se
elementul pentru care s-a determinat maxim de anagrame.
10. Se un de n cuvinte. cu maxim de
cuvinte care sunt anagrame ntre ele cte Se va cardinalul
un element al acesteia, considerat reprezentantul ei.
Exemplu: pentru n=6 cuvintele 'arc', 'rac', 'voi', 'car', 'armata', 'tamara' se va
arc 3.
10 while c<>O do
11 begin
12 delete(s,c,length(sl;
13 insert(s2,s,c);
14 c:=pos(sl,s);
15 end;
16 writeln(s);
17 end.
18
19
20
21
22
1 var a:array[1 .. 100]of
2 string[20];
3 n,i,nr,j,max:integer;
4 cuv,x,y:string;
5 begin
6 readln(n); max:=O;
for i:=l to n do
8 readln(a[i]);
9 for i:=l to n-l do begin
10 nr:=l;
11 for j:=i+l to n do begin
12 y:=a[j]; x:=a[i];
13 if length(x)=length(y) then
14 begin
15 while pos(x[l],y)<>O do
16 begin
17 delete(y,pos(x[l],y),l);
18 delete(x,l,l);
19 end;
20 if (x=") and(y=' ') then
21 inc (nr)
22 end;
23 if max<nr then begin
24 max:=nr; cuv:=a[i];
25 end;
26 end;
27 end;
28 writeln(cuv,' ',max);
29 end.
20
do { char* pt=strstr(s,sl);
ii (!pt) {
for(i=u;i<strlen(s) ;i++)
strncat(S,s+i,l); break;
} p=pt-s;
for(i=u;i<p;i++)S[i]=s[i];
for(i=p;i<p+strlen(sl);i++)
s [il =' !';
for(i=p;i<p+strlen(s2) ;i++)
strncat(S,s2+i-p,1) ;
u=p+strlen(sl);} while (1);
puts (S);
}
#include <iostream.h>
#include <string.h>
char a[101] [21] ,x[21] ,y[21];
char *p ,cuv[21];
int nr,n,i,j,k,max,poz;
void main() {
cinn; max=O;
for (i=O;i<n;i++) cina[i];
for (i=O;i<n-l;i++) {
for (nr=l, j=i+l;j<n;j++){
strcpy(x,a[i]) ;
strcpy(y,a[j]);
if (strlen(x)==strlen(y {
while(strchr(y,x[O]) !=NULL
&& x[O] ! =0) {
p=strchr(y,x[O]);
strcpy (p, p+l) ;
strcpy(x,x+l);
}
if (x[O]==O && y[O]==O)
nr++;
}
if (max<nr){
max=nr;strcpy(cuv,a[i]);
}
}
coutcuv" "max;
out.txt
136.00
3.00
46.50
11. Se un text in.txt ce numere ntregi dispuse pe mai multe
linii. Orice caracter ce nu un caracter numeric este considerat separator.
un program care un out.txt ce pe fiecare linie media
a numerelor situate pe linie n in.txt. Media va
fi cu zecimale. Pe fiecare linie a de intrare se maximum
200 de caractere.
Exemplu: in.txt
2 .. 3a 403bx
2 .. 2 A, .. 5
1.92
Solutie:
n problema de separatorii nu sunt prin albe.
impune folosirea la citire a unei variabile de tip de caractere.
Pentru determinarea mediei se va parcurge citit caracter cu caracter, relizndu-
se conversia de caractere numerice date de tip numeric(ntreg).
1 var f,g:text; x,e:string; #inelude <stdio.h>
2 i,v,s,n,er:integer; #inelude <string.h>
3 begin FILE *f,*g; char x[256];
4 assign(f, 'in.txt'); reset(f); int i,n;
5 assign (g, 'out. txt' ) ; rewrite (g) ; float c , s;
6 while not eof ( f) do begin void main ( )
7 s:=O; n:=O; e:="; f=fopen("in.txt" , "r");
8 readln (f, x) ; g=fopen (" out. txt", "w");
9 x:=x+'.'; while (!feof(f)) {
10 for i:=l to length(x) do s=O; n=O; e=O;
11 if xli] in ['O' .. '9'] then if (lfgets(x,256,f)) break;
12 e:=e+x[i] streat(x,".");
13 else for (i=O;i<strlen(x);i++)
14 if e<>" then begin if (x[i]>='0'&&x[i]<='9')
15 val(e,v,er); e:="; e=e*10+x[i]-'0';
16 s:=s+v; else if (e) {
17 ine (n) ; s+=e; n++; e=O;
18 end; }
19 writeln(g,s/n:0:2); fprintf(g, "%.2f\n" ,sin);
20 end; }
21 elose(f); elose(g); felose(f); felose(g);
}
12. Se un cuvnt din maximum 50 de caractere format numai din literele
alfabetului englezesc. Se cere inserarea minusculei minime din punct de vedere
lexicografic cuvntului), ntre oricare litere identice aflate pe
La inserare nu se va face ntre majuscule minuscule.
nu minuscule n cuvnt atunci acesta nu va suferi nici o modificare.
Exemplu:
Pentru cuvntul "inNorat" minuscula este'a' se va "inaNorat".
Pentru de caractere "boOlullon" minuscula este 'b' se va
.bobolutbton",
21
S2.1YJk
de inserare se simultan cu de parcurgere a de
caractere. La inserarea unui nou caracter ntre litere identice, indicele curent
se cu
13. text .Puxt" pe mai multe linii un algoritm reprezentat n
pseudocod. singurele cuvinte cheie ce se n sunt: intreg,
daca, atunci, altfel, citeste, scrie, stop. se determine de variabile
folosite n algoritm identificatorii acestora. Toate caracterele care intervin n
au coduri ASCII asociate. Liniile din se cu caracterul punct

Exemplu: Pentru "daca a>b atunci xxec altfel dea--b stop;" se va
5
a b xx c d
1 var
2 s:string; m:char; i:byte;
3 begin
4 readln(s);
5 m:=chr(127);
6 for i:=l to length(s)do
7 if (s[i]<m)
8 and(s[i]<>upcase(s[i]))
9 then m:=s[i];
10 i:=l;
11 if upcase(m)<>m then begin
12 whilei<length(s)do
13 ifupcase(s[i])=
14 upcase(s[i+l])
15 then begin
16 insert(m,s,i+l);
17 inc(i,2);
18 end
19 else
20 inc (i) ;
21 end;
22 writeln(s);
23 end.
#include <string.h>
#include <stdio.h>
char s[256],m,cl,c2; int i;
void main() {
gets(s); m=127;
for(i=O;i<strlen(s) ;i++) {
cl=s[i]>='A'&&s[i]<='Z'?
s[i]+'a'-'A' :s[i];
if (m>cl) m=cl;
}
for (i=O;i+l<strlen(s);i++) {
cl=s li] >=' A.' &&s li] <=' Z'?
s[i]+'a'-'Z' :s[i];
c2=s[i+l]>='A'&&s[i+l]<='Z'?
s[i+l]+'a'-'A' :s[i+l];
if (cl==c2) {
memmove(s+i+l,s+i,
strlen(s)-i) ;
s[++i]=m;
}
}
puts(s);
}
Solutie
Tabloul unidimensional v va memora toate variabilele identificate. va fi
parcurs caracter cu caracter, formndu-se de fiecare o ce poate
reprezenta un cuvnt cheie sau identificatorul unei variabile. acesta nu
un cuvnt cheie, atunci este salvat n vectorul v, numai n cazul n care
nu a fost deja memorat.
1 type
sir=array[1 .. 7] of string[lO];
const a : sir = ( 'intreg' ,
'citeste', 'scrie', 'daca',
5 'atunci', 'altfel', 'stop');
6 var f:text; i,n,m:integer;
22
#include <string.h>
#include <stdio.h>
const char a[8] [ll]={
"intreg", llciteste
ll,
llscrie" ,
"daca", "atunci", "altfel",
"stop"};
7 s:string; x:char; ok:boolean;
8 v:array[l. .50]of string[10];
9 begin
10 assign(f, 'p.txt'); reset(f);
11 m:=O;
12 while not eof(f) do begin
13 s: =' ';
14 while not eoln(f) do begin
15 read(f,x);
16 i f x in [' a' .. ' z '] then
17 s:=s+x
18 else if s<>" then begin
19 ok:=true;
20 for i:=l to 7 do
21 if a[i]=s then ok:=false;
22 for i:=l to m do
23 if s=v[i] then ok:=false;
24 if ok then begin
25 inc(m); v[m] :=s;
26 end; s:=";
27 end; end; readln(f); end;
28 writeln(m);
29 for i:=l to m do
30 wr i t e (v[i],' ');
31 end.
int i,j,m,ok; FILE *f;
char s [256] , x [ 256] , v [ 51] [11] ;
void main() {
f=fopen ("p. txt", "r") ;
for (m=O; !feof(f);) {
fgets (x, 256, f) ;
strcat (x, n ");
for(i=O;i<strlen(x);i++)
if(x[i]>='a'&&x[i]<='z')
strncat(s,x+i,l) ;
else if (strlen(s))
ok=l;
for(j=O;j<7;j++)
if(!strcmp(a[j] ,s))ok=O;
for(j=O;j<m;j++)
if(!strcmp(v[j],s))ok=O;
if (ok) strcpy(v[m++] ,s);
memset(s,O,sizeof(s));
}
}
printf("%d\n",m) ;
for(i=O;i<m;i++)
printf("%s ",v[i]);
14. Se un de n cuvinte. Se lor pe respectnd

pe fiecare se n ordine cte un cuvnt, de la primul la
ultimul;
pe ultima linie se primele litere ale cuvnt;
pe prima linie se ultimele litere ale celor mai lungi cuvinte.
Exemplu: Pentru de 4 cuvinte: 'eu', 'masa', 'noi', 'vine' se va
a e
sin
u a o i
e m n v
Se ca auxiliar un vector h n care este lungimea cuvnt.
de linii pe care se va face este cu elementul maxim din h.
Pentru fiecare cuvnt, n cadrul unei linii, se poate fie caracterul
lungimea acestuia este mai dect valoarea variabilei mx(care
literei ce a fi fie litera de pe mx.
1
2
3
4
type
sir=array[l .. 99] of string;
var a:sir;
l,i,n,mx:integer;
#include <string.h>
#include <stdio.h>
int n,i,max,h[100];
char a[100] [256];
23
Solutie
Algoritmul parcurge fiecare din lungimea maxima a
care poate ncepe cu caracterul respectiv. Variabila x

15. Se de la un de maximum 255 litere mici ale alfabetului
englez. se realizeze un program care cea mai de
caractere care se de minimum 2 ori n cadrul
Exemplu: Pentru de caractere:" masectrsecsacrrrr" se va "sec".
5 h:array[l .. 99]of byte;
6 begin
7 read1n(n) ;mx:=O;
8 for i:=l to n do begin
9 read1n(a[i]);
10 h[i] :=length(a[i]);
11 if h[i]>mx then mx:=h[i]
12 end;
13 for 1:=1 to mx do begin
14 for i:=l to n do
15 if h[i]=mx then begin
16 write(a[i] [h[i]]);
17 dec(h[i])
18 end
19 else write(' ');
20 dec (mx) ;
21 write1n;
22 end;
23 end.
1 var l,max,i:integer;
2 s,r,x,y:string;
3 begin
4 read1n(s); max:=O;
5 for i:=l to 1ength(s)-1 do
6 begin
7 1:=0; x:=";
8 repeat
9 inc(l); y:=s;
10 x:=x+s[i+1];
11 de1ete(y,i,length(x;
12 until (pos(x,y)=O)or
13 (l+i>length(s;
14 if 1ength(x)-1>max then begin
15 max:=length(x)-l;
16 r:=copy(x,l,max);
17 end;
18 end;
19 writeln(r);
20 end.
21
24
void main() {
scanf("%d",&n); max=O;
for(i=O;i<n;i++){
scanf ("%s" ,a[i]);
h[i]=strlen(a[i])-l;
if (max<h[i]) max=h[i];
}
for(;max>=O;max--){
for (i=O;i<n;i++)
if (h[i]==max){
printf("%c",a[i] [h[i]]);
h[i]--;
}
else printf(" ");
printf ( " vn" ) ;
}
}
#inc1ude <string.h>
#inc1ude <stdio.h>
int 1,max,i; char
s[256] ,r[256] ,x[256],y[256];
void main() {
gets (s l . max=O;
for(i=0;i+1<str1en(s);i++) {
1=0; memset(x,O,sizeof(x;
do {
strncat(x,s+i+1,1) ;1++;
strcpy(y,s);
strcpy(y+i,y+i+str1en(x;
} while (i+1<str1en(s) &&
strstr(y,x ;
if (max<str1en(x)-1) {
max=str1en(x)-1;
strncpy(r,x,max);
}
}
puts (r);
}
1.1.3 Probleme propuse
1. Se un text de maximum 255 de caractere. un program care

a) de al unei litere n text. Litera va fi de la
b) Cte vocale apar n textul citit.
c) de al unei silabe n text. Silaba va fi de la
Exemplu:
Pentru litera 'a', silaba "re" textul:
.Jna are multe mere"
se va
a) 2
b) 8
c) 2
2. Se un cuvnt format din litere mici mari ale alfabetului englez.
un program care permite tuturor primei litere n
cadrul cuvntului respectiv.
Exemplu: Pentru cuvntul 'mamaie' se va 'aaie'.
3. Se un cuvnt format din literele mici mari ale alfabetului englez.
se scrie un program care cuvintele din cuvntul prin
eliminarea a primului ultimului caracter al
Exemplu: Pentru cuvntul 'Deosebit' se va
eosebi
oseb
se
4. Se o matrice de dimensiune nxm cu elemente de tip de caractere.
un program care de caractere de lungime de pe fiecare
linie a matricei.
5. se creeze un program care literele mici ale unui cuvnt n litere
mari literele mari n litere mici.
Exemplu: Pentru cuvntul 'MiorItIC' se va 'mIORiTic'.
6. Se un de n cuvinte. se determine cuvntul de lungime
care se poate forma prin concatenarea a dintre cuvintele citite.
Exemplu: Pentru n=5 de cuvinte: 'mama', 'arc', 'conduce', 'paine', 'vine'
se va 'conducepaine' sau 'paineconduce'.
7. Se un de n cuvinte. se determine cuvntul cel mai mic n ordine
prin concatenarea a dintre cuvintele citite.
Exemplu: Pentru n=5 'mama', 'arc', 'conduce', 'paine', 'vine' se va
'arcconduce' .
25
8. un text de maximum 255 de caractere. sunt delimitate
prin caracterele punct(.) sau prin semnul un program care
fiecare pe o linie, fiecare cuvnt ncepnd cu o

Exemplu: Pentru textul 'Fie A un punct fix.Presupunem B punct mobil.' se va

Fie A Un Punct Fix.
Presupunem B Punct Mobil.
9. Se o cu n (n<lOO) prenume ale elevilor dintr-o Prenumele
unei fete este recunoscut faptului fie are ulima 'a', fie este 'Carmen'
sau 'Alice'. se creeze un program care fetelor din cel
mai mare prenume n sens lexicografic ale litere vor fi transformate n
majuscule.
Exemplu: n=5 lista 'Ana', 'Alice', 'Mihai', 'Maria', 'Ion', se va '3 MlliAI'.
10. Se 2 cuvinte ce numai litere mici. ultima
a unui cuvnt este care ncepe cu ultima lui aceste
cuvinte au ultima un cuvnt nu vocale,
atunci ultima este ntregul cuvnt.
Exemplu: Pentru cuvintele 'armat' 'verificat' se va mesajul 'Rimeaza'.
11. De la se un text codificat regula n
caracter este scris un ce de consecutive
al acestuia. un program care textul. ce apare n
unui caracter va fi mai mic sau cel mult egal cu 20.
Exemplu: Pentru 'lGllolL' se va
12. Se un text n care este unicul separator. un.program
care numerele ce apar n text, prin cte un
Exemplu: Pentru textul 'Ana are 7 mere si 223 de pere' se va '7223'.
13. Se de la un de caractere. un program care
cea mai de cifre din
Exemplu: Pentru de caractere 'a23Bw001234mcv34' se va
14. Se ca Find-Replace fie asupra unui text care nu
mai mult de 255 de caractere. n nlocuirea tuturor
unui sI cu un alt s2. un program care
sI s2 nu au lungime.
Exemplu: Pentru textul 'are mere si pere' sI='re' s2='rare' se va 'arare
merare si perare'.
26
15. Se un de n cuvinte. un program care toate
anagramele primului cuvnt care se n
Exemplu: pentru n==5, cuvintele 'arc', 'rac', 'eu', 'tu, 'car' se va 'rac' 'car'
16. Se o care are maximum 255 de caractere. Orice caracter
diferit de este considerat separator. un program care fiecare
cuvnt pe o linie a standard.
Exemplu: "Am venit! ..." se va
Am
venit
17. Se un text de maximum 255 de caractere. un program care
cea mai de litere care apar n ordine
Exemplu:' AMC WCDRVAS' se va CDRV'.
18. Se un text de maximum 255 de caractere. un program care
cea mai de litere care un palindrom.
Exemplu:' AM tCOjOCn wqaaqd' se va COjOC'.
19. Se un text de maximum 255 de caractere litere nuci sau
un program care rescrie textul astfel nct cuvintele ordonate
alfabetic.
Exemplu: Pentru de caractere 'ieri am venit devreme' se va
'am devreme ieri venit'.
20. Se un text de maximum 255 de caractere. un program care
literele cuvnt:
Exemplu: Pentru de caractere' Am venit!...spune el' se
'mA tinev !...enups le'.
21. Fie un cu maximum 100 de caractere alfanumerice. se toate
formate din caractere care pot reprezenta un
natural de cifre, separate prin cte un singur
Exemplu: Pentru 'w234b5br6779' se va '23 346777 79'.
22. De la se un de maximum 10 caractere. un program
care acest poate reprezenta un real exprimat n forma
cu 3 zecimale exacte.
Exemplu: Pentru ,,31.0.234" se va mesajul 'NU'.
23. un program care vocalelor dintr-o de tip de
caractere cu lor.
Exemplu: Pentru de caractere: "moale" se va '3 mI'.
27
!!!!!!!!!!!
se va
ca
cata
cari ta
carati ta
/
24. Se o care are maximum 250 de caractere. Ea cuprinde
cuvinte formate din literele alfabetului englezesc. Cuvintele sunt prin
unul sau mai separatori. Orice caracter care nu este va fi considerat
separator. un program ce va pe ecran fiecare cuvnt din pe
cte o linie. Cuvintele vor avea prima
Exemplu: Pentru
'-Ai venit? intreba Alina' se va pe ecran:
Ai
Venit
Intreba
Alina
25. Se de la intrarea standard un de maximum 200 de caractere
reprezentnd o Cuvintele sunt de litere mici sau mari ale
alfabetului englezesc. un program care ce
cuvintele au fost ordonate lexicografic. fiecare cuvnt vor fi
separatorii n cuvntul cu de ordine
respectiv.
Exemplu: 'Pentru textul "Ce spui ..... ?, a intrebat el.' se va
'Ce a..... ?, el intrebat spui'.
26. Se un de cel mult 100 de caractere, citit de pe prima linie a
in.txt. se toate de caractere de lungime 2*k
prin concatenarea prefixelor cu sufixele de lungime ale acestui
Valoarea lui k se de la
Exemplu:
Pentru k=4
in.txt
caracatita
27. in.txt un text dispus pe mai multe linii. Orice caracter care nu
o litera a alfabetului englezesc se separator. de
caractere ale unei linii nu 200. un program care
de ale unui cuvnt, preluat de la n textul din
Exemplu: Pentru cuvntul "venit" se va 3
in.txt
Am venit ... acasa!
EA a,! venit!"
el a venit acum**?!
28. virus.txt a fost deteriorat, iar valorile naturale care
erau separate n cadrul liniilor prin cte un singur au acum ca separatori
orice caracter ce nu o un program care
sum.txt n care pe fiecare linie se suma numerelor aflate n virus.txt.
Exemplu: Pentru virus.txt sum.txt va
w23, ,mmrn230...20e 273
fsdj.4.sal .. 45, ,sk56ddd90z 195
28
!!!!!!!!!!!!
29. Se o de maximum 50 de caractere, de la
se realizeze un program care eliminarea tuturor cuvintelor
de lungime p.
Exemplu: Pentru p=3 "Noi am gandit la fel ca voi ... !" se va
"am gandit la ca ... !"
30. Fie un cuvnt de maximum 50 de caractere litere mici ale alfabetului englez.
se toate cuvintele distincte prin eliminarea unor de p
litere aflate pe consecutive n cuvntul Cuvintele vor fi
prin cte un
Exemplu: Pentru cuvntul "mamaie" p=2 se va 'maie mama mame'.
31. Se citesc de la cuvinte formate doar din literele minuscule ale
alfabetului englezesc. Se cere realizarea unui program care
- literelelor comune celor
- literelelor care se n unul din cele cuvinte (reuniunea);
- literelelor care se n primul cuvnt citit mi apar n al doilea.
Exemplu: Pentru cuvntul "mamaie" cuvntul "macara" se va
{m,a}
{m.a.i.e.r,c}
{i,e}
32. in.txt un text, fiecare fiind pe o linie.
pe ecran de lungime eliminarea tuturor
de caractere consecutive, ambele vocale.
Exemplu: Pentru
Mama_Are_Mere
Maine_este_o_noua_zi
se va
Mne_este_o_na_zi
33. Se de la o de maximum 200 de caractere. pe
ecran, pe mai multe linii, astfel: pe ultima linie va fi
ultimul caracter al pe penultima, ultime
caractere(antepenultimul penultimul), Pe prima linie se vor primele
n caractere ale unde n este mai mic sau egal cu de linii pe care
s-a
Exemplu: Pentru
abcdefghijkl
se va
ab
cdef
ghi
jk
1
29
30
38. o de e-mail este doar din litere mici ale
alfabetului englez, din caracterul '.' caracterul '@' care apare o
Caracterele acestuia nu pot fi puncte '.'. Se o de e-mail
reguli:
34.
a,bI ba I bba I bbaba I bbabbaba I bbabbababbaba . . .. .
un program care determine care este cel de-al n-lea termen al
Valoarea lui n este strict mai dect 20.
Exemplu: Pentru n=6 se va 'bbabbaba'.
se va
venit acasa roaine pleci
1 e i r
o n c t
g a
i
e
35. Se un de n cuvinte reprezentnd numele disciplinelor din orarul
zilei ale unui elev. un program care permite orarului
pe standard, astfel nct materiile fie scrise pe coloane, n ordine

Exemplu: Pentru n=4 disciplinele "muzica", "desen", "sport", "biologie", se va
sub forma:
b d ro s
i eu p
o s z o
37. n in.txt se dispuse pe mai multe linii despre ora de
plecare a trenurilor lor Momentul din este
exprimat prin 5caractere, primele reprezentnd ora, iar ultimele
reprezentnd. minutele(hh:mm). n continuare, n cadrul .liniei se numele
.. pe cte o linie a standard, lista n ordinea
a momentului Pe fiecare linie se va numele.
ora separate printr-un Ora de plecare va fi n minute.
Exemplu: in.txt se va
10:23Cluj Iasi 300
15:04Arad Cluj 623
05:00Iasi Arad 904
36. Se un text ce maximum 100 de cuvinte, fiecare cuvnt-fiind
format din cel mult 50 de litere ale alfabetului englez. Orice alt caracter este
considerat separator. Textul este dispus pe mai multe linii n in.txt. se
pe o linie a standard, cuvintele de lungime din text,
separate prin cte un
Exemplu: in.txt
Am venit... acasa
roaine , plec!
Tu vrei sa pleci****?
se va
sco.at.m@atam.icodm
sco.at.m@atam.im
sco.at.mat@am.icodm
sco.at.mat@am.im
caracterul '@' este nlocuit prin at' numai n cazul n care nu este
precedat sau urmat de caracterul punct.
de caractere 'cod' poate fi oriunde n dar nu mai
mult de o
Dndu-se o pe cte o linie adresele de e-mail din care ar fi
putut proveni.
Exemplu:
Pentru adresa:
sco.at.matatam.icodm
39. O este folosind parantezele rotunde astfel: "ababab" va
fi scris simplificat ,,(ab)3" iar "axzyxzyw" va fi scris "a(xzy)2w". Formula
de la intrarea standard. nu sunt prezente perechi de
paranteze incluse una n alta,
Exemplu: Pentru s(ad)3f(ser)2, se va "sadadadfserser".
40. Se de la intrarea standard, un de maximum 200 de caractere.
un program care cea mai de caractereordonate
lexicografic. n n care mai multe astfel de se vor
toate, fiecare pe cte o linie a standard.
Exemplu: Pentru textul" ABCADEMIA" se va
ABC
AED
41. Se de la intrarea standard un de maximum 200 de caractere.
un program care cea mai de caractere cu proprietate
n n care mai multe astfel de se vor
toate, fiecare pe cte o linie a standard.
Exemplu: Pentru textul .Acojoctar eabbbar" se va
cojoc
abbba
42. Se o expresie ce numai operatorii {+,*}. Operanzii
sunt prin variabile ai identificatori sunt printr-o
sau prin numere naturale. un program care expresia
este sintactic. .
Exemplu: Pentru expresia 23*a+ba*+3 se va "Incorect".
Pentru expresia 23*a+b*3 se va "Corect".
43. Se un de paranteze rotunde care intervin ntr-o expresie
un program care acestea un de paranteze care
se nchid corecte regulile aritmetice).
31
se va
a=102
b=2142
Exemplu:
Pentru de paranteze ,,( ( ) ( ) ( ( ) ))" se mesajul "Corect".
Pentru de paranteze,,( )) ( ) (( )" se mesajul "Incorect".
44. Se de codificare a unui cuvnt: n
vocale. a vcuvntului se caracterul 'p'. un program care
de codificare de decodificare a unui cuvnt. De la se
va introduce tipul dorite prin caracterele: C pentru codificare D pentru
decodificare.
Exemplu:
Pentru C cuvntul "oaie" se va "popapipe".
Pentru D cuvntul "pparpintpe" se va "parinte".
45. Se un n (n:5JOOOO) care are partea
din maximum 6 cifre. se scrie un program care conversia
n n baza 2. Datele se citesc de la se pe ecran.
Exemplu: Pentru n=7.375 se va
,,111.011".
46. n text baze.in sunt dispuse pe fiecare linie cte un n scrierea
lor intervin cifrele de la 0..9 literele de la A la M(reprezentnd, n ordine,valorile
10, 11, 12, ... ). Baza n care sunt reprezentate acestea se a fi baza
tuturor. un program .care intervalul [a,b], de
lungime n care sunt incluse toate numerele din n urma conversiei
n baza 10.
Exemplu:
Pentru baze.in
07B
1AA
e8A
47. Se o de n de caractere, fiecare reprezentnd o
din maximum 20 de caractere (cifre 0... 9 sau majuscule). Din fiecare
se succesiv caracterele de la stnga spre dreapta la cel mai
mare caracter al n sens lexicografic. De exemplu, parola "A250B089" devine
"B089". n urma acestei unele dintre parole devin identice sunt
considerate invalide. Ele sunt nlocuite cu suma dintre ei n suma
codurilor ASCII a caracterelor primei parole valide n devine
noua este un program care
parolelor aceste sau mesajul .Jmposibil",
Exemplu: Pentru n=3 se va
07BA023 281
AABBAB BBAB
A07BA023 283
32
!!!!!!!!!!!
Tipul nregistrare -
1.2.1 Teste cu alegere
1. Care dintre sunt
a) O nregistrare nu poate avea cmpuri desemnate prin identificator;
b) O nregistrare nu poate avea cmpuri din tip;
c) Orice nregistrare are cel un cmp;
d) de cmpuri al unei nu poate 20.
2. Care dintre de tip sunt corecte sintatic?
a)type A : record
el:byte; e2:byte;
end;
b) type A
el, e2 :byte;
e) type A record;
el:boolean;
e2:byte; end;
d) type A record
el:boolean; e2:byte
end;
a) typedef A struct
int el,e2;
} ;
b) typedef A struct
int el,e2;
e) struct A; {
int el,e2;
} ;
d) struct
int el,e2;
} A;
3. Considernd care dintre referirile de mai jos nu
un caracter:
Type Exemplu = record
a:real; b:string[lO];
e:array[l .. 10]of ehar
end;
Var x, y: exemplu;
typedef struct {
float a;
char *b, e[lO];
} Exemplu;
Exemplu x, y;
a) x.b b) y.b[l] e) x.e[2] d) y.a
4. Presupunem au fost pentru a numele
vrsta elevilor dintr-o n ordine care dintre referirile de
mai jos numelui primului elev din catalog:
Type elev=record
nume: array [O.. 255] of char;
varsta: integer
typedef struct {
char nume[256J;
int varsta;
33
end;
clasa = array[O .. 34]of elev;
Var a: clasa;
a)a[O] . elev. nume
b) a[O] .elev.nume[O]
} elev;
typedef elev clasa[35];
clasa a;
c) a[O] .nume[O]
d) clasa[O] .nume
5. Considernd de tipuri, care dintre apelurile de
mai jos sunt corecte sintactic:
Type pers = record
name: string;
age: integer end;
ap = record
locatar: pers;
nr: integer;
end;
Var exemp: ap;
a) readln(exemp.locatar)
b) readln(exemp.locatar.age)
c) readln(exemp.pers.name)
d) readln(exemp.nr)
typedef struct {
char name[256];
int age;
} pers;
typedef struct {
pers locatar;
int nr;
} ap;
ap exemp;
a) cinexemp.locatar;
b) cinexemp.locatar.age;
c) cinexemp.pers.name;
d) cinexemp.nr;
6. care dintre de atribuire sunt corecte sintactic,
considernd de mai jos:
Type pers = record
name: string;
age: integer end;
Var a: pers;
b: record
name: string;
age: integer
end;
a) a . name : =' r ;
b) a:=b;
c) a.age:=b.age;
d) a.name:=name;
typedef struct
char *name;
int age;
pers;
pers a;
struct {
char *name;
int age;
b;
a) a.name="";
b) a=b;
c) a.age=b.age;
d) a.name=name;
7. Care dintre de tip sunt corecte sintatic?
a)type info = record
a,b:real;
ma,mg: byte;
end;
34
!!!!!!!!!!!!
a) typedef struct
float a,b;
int ma,mg;
info;
b} type record = record
a,b:real;
ma,mg:byte;
end;
c} type numar = record
a,b:real;
medie:numar;
end;
d} type medie = record
a,b:integer;
medie:real;
end;
b} typedef struct
float a,b;
int ma,mg;
struct;
c) typedef struct
float a,b;
numar medie;
numar;
d} typedef struct
int a,b;
float medie;
medie;
8. Considernd de tipuri, care dintre
de mai jos pot fi folosite pentru citirea cmpurilor variabilei exemp?
Type
pers record
name: string; age: integer
end;
ap = record
locatar: pers;
nr: integer;
end;
Var exemp: ap;
a} with exemp do begin
readln(locatar.name} ;
readln(locatar.age, nr}
end;
b} with exemp do begin
with locatar do begin
readln (name) ;
read(age)
end;
read(nr}
end;
c} with exemp do begin
readln(locatar.name};
readln(locatar.age};
readln(locatar.nr)
end;
d} with exemp do begin
with locatar do begin
readln(name} ;read(age}
read(nr}
end;
end;
typedef struct {
char name [256] ;
int age;
} pers;
typedef struct {
pers locatar;
int nr;
} ap;
ap exemp;
a)
cinexemp.locatar.name;
cinexemp.locatar.age;
cinexemp.nr;
b)
pers *t=&exemp.locatar;
cint->name;
cint->age;
cinexemp.nr;
c}
cinexemp.locatar.name;
cinexemp.locatar.age;
cinexemp.locatar.nr;
d}
pers *t=&exemp.locatar;
cint->name;
cint->age;
cint->nr;
35
9;Considernd de tipuri, care dintre atribuirile de
mai jos sunt corecte sintactic?
10. Presupunem au fost pentru a un polinom
P de grad n. care dintre de mai jos corect produsul
dintre polinomul P scalarul x: .
Type
d_c record
zi, luna, an:integer;
end;
stamp = record
data:d_c;
time : record
h, min, sec: integer;
end;
end;
var a:stamp; b:d_c;
a) a.time.h:=23;
b) a.d_c.zi:=23;
c) b.zi:=b.luna;
d) b.data:=23;
Type
Monom=record
cf:real; grad: integer
end;
Polinom = array[l .. 35]of monom;
Var p: Polinom; x,i,n:integer;
a) for i:=l ta n+l do
p.cf:=p.cf * X;
b) for i:=l ta n do
p [ i] . cf : =p [ i] . cf + x :
c) for i:=l ta n+l do
p[i] .cf:=x.cf * p[i] .cf;
d) for i:=l ta n+l do
p[i] .cf:=p[i] .cf*x;

type cerc=record
o_x,o_y,raza:integer;
end;
36
!!!!!!!!!
typedef struct {
int zi,luna,an;
} d_c;
typedef struct
d_c data;
{
int h,min,sec;
} time;
stamp;
a) a.time.h=23;
b) a.d_c.zi=23;
c) b.zi=b.luna;
d) b.data=23;
typedef struct {
float cf; int grad;
} Monom;
typedef Monom Polinom[35];
Polinom p;
int x,i,n;
a) for (i=O;i<=n;i++)
p.cf*=x;
b) for (i=O;i<n;i++)
p[i] .cf+=x;
c) for (i=O;i<=n;i++)
p [il . cf*=x. cf;
d) for (i=O;i<=n;i++)
p[i] .cf*=x;
typedef struct {
int o_x,o-Y,raza;
} cerc;
cilindru = record
h,volum:integer;
baza:cerc;
end;
var x:cilindru;
y:cerc;
typedef struct
int h,volum;
cerc baza;
} cilindru;
cilindru X;
cerc y;
Care dintre atribuiri sunt corecte sintactic:
a) x.y.raza .- 10; a) x.y.raza = 10;
b) x.h.raza := 10; b) x.h.raza = 10;
c) x.baza.raza := 10; c) x.baza.raza 10;
d) x.volum.o_X .- 10; d) x.volum.o_X = 10;
12. care permit memorarea n variabila a a unui
polinom de grad n 50), iar n variabila b a unui monom. Pentru fiecare din cele
n+1 monoame ale polinomului se coeficientul gradul Memorarea
acestora nu este grade.
type monom = record
cf: integer;
gr: integer; end;
type
polinom=array[l .. 50]of monom;
var
a:polinom;
b:monom;
i, n , m: integer;
typedef struct
float cf;
int gri
} monom;
typedef monom polinom[50];
polinom a;
monom b;
int i,n,m;
de care n mod corect monomul b la
polinomul a:
a)m:=l;
for i:=l to n+1 do
if a.gr[i]=b.gr then begin
inc(a.cf[i],b.cf); m=O
end;
if m=l then begin
inc(n); a[n] :=b
endi
b)
for i:=l to n+1 do
inc(a[i] .cf,b.cf);
c)m:=l;
for i:=l to n+1 do
if ali] .gr=b.gr then begin
inc(a[i] .cf,b.cf); m:=O
end;
if m=l then begin
inc(n); a[n] :=b
end;
a)m=l;
for (i=O;i<=n;i++)
if (a.gr[i]==b.gr)
a.cf[i]+=b.cf; m=O;
}
if (m) {
a[++n]=b;
}
b)
for (i=O;i<=n;i++){
a li] .cf li] +=b.cf;
}
c)m=l;
for (i=O;i<=n;i++)
if (a[i] .gr==b.gr) {
ali] .cf+=b.cf;
m=O;
}
if (m) a[++n]=b;
37
13. care permit memorarea n variabila a a unui
polinom de grad n 50), iar n variabila b a unui monom. Pentru fiecare din cele
n+1monoame ale polinomului se coeficientul gradul
d)for i:=l ta n do
if ali] .gr=b.gr then
inc{a[i] .ceb.cf) i
type monom = record
cf: reali
gr: integeri endi
type
polinom=array[l .. 50]of monomi
var
a:polinomi
b:monomi
i,n,m:integeri
d)for (i=lii<=nii++)
if (ali] .gr==b.gr)
ali] .cf+=b.cfi
typedef struct
float Cfi
int gri
} monomi
typedef monom polinom[50] i
polinom ai
monombi
int i,n,mi
de care n mod corect polinomul a cu
monomul b:
a) for i:=l ta n+l do
ali] .gr:=a[i] .gr * b.gri
b) for i:=l ta n+l do begin
ali] .cf:=a[i] .cf * b.cfi
ali] .gr:=a[i] .gr + b.gri
endi
c) fori:=l ta n+l do begin
ali] .cf:=a[i] .cf + b i c f :
ali] .gr:=a[i] .gr + b.gri
endi
d) for i:=l ta n+l do begin
a.cf[i]:=a.cf[i] * b i c f :
a.gr[i] :=a.gr[i] + b.gri
endi
a) for (i=Oi i<=ni i++)
ali] .gr *= b.gri
b) for (i=Oi i<=ni i++) {
a[i] wcf *= b.cf;
ali] .gr += b.gri
}
c) for (i=Oi i<=ni i++){
ali] .cf += b i c f :
ali] .gr += b.gri
}
d) for (i=Oi i<=ni i++) {
a.cf[i] += b.cfi
a.gr[i] *= b.gri
}
14. Variabila a este ntr-un program pentru a memora numele prenumele
unui elev. care dintre este
a) var a: a) struct{
record nm, pr:string[15] endi
char *nm, char *pri }ai
b) var a: char [3O] i
b) float a[15]i
c) var
c) char a [ 2OO] i
a: array [ 1 .. 2] of string[150] i
d) char a[2] [15] i
d) var a:stringi
38
se va
de fete: 4
Procentajul 37.5%
Lista: clasa 1
1.2.2 Probleme rezolvate
1. La o sunt cte m elevi n fiecare dintre cele n clase
(numerotate de la 1 la n). Pentru fiecare se cunosc elevi
care este de o de program care
de fete din care este procentul lista claselor
care au procentul de mai mare dect procentul pe
Exemplu:
Pentru n=2 m=4;
Clasa 1: 2 1
Clasa 2: 1 navetist, 3
Solutie
Pentru fiecare se vor cu ajutorul unei de
(nv) procentul acestora (pc) de total de elevi ai clasei. de
fete (f) din se poate determina n momentul citirii datelor referitoare la
fiecare
1 type c record
2 nv:byte; pc:real;
3 end;
4 var a:array[l .. 50]of c;
5 x:real;
6 n,tnv,i,f,m,b:integer;
7 beg-in
8 readln(n,m);
9 for i:=l to n do beg-in
10 readln(a[i] .nv);
11 readln (b) ;
12 f:=f+m-b;
13 tnv:=tnv+a[i] .nv;
14 ali] .pc:=a[i] .nv*lOO/m;
15 end;
16 x: =tnv*lOO/(m*n) ;
17 writeln(f,' ',x:O:2);
18 for i:=l to n do
19 if ali] .pc>x then write(i)
end.
#include <stdio.h>
typedef struct {
int nv; float pc;
} c;
c a[50];
float x;
int n,tnv, i,f,m,b;
void main() {
scanf (" %d %d", &n, &m) ;
for(i=O;i<n;i++) {
scanf ("%d %d", &a li] .nv, &b) ;
f+=m-b;
tnv+=a[i] .nv;
ali] .pc=a[i] .nv*lOO.O/m;
}
x=tnv*lOO.O/(m*n) ;
printf("%d %.2f\n",f,x);
for(i=O;i<n;i++)
if (a li] .pc>x)
printf("%d",i+l) ;}
2. n laboratorul de al unei se n calculatoare (numerotate de
la 1 la n). Pentru fiecare se cunosc tipul procesorului (486, Pentium I, II, III, IV,
Duron, etc.), procesorului n MHz), memoria RAM
n MB) capacitatea hard-discului n MB).
un program care calculatoarele care pot fi conectate ntr-o
sub un sistem de operare de cel x Mhz, memoria de cel y MB
capacitatea hard-discului de cel z MB).
39
Ca server va fi ales un calculator (eventual procesor Pentium) cu cele mai bune
n ordinea: memorie RAM.
Solutie
Datele referitoare la fiecare calculator vor fi preluate dintr-o nregistare, ale
cmpuri vor tipul procesorului. (P), procesorului (fr), memoria
RAM(ram) capacitatea hard-discului (hdd). n procesul de citire a datelor se va
identifica serverul
3. Se o din date referitoare la n elevi. elev i se
numele prenumele, media notelor de la oral la disciplina
nota din un program care pentru fiecare a alfabetului,
numele prenumele elevului care a cea mai mare medie dintre cei ai
nume de familie ncepe cu acea
1 type c=record
2 fr,ram,hdd: integer;p: string;
3 end;
4 var a:array[l .. 50]of c;
5 i,n,x,y,z,s,mfr,mram:integer;
6 begin
7 readln(n,x,y,z);
8 mfr:=O; mram:=O;
9 for i:=l to n do
10 with ari] do begin
11 readln (p) ;
12 readln(fr,ram,hdd);
13 if (fr>mfr)or
14 (fr=mfr)and(ram>mram) then
15 begin
16 s:=i; mfr:=fr; mram:=ram;
17 end;
18 end;
19 writeln( 'serverul:' ,s);
20 for i:=l to n do
21 with ari] do begin
22 if (i<>s)and(fr>x)and
23 (ram>y)and(hdd>z)
24 then writeln('statia ',i);
25 end;
26 end.
#include <stdio.h>
typedef struct {
int fr,ram,hdd; char p[256];
} c;
c a[50]; int i,n,x,y,z,s,mfr,
mram;
void main () {
scanf ("%d%d%d%d", &n, &x, &y, &z) ;
mfr=mram=O;
for (i=O;i<n;i++){
scanf ("%s%d%d%d" ,&a [il .p,
&a[i] .fr,&a[i] .ram,&a[i] .hdd);
if (a[i] .fr>mfrll
(a[i] .fr==mfr&&a[i] .ram>mram)){
s=i; mfr=a[i] .fr;
mram=a[i] . ram; }
}
printf ( "serverul: %d" , s+1) ;
for(i=O;i<n;i++){
if (i!=s&&a[i] .fr>x&&
ari] .ram>y&&a[i] .hdd>z)
printf ("statia %d\n" , i+l) ;
}
}
Solutie
Pentru fiecare elev se vor ntr-o nregistrare numele (np) media
la (m). Vectorul ce datele tuturor elevilor va fi ordonat
n de medie.
Pentru fiecare a alfabetului se va identifica prima nregistrare din vector
pentru care primul caracter al cmpului np este egal cu litera
40
1 type e=record
2 np:string; m:real;
3 end;
4 var a:array[1 .. 50]of e;
5 x:e; nt,j,n,i:integer;
6 mo:real; nm,pr:string;
7 s:array['A' .. 'Z']of boolean;
8 begin
9 readln (n) ;
10 for i:=l to n do begin
11 readln (nm) ;
12 readln(pr);
13 a [i] . np : =nm+ ' '+pr ;
14 readln(mo,nt);
15 ari] .m:=(mo*3+nt)/4;
16 end;
17 for i:=l to n-l do
18 for j:=i+l to n do
19 if\a[i] .m<a[j].m then begin
2 O x :;=a [i] ; a [ i] : =a [ j ] ; a [ j] : =x
21 end;
22 i:=l;
23 while i<=n do begin
24 if s[a[i] .np[l]] then
25 begin
26 writeln(a[i] .np);
27 s[a[i] .np[l]] :=true;
28 end;
29 ine(i);end;
30 end.
#inelude <stdio.h>
#inelude <string.h>
typedef struct {
char np[256]; float m;
} e;
e a[50] ,x;
int nt,i,j,n,s[256];
float mo;
char nm[256],pr[256];
void main() {
seanf (" %d" ,&n) ;
for(i=O;i<n;i++) {
seanf I " %s%s" ,nm, pr) ;
streat(a[i] .np,nm);
s treat (a [ i] . np," ");
streat(a[i] .np,pr);
seanf (" %f%d" ,&mo, &nt) ;
ari] .m=(mo*3.0+nt)/4.0;
}
for(i=O;i<n;i++)
for(j=i+l;j<n;j++)
if (a[i] .m<a[j] .m) {
x=a [ i] ; a [i ] =a [ j ] ; a [j ] =x;
}
for(i=O;i<n;i++)
i f (! s [a [i] . np [ O] ] ){
printf ("%s\n", a [il .np) ;
s [a [i] . np [ O] ] =1 ;
}
4. La un magazin au fost aduse n sortimente de produse(numerotate de la 1 la n),
pentru fiecare cunoscndu-se cantitatea n de
adaosul comercial (exprimat n procent din valoarea de n decursul unei
s-a contorizat, pe zile, cantitatea din fiecare produs. un
program care valoarea a ntr-o zi valoarea
ale unui produs x.
Solutie
O nregistrare care datele referitoare la un produs va memora
valoarea de vnzare a produsului (v), cantitatea (e)
efectuate n fiecare zi a (vectorul z). Pentru fiecare zi a se va
calcula valoarea produselor vndute, actualizndu-se valoarea a
real ntr-o zi.
1 type p=record
2 v:real; e:byte;
3 z:array[1 .. 7]of real;
4 end;
5 var a:array[1 .. 50]of p;
6 j,n,i,x:integer;
7 t,max,s,pr,ad:real;
#inelude <stdio.h>
typedef struct {
float v,z[7]; int e;
} p;
p a[50];
int i,j,n,x;
float t,max,s,pr,ad;
4]
5. un program pentru unei care
alegerea a uneia dintre de mai jos, lista
nume:
unui student n
despre un anumit student, dupe nume;
listarea tututor din
Despre fiecare student al unei grupe se cunosc numele studentului, media la
unei sesiuni valoarea bursei.
Solutie
Lista cu datele referitoare la va fi ntr-un vector de (a),
care pe tot parcursul procesului de prelucrare va fi ordonat
nume (np).
de a unui nou student se va efectua n etape: se
printr-o parcurgere unde trebuie noua nregistare, care
se va efectua o de deplasare spre dreapta a elementelor
de a unei este prin algoritmul de
deoarece lista este
X--i
for(i=Oii<7ii++)
s+=a[x] .z[i]*a[x] .V;
printf("%.2f %.2f\n",max,s)i}
}
for(i=Oii<7ii++)
{
for(t=j=O;j<n;j++)
t+=a[j] .v*a[j] .z[i] i
if (t>max) max=ti
}
#include <stdio.h>
#include <string.h>
typedef struct {
int m,b; char np[256]i
} Si
S a[50]; int x,i;m,j,n,oki
char nm[256] ,pr[256] i
void main() {
printf ( "add=l; search=2 i " ) i
printf("list=3i exit=4.\n")i
void main() {
scanf (" %d%d" ,&n, &x) i max=O. Oi
for(i=Oii<nii++)
{
scanf ("%d", &a[i] .c) i
scanf("%f%f",&pr,&ad) i
aei] .v=pr+pr*ad/100.0;
for (j=0;j<7ij++)
s canf ( "%f " , &a [ i] . z [ j ] ) i
type s=recOrd
m,b:integerinp:stringi endi
var a:array[l .. 50]of s;
x,i,m,j,n:integeri
nm,pr:stringi
ok:boo1ea ni
begin
8 write('add=li search=2i 'li
9 writeln('list=3i exit=4. ') i
10 n:=Oi
8 begin
9 readln(n,x)i max:=Oi
10 for i:=l to n do begin
11 readln(a[i] .c) i
12 readln(pr) i readln(ad) i
13 aei] .v:=pr+pr*ad/100i
14 for j:=l to 7 do
15 read(a[i] .z[j])
16 end;
17 for i:=l to 7 do begin
18 t:=Oi
19 for j:=l to n do
20 t:=t+a[j] .v*a[j] .z[i] i
21 if t>max then max:=ti
22 end;
23 for i:=l to 7 do
24 s:=s+a[x] .z[i]*a[x] .v:
25 writeln(max:0:2,' ',s:0:2) i
26 end.
42
!!!!!!!!!!
11 repeat
12 writeln('Operatia=?');
13 readln (x) ;
14 case x of
15 1: begin readln(nm);
16 readln(pr);
17 i: =0;
18 repeat
19 inc (i) ;
20 until(i>n)or(a[i] .np>nm+pr);
21 for j: =n downto i do
22 a[j+1]:=a[j];
23 readln(a[i] .m,a[i] .b);
24 ali] .np:=nm+pr;
25 inc (n);
26 end;
27 2: begin
28 ;ok:=true;
29 i:=l;j:=n;
30 while (i<=j)and ok do begin
31 m;=(i+j)div 2;
32 if a[m] .np=nm then begin
33 writeln(a[m] .m,a[m] .b);
34 ok:=false;
35 end'
36 else
37 if a[m] .np>nm then j:=m-1
38 else i:=m+1
39 end
40 end;
41 3: for i:=l to n do
42 writeln(a[i] .np);
43 end;
44 until x=4;
45 end.
do {
printf("Operatia=?") ;
scanf (" %d" ,&x) ;
switch (x) {
case 1:
scanf (" %s%s" ,nm, pr) ;
strcat (rim , pr) ;
for(i=O;i<n&&
strcmp(a[i] .np,nm)<=O;i++);
for(j=n-1;j>=i;j--)
a [j +1] =a [j ] ;
scanf ("%d%d" ,&a[i] .m, &a[i] .b);
strcpy(a[i] .np,nm) ;n++;
break;
case 2:
scanf("%s",&nm) ;ok=l;
for(i=0,j=n-1;i<=j&&ok;) {
m=(i+j)/2;
if (!strcmp(a[m] .np,nm)) {
printf("%d %d\n",
a[m] .m,a[m] .b) ;ok=O;
} else
if (strcmp(a[m] .np,nmO)
j=m-1;
else i=m+1;
}
break;
case 3:
for (i=O; Lcn : i++)
printf ("%s\n" ,ali] .np);
break;
}
} while (x l =4) ;
}
6. Pentru elevii clasei a XII-a, profesorul diriginte are nevoie de
pentru a calcula nota la purtare a unui elev: numele, prenumele,
total de de motivate. Pentru fiecare 1
nemotivate, elevul pierde un punct la nota de la purtare.
nemotivate este mai mare de 50, elevul media 4.
un program care notele la purtare ale elevilor o
a elevilor media de la purtare.
Exemplu n=6 se va
lista (nume/total - motivate) Ionescu Ana 10
Ionescu Vlad 17 - 10 Ionescu Vlad 10
Popescu Ion 24 -1 Popescu Dan 10
Ionescu Ana 8 - 6 Alexe Maria 9
Alexe Maria 20 - 4 Popescu Ion 8
Mitea Ilie 73 - 6 Mitea Ilie 4
Popescu Dan 12 - 12
43
Solutie
o nregistrare ce datele referitoare la un elev are cmpuri n care
se numele prenunele (np) media la purtare (m). Vectorul a n care se
datele despre elevii clasei va fi ordonat n de cmpul medie.
1 type e=record
2 m:integer;np:string;
3 end;
4 var a:array[1 .. 50]of e;
5 i,j,n,nta,nam:integer;
6 nm,pr:string; x:e;
7
8 begin
9 readln {n} ;
10 for i:=l to n do begin
11 readln {nm} ;
12 readln{pr};
13 ali] .np:=nm+' , +pr;
14 readln{nta,nam);
15 ali] .m:=10-{nta-nam)div 10;
16 if ali] .m<5 then ali] .m:=4;
17 end;
18 for i:=l to n-1 do
19 for j:=i+1 to n do
20 if ali] .m<a[j].m then
21 begin
22 x:=a[i] ;a[i] :=a[j];
23 a[j]:=x;
24 end;
25 for i:=l to n do
26 writeln{a[i] .np, , ',a[i] .m};
27 end.
#include <stdio.h>
#include <string.h>
typedef struct {
int m; char np[256];
} e;
e a[50],x; int i,j,n,nta,nam;
char nm[256],pr[256];
void main{}{
scanf {"%d", &n} ;
for{i=O;i<n;i++} {
scanf {"%s%s" ,nm,pr};
strcat{a[i] .np,nm};
s trcat {a [ i] . np," "};
strcat{a[i] .np,pr};
scanf {" %d%d" ,&nta, &nam} ;
ali] .m=10-{nta-nam}/10;
if {ali] .m<5} ali] .m=4;
}
for{i=O;i<n;i++}
for{j=i+1;j<n;j++}
if {ali] .m<a[j] .m} {
x=a [ i] ; a [ i ] =a [ j ] ; a [j ] =x;
}
for{i=O;i<n;i++}
printf{"%s %d\n",
a li] .np, a li] .m} ;
7. Se n intervale nchise [a,b], a b numere ntregi. se determine
reuniunea acestora.
Vom intervalele ntr-un tablou unidimensional de Primul pas al
algoritmului va ordona intervalele n de stng al acestora. Pentru
determinarea reuniunii, este o parcurgere a acestora, la
fiecare moment stng drept al intervalului curent al reuniunii, actualiznd
la nevoie valorile acestora.
Exemplu n=5 intervalele:
2 4
1 3
5 8
10 12
6 9
Solutie
se va
1 4
5 9
10 12
44
1 type it=record
2 x,y:integeri endi
3 var a:array[1 .. 100]of iti
4 rx,ry,i,n,j:integeri t:iti
5 begin
6 readln (n) i
7 for i:=l to n do
8 read(a[i] .x,a[i] .y) i
9 for i:=l to n-1 do
10 for j:=i+1 to n do
11 if ali] .x>a [j] .x then begin
12 t: =a li] i
13 ali] :=a[j] i
14 a[j] :=t
15 endi
16 rx:=a[l] .Xi ry:=a[l] .Yi
17 for i:=2 to n do
18 if ali] .x>ry then begin
19 'writeln (rx, I " ry) i
20 rx:=a[i] .xiry:=a[i] .y;
21 erid
22 else
23 if ali] .y>ry then
24 ry:=a[i] .Yi
25 writeln(rx, I ',ry)
26 end.
#include <stdio.h>
typedef struct {
int x,y;
} iti
it a[100],ti int rx,ry,i,j,ni
oid main() {
scanf (" %d" ,&n) i
for(i=Oii<nii++)
scanf ("%d%d", &a[i] .x, &a[i] .y) i
for(i=Oii<nii++)
for(j=i+1ij<nij++)
if (a[i] .x>a[j] .x)
t=a[i] ;
ali] =a [j] i
a[j]=ti
}
rx=a[O] .Xi ry=a[O] .y;
for (i=lii<nii++)
if (a[i] .x>ry)
{
printf ( "%d %d\n" , rx, ry) i
rx=a[i] .xiry=a[i] .Yi
} else
if (a[i] .y>ry) ry=a[i] .y;
printf("%d %d\n",rx,ry) i
8. Pentru fiecare dintre cei n elevi ai unei clase se matricol
format din maximum 8 cifre), anul, luna ziua se lista
elevilor care vor ziua de anul acesta, cunoscndu-se ziua
luna n care ne Se vor matricol al elevului, ziua luna
ale acestuia. Elevii vor fi n ordine a datei Datele de
intrare se citesc din date.in n care pe prima linie se trei numere n, ziua
luna Pe n linii se cte patru numere, n ordine
reprezentnd: matricol, ziua, luna anul elev.
Exemplu: Pentru date.in se va
4 12 3 12301 21 4
23128 4 12 1969 23128 4 12
21398 23 1 1970
12301 21 4 1970
54312 11 3 1970
Solutie
Pentru fiecare elev se va pe matricol (m), ziua (z), luna (l)
zilei din an (t) n care va ziua de Anul nu va
fi preluat ntr-un cmp al
Vectorul a n care sunt ca elemente aceste va fi ordonat
cmpul t. printr-o parcurgere a vectorului se
va identifica prima nregistrare pentru care ziua din an este mai dect
valoarea din cmpul t.
45
!!!!!!!!!!!
1 type p=record
2 m,z,l,t :longint
3 end;
4 var a:array[l .. 50]of p;
5 s:p;i,n,j,x,y,t,d:integer;
6 beg-in
7 assign(input, 'date.in');
8 reset(input); read1n(n,x,y);
9 d:=x+(y-1)*30;
10 for i:=l to n do
11 with ari] do begin
12 read1n(m,z,1);
13 t :=z+(1-1)*30 ;
14 end;
15 for i:=l to n-1 do
16 for j:=i+1 to n do
17 if ari] .t>a[j].t then beg-in
18 s : =a [ i] ; a [i] : =a [j l : a [j] : =s ;
19 end;
20 i:=l;
21 while (a[i] .t<d)and(i<=n)do
22 inc(i);
23 if i>n then
24 with a[l] do
25 writeln(m,' ',z,' ',1)
26 else for j:=i to n do
27 with a[j] do
28 writeln(m,' ',z,' ',1);
29 end.
#include <stdio.h>
typedef struct {
long- m,z,l,t;
} p;
p a[50],s;
int i,n,j,x,y,t,d;
void main() {
freopen("date.in", "r" ,stdin);
scanf("%d%d%d",&n,&x,&y) ;
d=x+(y-1)*30;
for(i=O;i<n;i++) {
scanf ( "%ld%ld%ld%ld" ,&a [i] .m,
&a[i] .z,&a[i] .1,&a[i] .t);
ari] .t=a[i] .z+(a[i] .1-1) *30;
}
for (i=O;i<n;i++)
for (j=i+1;j<n;j++)
if (a[i].t>a[j].t) {
s=a[i]; a[i]=a[j]; a[j]=s;
}
for(i=O;i<n&&a[i] .t<d; i++);
if (i>n)
printf("%ld %ld %ld\n",
alO] .m,a[O] .z,a[O] .1);
else
for (j=i; j<n; j ++)
printf("%ld %ld %ld\n",
a[j] .m,a[j] .z,a[j] .1);
9. ntr-o a unui teatru sunt programate mai multe spectacole. Pentru fiecare
dintre ele se intervalul orar al (ora de nceput cea de
Deoarece unele dintre ele se suprapun ca ore de se
eliminarea unui minim de spectacole astfel nct cele se
ntr-o zi, n sala de teatru la
Datele de intrare se citesc din teatru. in, unde pe prima linie se
n, iar pe n linii se numere reale exprimate cu
zecimale (hh.mm) reprezentnd ora minutele momentului de nceput de
al spectacol. Se vor intervalele orare n care erau programate
se spectacolele care au fost eliminate.
Exemplu: Pentru teatru. in se va
5 9.30 13.20
10.00 12.30 12.20 15.30
9.30 13.20
15.00 16.00
12.20 15.30
12.30 14.20
Solutie
Pentru fiecare spectacol se va ntr-o ntregistrare momentul de nceput (x)
cel de (y).
46
Tabloul a ce cele n va fi ordonat x iar pentru
spectacole cu moment de nceput sortarea se va face y.
ntr-o parcurgere se vor spectacolele eliminate.
1 type s=record x,y:real; end;
2 var a:array[l .. 50] of s;
3 t:s; u,i,n,j:integer; sf:real;
4 begin
5 assign(input, 'teatru.in'};
6 reset(input}; readln(n};
7 for i:=l to n do
8 readln(a[i] .x,a[i] .y);
9 for i:=l to do
10 for j:=i+1 to n do
11 if (a[i].x > a[j] .x)or
12 (a[i] .x=a[j] .x)and(a[i] .y>a[j] .y)
13 then begin
14 d=a [il ;
15 ali] :=a[j];
16 a l f l :=t;
17 end;
18 u:=l; sf:=a[l] .y;
19 for i:=2 to n do
20 if a[ir.y<sf then
21 begin
22 writeln(a[u] .x:0:2,a[u] .y:0:2};
23 u:=i;
24 sf:=a[i] .y;
25 end
26 else
27 if ari] .x<sf then
28 writeln(a[i] .x:0:2,a[i] .y:0:2}
29 else begin
30 u:=i;
31 s f : =a [i] . y;
32 end
33 end.
#include <stdio.h>
typedef struct {
float x,y;
} s;
s a[50],t;int i,j,n,u;float sf;
void main(}{
freopen ( "teatru. in" , "r" , stdin) ;
scanf("%d" ,&n};
scanf("%f%f" ,&a[O] .x,&a[O] .y};
for (i=l;i<n;i++)
scanf("%f%f" ,&a[i] .x,&a[i] .y};
for(i=O;i<n;i++}
for(j=i+1;j<n;j++}
if(a[i] .x>a[j] .x] ] (a[i] .x==
a[j] .x&&a[i] .y>a[j] .y)} {
t=a[i];
a[i]=a[j] ;
a[j]=t;
}
u=O;sf=a[O] .y;
for(i=l; i<n; i++}
if (a[i] .y<sf) {
printf("%.2f %.2f\n",
alu] .x,a[u] .y};u=i;sf=a[i] .y;
} else
if (a[i] .x-csf )
printf("%.2f %.2f\n",
ari] .x,a[i] .y);
else {
u=i;
sf=a[i] .v :
}
10. Se un de n intervale de forma [aib.], cu ai, b, numere ntregi. Un
interval poate fi eliminat din celor n un alt interval care l include
pe acesta. maxim de intervale care pot fi eliminate.
In text interval.in se pe prima linie n (n<16000), iar pe
n linii, perechi de numere naturale, mai mici dect 2000000000 ce
capetele intervalelor. Rezultatul va fi pe ecran.
Exemplu: interval. in Se va
5 3
O 10
2 9
3 8
1 15
6 11
47
Solutie
Se intervalelor limita
limita La parcurgerea intervalelor se va actualiza cel mai mare
din dreapta (maxdr). Orice interval pentru care din dreapta este mai mic
dect maxdr este redundant, deci inclus n altul.
1 typa s = record
2 x, y: longint;
3 end;
4 var a: array[1 .. 50] of s;
5 t: s; nr,i,n,j,md: integer;
6 begin
7 assign(input, 'interval.in');
8 reset(input); readln(n);
9 for i := 1 to n do
10 with ari] do readln(x, y);
11 for i := 1 to n - 1 do
12 for j := i + 1 to n do
13 if (a[i].x > a[j] .x) or
14 (a[i] .x=a[j] .x)and(a[i] .y<a[j] .y)
15 then bagin
16 t:=a[i]; ari] :=a[j]; a[j] :=t
17 end;
18 nr:=O;
19 md:=a[l] .y;
20 for i := 2 to n do
21 if a[i].y < md than inc(nr)
22 else md := ari] .y;
23 writeln(nr);
24 and.
#include <stdio.h>
typadaf struct {
long x,y;
} s;
s a[50] ,t; int nr,i,n,j,md;
void main() {
freopen ( "interval. in" , "r" ,
stdin) ; scanf ( "%d" ,&n) ;
for(i=O;i<n;i++)
scanf ("%ld%ld" ,
&a[i] .x,&a[i] .y);
for(i=O;i<n;i++)
for(j=i+l;j<n;j++)
if(a[i] .x>a[j] .xll (a[i] .x==
a [ j] . x&&a[i] . y<a [j ] . y) ) {
t=a[i]; a[i]=a[j]; a[j]=t;
}
nr=O;
md=a[O] .y;
for(i=l;i<n;i++)
if (a[i] .y<md) nr++;
alsa md=a[i] -Y:
printf ("%d\n" ,nr) ;
}
1.2.3 Probleme propuse
1. Se o din datele referitoare la n elevi. elev i se
numele prenumele, media notelor de la oral la disciplina
nota din se creeze un program care media pe la disciplina
numele elevilor care au cea mai mare medie
2. Se o din datele referitoare la n elevi. elev i se
numele prenumele, media notelor de la oral la disciplina
nota din un program care n ordinea a mediilor,
numele prenumele elevilor care au promovat la
3. Se o din datele referitoare la n elevi. elev i se
numele prenumele, media notelor de la oral la disciplina
nota din un program care n ordine elevii
la
48
se va
Alexe Maria, Ionescu Ana,
Ionescu Vlad, Mitea Ilie,
Popescu Dan, Popescu Ion
4. Pentru a scrie catalogul, dirigintele are nevoie de numele prenumele elevilor.
se ordoneze aceste date alfabetic, nume, iar pentru elevii cu nume
se ordoneze alfabetic prenume.
Exemplu: n =6 elevii:
Ionescu Vlad, Popescu Ion,
Ionescu Ana, Alexe Maria,
Mitea Ilie, Popescu Dan
5. Se de sportivi la o oarecare. Pentru
fiecare dintre ei se data (luna anul). Cunoscndu-se data (luna
anul) la care se se media de a sportivilor,
n mod. lista datelor de ale sportivi lor cu vrsta
mai dect cea medie.
6. Se citesc de la datele referitoare la m elevi: nume, prenume, de
membri ai familiei venitul net lunar al familiei. Un elev
venitul pe 'fiecare membru al familiei nu o valoare L. un
program care elevii ce nu au dreptul la n ordine
7. Se un de n (numitor, de
echivalente Cu ultima
Exemplu: Pentru n=4 ,,(3, 5), (36, 60), (2, 4), (12, 20)" se va ,,2"
(prima a doua
8. Pentru n numere complexe, li se cunosc partea cea
se n ordine valorile modulelor ce nu intervalului [a, b].
Valorile reale a b se citesc de la Modulele rezultate vor fi cu 3
zecimale.
9. Pentru o de n elevi se cunosc date: numele, prenumele, vrsta
Se realizarea unui tabel care doar elevii care au
mplinit 14 ani care au n intervalul [hl, h2]. Elevii vor fi
nume, iar n unor nume identice, vor fi
prenume. Se va pentru fiecare elev, numele, prenumele

10. Se un de n puncte n plan, pentru fiecare cunoscndu-se
coordonatele ntregi (x, y). se realizeze un program care un de
n, n interiorul se maxim de puncte. Punctele aflate pe
laturile se vor considera n "interiorul" lui. Se vor coordonatele
stnga-jos al determinat, care va fi obligatoriu unul dintre cele n
puncte date.
Exemplu: Pentru n=5 punctele (-10,-5), (4,1), (3,3), (1,2), (10,8) se va (1,2).
11. Se un de n puncte n plan, pentru fiecare cunoscndu-se
coordonatele ntregi, (x, y). se realizeze un program care
maxim de puncte coliniare situate pe o cu axa ax.
49
!!!!!!!!!!!!!
out.txt
4/16
10/10
10/8
final.txt
Micu M. 10.00
Ionescu M. 9.00
Mincu A. 7.50
Udrea V. 7. OO
Voicu B. 7.00
Dan 1. 5.50
Exemplu: Pentru n=6 punctele ,,(-10,-5), (4,-5), (3,3), (1,2), (10,3), (5, 3)" se va
,,3".
12. Se un de n puncte n plan, pentru fiecare cunoscndu-se
coordonatele ntregi (x, y). se realizeze un program care de
puncte care se n afara unui triunghi, pentru care se cunosc coordonatele
vrfurilor sale. Punctele aflate pe laturile triunghiului se vor considera n
"interiorul" lui.
Exemplu: Pentru n=6, punctele ,,(0,1), (S,l), (4,2), (5,3), (5,S), (IO, 3)" triunghiul
ale vrfuri au coordonatele ,,(1,1), (5,10), (l0,1)" se va ,,2" (punctele
(0,1) (l0, 3)).
13. Se un de n identificate prin numitor se
din toate ireductibile. reductibile vor fi n
ordinea a valorilor. n in.txt se va citi de pe fiecare linie
perechea: numitor. rezultate vor fi n format n
text out.txt.
Exemplu: Pentru in.txt
5
10 8
7 8
5 9
10 10
4 16
14. Se note.txt nume.txt. Unul pe fiecare linie cte
numere reprezentnd notele la chimie ale unor elevi, iar pe liniile
din se numele acestora. se creeze un nou
final.txt, n care pe fiecare linie se numele elevului media la
chimie cu zecimale. Cele valori vor fi n cadrul
liniilor prin cte un Elevii vor fi n ordinea a mediilor,
iar la.medii egale, nume.
Exemplu: note.txt nume.txt
108 Ionescu M.
7 8 Mincu A.
5 9 Voicu B.
10 10 Micu M.
6 8 Udrea V.
5 6 Dan I.
15. ntr-o n clase de a XII-a, fiecare cu cte m elevi. Pentru fiecare
dintre se cunosc: numele prenumele, clasa din care face
printr-o mediile semestriale.
un program care
numele prenumele de
lista pe clase a elevilor care nu vor examenul de bacalaureat,
nume prenume.
50
n date.txt se vor citi, de pe prima linie, valorile lui n m, apoi, de pe
fiecare linie, referitoare la fiecare dintre cei n*m elevi, n ordinea:
clasa, nume, prenume, media semestru 1 media semestrul 2. Valorile vor fi
prin cte un Un elev care are o sau este
corigent la o va avea media 0.00.
rezultatelor se va face la standard.
Exemplu: Pentru date.txt se va
2 2 a)Sef de promotie: Savu Ion
A Ion Ion 7.009.00 b)
A Mia Vlad 5.00 0.00 XII A: Mia Vlad
B Ilie Ana 0.00 10.00 XII B: Ilie Ana
B Savu Ion 10.00 9.00
simultan ntre:
se va
Toate filmele
13.30 14.00
Lista
3, 2, 4, 1
15.00
16.45
14.30
14.00
Se un cinematograf n care n (numerotate de la 1 la n),
destinate filmelor. Se fiecare se deschide publicului o
pe zi, pentru o 'Cunoscndu-se cele n intervale orare [a,b],
(a b numere reale) n care au loc n fiecare se identifice
intervalul maxim n care toate sunt deschise simultan publicului lista
n ordinea a orei de nceput a
Din text film. in se citesc datele de intrare n formatul pe prima
linie, de iar pe n linii, perechi de numere reale cu
zecimale reprezentnd ora minutul nceputului, respectiv
filmului, n ordine ncepnd cu sala 1.
Exemplu: Pentru film. in
4
13.30
12.45
11.30
13.00
Probleme de concurs ce date structurare
1.3.1 Probleme rezolvate
1. **) de i elevului prilejul de a se odihni,
de a citi de a se juca. Este prea scurt timpul pentru mai face teme ... Printre
,jocurile clasice" ale a descoperit un joc cu Tabla de joc are
de-a lungul ei, pe mijloc, un cu numerotate de la 1 la Pe
sunt plasate, n cu stng ntr-o au
lungimi diferite. Regula jocului este de a elimina ct mai pentru a
un maxim de care nu se ating. un program care
determine maxim de pe care le poate
de intrare bete.in pe prima linie o valoare n<5000,
reprezentnd de pe tabla de joc, iar pe n linii cte
valori poz lung (poz+lung<32767), separate printr-un singur
reprezentnd pe respectiv lungimea
de bete. out va o valoare reprezentnd
maxim de pe astfel nct acestea nu se
Exemplu:
4
1 1
2 1
3 1
4 1
bete.in
2
bete. out
Solutie:
Fiecare pe tabla de joc poate reprezenta un interval de [paZi>
pozi+lungi] pe care le pe Astfel, problema se reduce la a determina o
de intervale care nu se Se intervalele
drept se intervalele n o strategie greedy.
1 type interval=record poz,lung:integer; end;
2 ar n,i,j,nr:integer; t:interval;
3 a:array[1 .. 5000] of interval;
4 egin
5 assign(input, 'bete.in'); reset(input); read(n);
6 for i:=l to n do begin
7 read(a[i].poz,a[i] .lung);
8 ali] .lung:=a[i] .lung+a[i] .poz;
9 end;
10 for i:=l to n do
11 for j:=i+l to n do
12 if ali] .lung>a[j] . lung then begin
13 t:=a[i]; ali] :=a[j]; a[j] :=t; end;
14 nr:=l;j:=l;
15 for i:=2 to n do
16 if a[j] .lung<a[i] .poz then begin inc(nr); j:=i; end;
17 assign(output, 'bete.out'); rewrite(output); writeln(nr);
18 end.
j=i; }
printf("%d\n" ,nr);
#include <stdio.h>
typedef struct { int poz,lung; } interval;
interval a[5000] ,t; int n;
oid main() {
int i,j,nr;
freopen ("bete. in" , "r" , stdin); scanf (" %d" , &n) ;
for (i=O;i<n;i++) {
scanf("%d%d",&a[i] .poz,&a[i] .lung); ali] .lung+=a[i] .poz;
1
2
3
4
5
6
7
8
9 }
10 for (i=O;i<n;i++)
11 for (j=i+l;j<n;j++)
12 if (a[i] .lung>a[j] . lung)
13 { t=a[i]; a[i]=a[j]; a[j]=t;
14 for (nr=l,i=l,j=O;i<n;i++)
15 if (a[j] .lung<a[i] .poz) { nr++;
16 freopen( "bete. out" , "w", stdout);
17 }
52
2. (Camion - ****) La firma la care Gigel M 600 tipuri de
camioane, din fiecare tip existnd N 600 exemplare. Gigel camioanele
firmei pe N rnduri, pe fiecare numai camioane de tip. Se
astfel o matrice n care liniile sunt numerotate de sus n jos de la 1 la N,
iar coloanele sunt numerotate de la stnga la dreapta de la 1 la M. n fiecare noapte
vine o de bandei "n noaptea aceasta vom fura toate
camioanele care se n zona avnd stnga-sus pe linia xl
coloana yl, iar opus pe linia x2 coloana y2. n
Gigel vede acest lucru, furtul: pe fiecare linie n care
libere, spre stnga toate camioanele care se n dreapta locului liber
De exemplu, pentru N=3 M=5 avem amplasare:
1 2 3 4 5
12345
1 234 5
n prima noapte camioane, din dreptunghiul cu stnga-sus n linia
2,coloana dreapta-jos linia 3 coloana 3. Astfel, n ziua
ce Gigel camioanele, amplasarea va fi
12345
145
145
Cunoscnd cte tipuri de camioane la pe cte randuri au fost
30000 de zile n care au loc furturi coordonatele
dreptunghiurilor din care n fiecare noapte, ce tipuri de
camioane se pe o din amplasarea
de intrare camion.in pe prima linie 4 numere naturale: N M K C,
reprezentnd de rnduri pe care au fost camioanele, de
coloane, de n care vor fura camioane, respectiv
coloanei pentru care se se afle ce tipuri de camioane la final. Pe
fiecare dintre K linii se vor afla cte 4 numere naturale. Pe linia i+1 se
xl yl x2 y2, (xl,y1), reprezentnd linia coloana stnga-sus, iar
(x2,y2) linia coloana dreapta-jos al dreptunghiului din care n
noaptea i. Nu este obligatoriu ca dreptunghiul din care se va efectua un furt
camioane n fiecare loc. Numerele situate pe linie sunt separate prin
cte un
de camion. out, va N linii, pe fiecare cte un ntreg.
de pe linia i va reprezenta tipul camionului de pe linia i coloana C,
K zile. n caz pe linia i nu se nici un camion, se va valoarea O
pe linia
Exemplu:
353 1
2 2 3 3
113 2
1 2 3 4
camion. in
3
5
5
camion. out
53
Solutie-i problema separat pentru fiecare linie, astfel transformndu-se
problema ntr-una Pentru a rezolva problema se
n ordine transformnd procesul de eliminare
ntr-unul de inserare. Cum se cere doar coloana C, la fiecare pas se cont doar
de elementul care se va afla pe acea Dimensiunile datelor impun folosirea
compilatoarelor Free Pascal sau GCC.
1 type op=record xl,yl,x2,y2:integer; end;
2 var n,m,k,c,i,j,t:integer; a:array[l. .30000] of op :
3 begin
4 assign(input, 'camion.in'); reset(input);
5 read(n,m,k,c);
6 for i:=l to k do
7 read (a [ i] . xl, a [ i] . yl, a [ i] . x2 , a [ i] . y2) ;
8 assign(output, 'camion.out'); rewrite(output);
9 for i:=l to n do begin
10 t:=c;
11 for j:=k downto 1 do
12 if. (a[j] .xl<=i)and(i<=a[j] .x2)and(a[j] .yl<=t) then
13 t:=t+a[j] .y2-a[j] .yl+l;
14 if t<=m then writeln(t) else writeln(O);
15 end;
end.
1 #include <stdio.h>
2 typedef struct { int xl,yl,x2,y2; } op;
3 op a[30000]; int n,m,k,c;
voidmain() {
5 int i,j,t;
6 freopen("camion.in", "r", stdin);
7 scanf ( "%d%d%d%d" , &n, &m, &c, &k) ;
8 for (i=O;i<k;i++) .
9 .xl,&a[i] .yl,&a[i] .x2,&a[i] .y2);
10 freopen("camion.out", "w" ,stdout);
11 for (i=l;i<=n;i++) {
12 for (t=c, j=k-l;j>=O;j--)
13 if (a[j] .xl<=i&&i<=a[j] .x2&&a[j] .yl<=t)
14 t+=a[j] .y2-'a[j] .yl+l;
15 printf ( "%d\n" , t<=m?t: O) ;
16 }
17}
3. (Reactivi - **) ntr-un laborator de analize chimice se N:S8000
reactivi. Se pentru a evita accidentele sau deprecierea reactivilor,
trebuie fie n de mediu speciale. Mai exact, pentru fiecare reactiv
x se intervalul de [min., max.] (-100:S min., maxx:S 100) n
care trebuie se ncadreze temperatura de stocare a acestuia. Reactivii vor fi
n frigidere. Orice frigider are un dispozitiv cu ajutorul putem stabili
temperatura care va fi n interiorul acelui frigider ntr-un
ntreg de grade Celsius). un program care determine
minim de frigidere necesare pentru stocarea reactivilor chimiei, un frigider
poate un nelimitat de reactivi.
54
55
Solutie:
Se sorteaza intervalele de temperatura iar intervalele
care se se vor "uni" ntr-un singur interval. de intervale
va reprezenta
de intrare react.in pe prima linie natural N, care
de reactivi, iar pe fiecare dintre N linii se min max
numere ntregi separate printr-un numerele de pe linia x+l
temperatura respectiv temperatura de stocare a reactivului x.
de react.out va o linie pe care este scris
minim de frigidere necesar.
Exemplu:
(OJ.I.2004, clasa a IX-a)
react.out
3
react.in
1 type interval=record x,y:integer; end;
2 ar n,i,j,nr:integer; t:interval;
3 a:array[l. .8000] of interval;
4 egin
5 assign(input, 'react.in'); reset(input) ;read(n);
6 for i:=l to n do read(a[i] .x,a[i] .y);
7 for i:=l to n do
8 for j:=i+1 to n do
9 if ali] .y>a[j].y then begin
10 t:=a[i]; ali] :=a[j]; a[j] :=t; end;
11 nr:=l; j:=l;
12 for i:=2 to n do
13 if a[j] .y<a[i].x then begin inc(nr); j:=i; end;
14 assign(output, 'react.out'); rewrite(output); writeln(nr);
15 end.
1 #include <stdio.h>
2 typedef struct { int x,y; } interval;
3 interval a[8000],t; int n;
4 oid main () {
5 int i, j r nr ;
6 freopen (" react. in" , "r" , stdin); scanf ( "%d" r &n) ;
7 for (i=O;i<n;i++) scanf("%d%d",&a[i] .x,&a[i] .y);
8 for (i=O;i<n;i++)
9 for (j=i+1;j<n;j++)
10 if (a[i] .y>a[j] .y)
11 { t=a[i]; a[i]=a[j]; a[j]=t;
12 for (nr=l,i=l,j=O;i<n;i++)
13 if (a[j].y<a[i].x){ nr++; j=i; }
14 freopen ("react. out" , "w" , stdout); printf (" %d\n" , nr) ;
15 }
4
2 5
5 7
10 20
30 40
litere. out
I ESTT
litere.in
TETS
4. (Litere ***) Se un de litere mari ale alfabetului latin de lungime
cel mult 10000. Acest se pe prima linie a unei matrice A, avnd
dimensiunea cu lungimea linie a matricei A se
prin permutarea la stnga cu o a elementelor de pe prima linie.
se pentru linii: linia i se prin permutarea la
stnga cu o a elementelor de pe linia i-I. n continuare, se o
matrice B care liniile matricei A, ordonate lexicografic. De exemplu,
de caractere considerat este TEST, atunci matricea A va avea

TEST
ESTT
STTE
TTES
Ordonnd lexicografic liniile matricei A, se matricea B:
ESTT
STTE
TEST
TTES
Se cunosc caracterele de pe ultima a matricei B se cere determinarea
caracterelor de pe prima linie a acesteia.
de intrare litere.in o linie pe care se caracterele de pe
ultima a matricei B.
de litere. out va o linie pe care se vor afla caracterele
de pe prima linie a matricei B.
Exemplu:
Solutie:
Algoritmul de rezolvare al acestei probleme n
se de a literelor, ceea ce permite
primei coloane a matricei (prima ntotdeauna literele
ordonate).
se un de A ntre literele de pe prima
cele de pe ultima, cont de faptul celei dea i-a a literei c de
pe prima i corespunde cea de-a i-a a literei c de peultima.
pentru determinarea cerut, se scriu literele
A[I], A[A[l]], A[A[A[I]]], etc.; pentru aceasta se un indice i care,
fiecare pas va primi valoareaA[i].
1 ar n,i,j:integeri c:chari
2 nr:array[ 'A' .. 'Z'] of integeri
3 A:array[l .. lOOOO] of integeri
4 x:array[l .. lOOOO] of chari
5 egin
6 assign(input, 'litere.in'); reset(input);
7 while not seekeof(input) do begin inc(n); read(x[n]); end;
8 for i:=l to n do inc(nr[x[i]]);
9 for c:='B' to 'Z' do inc(nr[c],nr[pred(c)]);
56
!!!!!!!!!!!
l0lfor i:=n downto 1 do begin A[nr[x[i]]]:=i; dec(nr[x[i]]);
11 assign(output, 'litere.out'); rewrite(output) ;j:=i;
12 for i:=i to n do begin
13 write(x[A[j]]); j:=A[j];
14 end;writeln;
15 nd.
end;
1 #include <stdio.h>
2 #include <string.h>
3 har x[lOOOl];int n,nr[256],A[lOOOO];
4 oid main () {
5 int i, j;
6 freopen("litere.in", "r" ,stdin);
7 scanf("%s\n",x); n=strlen(x);
8 for (i=O;i<n;i++) nr[x[i]]++;
9 for (i='A' ;i<='Z' ;i++) nr[i]+=nr[i-i];
10 A[--nr[x[i]]]=i;
11 fre;];?en( "litere.out", "w" I stdout);
12 for (i=j=O; i<n; i++, j=A[j]) printf ("%c" ,x[A[j]]);
13 put.char ( '\n' ) ;
14 }
Incercam sa lucram cu coduri si criptari.
criptam are 7 litere
criptam
2635714
abcdefghijklmnopqrstuvwxzy
1 2 3 4 567
sa cui coduri] si
2635714
Incerca
m*sa*lu
cram*cu
*coduri
*si*cri
ptari.*
clcrr.Imc**pcsaoiaauuii*eamd*rn*rcstr**uci
coli co12 co13 co14 co15 co16 co17
mesaj criptat
n grupe
codificare
5. (Criptare. *) Mircea vor mesaje pe care nu le
Au citit ei despre spioni despre de a scrie mesaje n final,
au imaginat un mod de criptare a unui mesaj care "cuvnt cheie" (le-a
lor denumirea acesta). un cuvnt cheie (cuvntul cheie are
minimum 5 maximum 20 de caractere), format numai din litere mici distincte, ei
literele acestuia mpart mesajul n grupe de lungime cu de
litere ale cuvntului cheie, le una sub alta. Desigur, se poate ntmpla ca
ultima fie o cu Apoi
literele cuvntului cheie n ordinea lor n alfabetul englezesc. n final,
rescriu mesajul astfel: coloana de sub litera cu 1, de coloana de
sub litera cu 2, etc. nlocuind cu caracterul '*'
(asterisc). Spre exemplu:
cuvntul cheie
mesaj de criptat
cuvntul cheie
numerotare
deoarece, avem, n ordine
57
Fiind date un cuvnt cheie un mesaj criptat, mesajul trimis de
Mircea pentru
de intrare criptare. in pe prima linie mesajul criptat, iar pe linia a
doua cuvntul cheie. Lungimea mesajului este de minimum 20 maximum 1000
caractere.
de intrare criptare. out pe prima linie mesajul decriptat.
Exemplu:
criptare. in
clcrr.Imc**pcsaoiaauuii*eamd*rn*rcstr**uci
criptam
criptare. out
Incercam sa lucram cu
coduri si criptari.
(O.N.I.2003, clasa a IX-a)
Solutie:
Pentru decriptarea mesajului, se algoritmul de criptare descris n sens
invers:
se mparte mesajul n fragmente;
se ntr-o matrice de caractere;
se n cuvntul cheie, ordinea caracterelor din alfabet;
se pe rnd coloanele n ordine.
ar n,m,i,j,t:integer;
sl,s2:array[1 .. 1000] of char;
a:array[O .. 200,1 .. 20] of char;
egin
assign{input, 'criptare.in'); reset{input);
vhi.le not seekeoJn(input) do begin
inc{n);
read{sl lnl ) ;
end;
10 readJn;
11 while not seekeoln (input) do begin inc (m); read (s2 [m] ); end;
12 for i:=l to m do begin
13 t:=O;
14 for j:=l to m do
15 if s2[j]<s2[i] then inc{t);
16 for j:={n div m)*t to {n div m)*{t+1)-1 do
17 a[j mod (n div m) ,i] :=sl[j+l];
18 end;
19 assign{output, 'criptare.out');rewrite{output);
20 for i:=O to (n div m)-l do
21 for j:=l to m do
22 if (a[i,j]<>'*')and{a[i,j]<>#O) then
23 write{a[i,j])
24 else if (a[i,j]=#O) then begin
25 i:=n div m;j:=m+1;
26 end else
27 write{' ');
28 writeln;
29 end.
58
}
freopen ( "criptare. out" r "w" ,stdout) ;
for (i=O;i<n/m;i++)
for (j=O;j<m;j++)
if (a [i] [j] &&a [i] [j] ! = ' * ') putchar (a [i] [j] ) ;
if (!a[i] [j]) i=n/m,j=m;
else putchar(' ');
put char t ' \n');
} .
1 #include <stdio.h>
2 #include <string.h>
3 int n,m; char sl[1001] ,s2[1001],a[201] [21];
4 oid main () {
5 int i, j, t;
6 freopen ( "criptare. in" , "r " ,stdin) ;
7 scanf("%s\n%s",sl,s2); n=strlen(sl); m=strlen(s2);
8 for (i=O;i<m;i++){
9 for (t=j=O;j<m;j++) if (s2[j]<s2[i])t++;
10 for(j=(n/m)*t;jn/m)*(t+1) ;j++)
11 a[j%(n/m)] [i]=sl[j];
12
13
14
15
16
17
18
19
20
6. (Codificare - *) Doru doi elevi vor comunice ntre ei
n timpul orelor, prin texte codificate. Pentru acest lucru ei ajung la ideea nu
trebuie secomplice prea mult pentru a putea decodifica textele. Astfel ei
fiecare cuvnt schimbnd ntre ele prima cu ultima apoi a doua
cu penultima mai departe (spre exemplu, cuvntul acest va fi codificat
prin tseca ). Pentru a simplifica comunicarea ei vor utiliza numai texte formate din
litere mici ale alfabetului englezesc nu vor fi codificate, ele fiind
pe n text. cuvinte vor fi separate printr-unul sau prin
mai multe De la se un text cu maximum 80 de caractere, iar
textul codificat va fi de programul vostru pe ecran.
Exemplu:
mircea a
intrare
spart un geam Iaecrim a
iesire
traps nu maeg
Solutie:
Se mparte textul n cuvinte, se fiecare cuvnt.
1 ar n,i,j,st,dr:integer; s:string[80];
2 egin
3 read(s);s:=s+' '; n:=length(s);
4 st:=O; dr:=O;
5 for i:=l to n do
6 if s[i]=' , then begin
7 j:=dr;
8 while (j>=st)and(j>O)do begin
9 wri te (s [j ] ) ;
10 dec(j);
11 end;
12 wri te (' ');
13 st:=O;
14 dr:=O;
15 end
59
L6.l el se begin
17 if st=O then st:=i;
18 dr:=i;
19 end;
20 writeln;
21 nd.
1 #include <stdio.h>
2 #include <string.h>
3 har s[81];int n;
4 oid main ( ) {
5 int i,j,st,dr;
6 gets(s); strcat(s, I '); n=strlen(s);
7 for (st=dr=-l,i=O;i<n;i++)
8 if (s[i]==' ') {
9 for (j=dr;j>=st&&j>=O;j--)
10 putchar(s[j]);
11 st=dr=-l; putchar(' ');
12 }
13 else {
14 if (st==-l)st=i;
15 dr=i;}
16 putchar(' \n');
17 }
7. - *)
a, b, ba, bab, babba, babbabab,
care este cel de-al n-lea termen al n:'S20.
de intrare sir. in o linie pe care se natural n.
sir.out va o linie pe care se al n-lea termen
din
Exemplu:
4
sir.in sir. out
(0.1.1.2003, clasa a VII-a)
Solutie:
de caractere este cunoscut ca de caractere Fibonacci", deoarece este
format n mod celui matematic, Fibonacci. de lungime n va avea
lungime Fib(n).
1 ar n,i,j,k:integer;
2 sl,s2,s3:array[1 .. 15000] of char;
3 egin
4 sl[l]:='a'; s2[1]:='b';
5 assign(input, 'sir.in'); reset(input); read(n);
6 for i:=3 to n do begin
7 s3:=s2;
8 j:=l;while s3[j]<>#O do inc(j);
9 k:=l;while sl[k]<>#O do begin s3[j]:=sl[k];inc(j);inc(k); end;
10 sl:=s2;s2:=s3;
11 end;
60

.1.. 2 .: 'sir.out'); rewrite(output);


13 i:=l; while s3[i]<>#0 do begin write(s3[i]); inc(i); end;
14 riteln;
15 nd.
par. out par.in
#include <stdio.h>
#include <string.h>
int n; char sl[15000]="a", s2[15000]="b", s3[15000];
oid main() {
int i;
freopen( "sir. in", "r", stdin); scanf ("%d" ,&n);
for (i=3; i<=n; i++) {
strcpy(s3,s2);
strcat(s3,sl);
strcpy(sl, s2);
strcpy(s2,s3) ;}
f r eopen ( "sir. out" , "w" ,stdout); printf (" %s \n" ,s3) ;
}
8 Da
6 O 2 3 1 O 1
Da
6 2 O 1 O 1 3
Nu
4 O 2 1 3
Nu
6 2 O O 3 1 1
Nu
Nu
6 2 2 O 1 1 3
Da
6 2 O O 1 3 O
Da
10 2 2 O 1 O 1 3 3 O 1
10 O O O 1 1 1 O 2 3 1
(O.J.I. 2003, clasa a VII-a)
61
!!!!!!!!!!
8. (Paranteze - **) formate din paranteze de tipuri:
paranteze rotunde paranteze drepte. Parantezele se n felul
cu 0, cu 1,
cu 2l' cu 3. Spre deosebire de
din aici pot exista paranteze rotunde incluse n paranteze drepte
paranteze drepte incluse n paranteze rotunde. Nu putem asocia unei paranteze
rotunde deschise o sau viceversa. se un
astfel de este corect construit, n sensul putem asocia corect cte
paranteze de fiecare tip.
text par.in pe prima linie n<.S.10 de ale
testului). Apoi pe fiecare din liniile 2.. .n+1 se numerele:
L CI C2 ... CL
natural lungimea unui de paranteze codificat
conform Valorile ChC2, ... ,CL codurile respective. Toate
numerele sunt prin cte un
n text par. out se vor scrie n linii. Pe cte o linie va fi scris cte un mesaj.
Pe fiecare linie se va scrie unul dintre mesajele 'Da', respectiv 'Nu', reprezentnd
rezultatele corectitudinii Ordinea lor corespunde ordinii
din de intrare. Exemplu:
Solutie:
Pentru a verifica o este se va folosi o de date
Se parcurge caracter cu caracter, iar cnd caracterul curent este o
se introduce n vrful stivei; cnd caracterul curent este o
se paranteza din vrful stivei este de
tip cu cea se din vrful stivei, altfel se scrie "Nu". La
parcurgerii se "Nu" stiva nu este
1 type stiva=record
2 nr:integer; inf:array[l .. 500] of byte;
3 nd;
4 ar n,i,j,l,x:integer; ok:boolean; st:stiva;
5 egin
6 assign(input, 'par.in'); reset(input);
7 assign(output, 'par.out'); rewrite(output);
8 readln (n) ;
9 for i:=l to n do begin
10 read(l); ok:=true; st.nr:=O;
11 for j: =1 to 1 do begin
12 read(x);
13 if (x=0)or(x=2) then begin
14 inc(st.nr); st.inf[st.nr] :=x;
15 end else begin
16 if (st.nr=O)or(x<>st.inf[st.nr]+l) then ok:=false;
dec (st .nr) ;
18 end;
19 end;
20 if (ok)and(st.nr<>O) then ok:=false;
21 if ok then writeln('Da') else writeln('Nu');
22 end;
23 end.
#include <stdio.h>
typedef struct { int nz : char inf[500]; } stiva;
stiva st; int n,l;
oid main() {
int i,j,x,ok;
freopen("par.in", "r",stdin);
freopen ("par. out" , "w" , stdout) ;
scanf ("%d", &n) ;
9 for (i=O;i<n;i++) {
lD scanf("%d",&l); ok=l; st.nr=O;
11 for (j=O;j<l;j++){
12 scanf("%d",&x);
13 if (x==01Ix==2) st.inf[st.nr++]=x;
14 else {
15 if (lst.nrllxl=st.inf[st.nr-1]+1) ok=O;
16 st.nr--;
17 }
18 }
19 if (ok&&st.nr) ok=O;
20 printf ("%s\n" ,ok?"Da": "Nu");
21 }
22 }
62
63
Solutie:
mparte textul n cuvinte, apoi se ia fiecare pereche de cuvinte se
sunt anagrame.
text.out
rac car
arac acar
ropot topor
bca cab
bca bac
cab bac
ar n,m,i,j,k,st,dr:integer;c:char;
s:array[l .. 10000] of char;
w:array[l .. 100] of string[10];
nr:array[#O .. #255] of byte;
egin
assign(input, 'text.in'); reset(input);
while not eof(input) do begin inc(n); read(s[n]); end;
inc(n); s[n] :=' '; st:=O;dr:=O;
for i:=l to n do
O if (s[i]=' ')or(s[i]=',')or(s[i]=';')or(s[i]=':')or(s[i]='.') thenbegin
11 if st=O then continue;
12 inc (m);
13 for j:=st to dr do w[m] :=w[m]+s[j];
14 st:=O;
15 dr:=O;
16 end el se begin
17 if st=O then st:=i;
18 dr:=i; end;
19 assign(output, 'text.out'); rewrite(output);
20 for i:=l to n do
21 for j:=i+1 to n do
22 if length(w[i])=length(w[j]) then begin
23 fillchar(nr,sizeof(nr) ,O);
24 for k:=l tolength(w[i]) do inc(nr[w[i,k]]);
25 for k:=l to length(w[j]) do dec(nr[w[j,k]]);
26 for c:=#O to #255 do if nr[c]>O then break;
27 if c=#255 then writeln(w[i], ' ',w[j]);
28 end;
29 end.
text. in
rac acar.topor,car;ropot:arac bca cab bac.
(Text *) Se un text format din mai multe cuvinte separate prin anumite
adere. Aceste caractere de separare pot fi: punct, punct
sau puncte. se determine toate perechile de cuvinte ce pot fi
prin anagramare, unul din altul.
de intrare text.in (pe mai multe linii, eventual) textul de parcurs, iar
de text.out trebuie pe linii separate perechi de cuvinte din
text cu proprietatea unul poate fi anagramarea celuilalt. Nu se va face
ntre litere mari litere mici, iar un cuvnt poate avea maximum. 10 litere, iar tot
extul, cel mult 100 de cuvinte.
Exemplu:
#include <stdio.h>
#include <string.h>
int n; char s [10000] ,w [101] [11] ,*p,nr [256] ;
oid main{) {
5 int i,j,k;
6 freopen{"text.in" , "r",stdin); gets{s);
7 p=strtok{s," .,;:");
8 for (; p; p=strtok{NULL," .,;:")) strcpy{w[n++],p);
9 freopen{"text.out", "w" ,stdout);
10 for (i=O;i<n;i++)
11 for (j=i+1;j<n;j++)
12 if (strlen{w[i])==strlen(w[j]))
13 {
14 mernset(nr,O,sizeof{nr));
15 for (k=O;w[i] [k] ;k++) nr[w[i] [k]]++;
16 for {k=O;w[j] [k];k++) nr[w[j] [k]]--;
17 for (k=0;k<256;k++) if (nr[k]) break;
18 if (k==256) printf{"%s %s\n",w[i],w[j]);
19 }
20 }
10. - **) Numerele pozitive sunt acele numere care sunt egale
cu m/n, cu m n numere naturale, prime ntre ele, :::: 32.000. un mod foarte
interesant de a toate numerele pentru nceput, se trei
numere: 0/1 O, 1/1 1 1/0 un fel de infinit. Pornind de la acestea
putem un nou de numere combinnd numere consecutive.
Se aleg cele numere. Fie ele de tipul alb c/d. Noul rezultat este
(a+c)/(b+d) se pune ntre cele De exemplu primului i 0/1,
(0+1)/(1+1), 1/2, 1/1, (1+1)/(1+0) 2, 1/0. Prin acest procedeu se poate
genera un fel de arbore:
Pe nivelul Ose 0/1 1/0;
Pe nivelul I se 0/1, 1/1, 1/0;
Pe nivelul 2 se 0/1, 1/2, 1/1,211, 1/0;
Pe nivelul 3 se 011,1/3,1/2,2/3, 111,3/2,2/1,311, 1/0.
Vi se cere drumul pe care trebuie l n arbore, pentru a
ajunge la o Traseul ncepe din vrf (1/1) merge la fiecare pas, fie
spre stnga, fie spre dreapta. De exemplu, ca de 2/3 mergem prima n
stnga a doua n dreapta.
0/1
III
IlO
113 2/3 3/2 3/1
64
!!!!!!!!!!
65

Pentru fiecare din arbore, la stnga se numai mai mici, iar la
dreapta numai mai mari. Astfel, de fiecare se cu
se decide n ce se va merge.
rational. out
S
S
S
1 type fractie=record a,b:double; end;

3 egin"
4 assigh(input, 'rational.in'); reset(input);
5 readln\tmp.a,tmp.b);
6 assign(output, 'rational.out'); rewrite(outputl;
7 st.a:=O; st.b:=l;
8 mij.a:=l; mij.b:=l;
9 dr.a:=l;'dr.b:=O;
10 while tmp.a/tmp.b<>mij .a/mij.b do
11 if tmp.a/tmp.b<mij.a/mij.b then begin
12 writeln('S');
13 dr:=mij; mij.a:=mij.a+st.a; mij.b:=mij.b+st.b;
14 end
15 else begin
16 writeln('D');
17 st:=mij; mij.a:=mij.a+dr.a; mij.b:=mij.b+dr.b;
18 end;
19 nd.
1 #include <stdio.h>
2 typedef struct{ double a, b; } fractie;
3 fractie st,mij,dr,tmp;
4 oid main () {
5 freopen("rational.in" , "r",stdin);
6 scanf ("%lf\n%lf\n", &tmp.a, &tmp.b);
7 freopen("rational.out","w",stdout);
8 st.a=O; st.b=l;
9 mij.a=l; mij.b=l;
10 dr.a=l; dr.b=O;
11 while (tmp.a/tmp.b!=mij.a/mij.b)
12 if (tmp.a/tmp.b<mij.a/mij.b) {
13 printf("S\n");
14 dr=mij; mij.a+=st.a; mij.b+=st.b;
15 } else {
16 printf("D\n");
17 st=mij; mij.a+=dr.a; mij.b+=dr.b;
18 }
19
Din rational.in se citesc numere m n, separate printr-un alb
reprezentnd pe care l (mln).
n rational. out se vor scrie pe care i ("S" de la stnga sau "D"
de la dreapta) cte unul pe linie.
Exemplu: rational. in
1
4
11. - ***) Pentru o oarecare de numere ntregi cu N elemente
se poate defini o permutare a acesteia ca fiind o de a elementele
De exemplu, pentru M={ 4,12,81} vom avea
1) { 4 12 81 }
2) { 4 81 12 }
3) { 12 4 81 }
4) { 12 81 , 4 }
5) { 81 4 12 }
6) { 81 12 4 }
n grupul format de toate unei se poate defini o ordine a
acestora astfel nct elementele aflate pe prima fie n ordine
elementele de pe a doua fie n ordine pentru care
au primul element identic, etc. cum se vede n O astfel de ordine se
ordine lor n ordine li se pot
asocia numere de ordine: n cazul exemplului de mai sus, de la 1) la 6).
Dndu-se o de numere ntregi o permutare a ei, un program
care de ordine al n ordine
de intrare perm.in pe prima linie de elemente al
1 ::s N::S 1.000, pe a doua linie elementele n ordine
1 ::s mi::S 2.000.000.000, pe a treia linie elementele (elementele mi
.. , mN, dar n ordine)
de perm.out va n ordine
Exemplu: perm. in perm. out
4 17
1 2 3 4
3 4 1 2
(http://infoarena.devnet.ro)
Solutie: Se permutarea cu o permutare dar cu elemente
cu valori ntre 1 N, nlocuind fiecare termen cu lui n Apoi, se
parcurge permutarea element cu element se la rezultat cte de
lungime se primul element se permutarea.
Ar trebui implementate numere mari pentru rezultatului;
implementare ca pentru cititor.
1 ar n,i,j:integer; fact,rez:longint;
2 m,p:array[1 .. 1000] of longint;
3 egin
4 assign(input, 'perm.in'); reset(input);
5 readln (n) ;
6 for i:=l to n do read(m[i]);
7 for i:=l to n do begin
8 read(p[i]);
9 for j:=l to n do
10 if m[j ] =p [ i] then break;
11 p[i] :=j-1;
12 end;
66
13 fact:=l; rez:=l;
14 for i:=2 to n-1 do fact:=fact*i;
15 for i: =1 to n do begin
16 inc(rez,p[i]*fact);
17 for j :=i+1 to n do
18 if p[j]>p[i] then dec(p[j]);
19 if i<n then fact:=fact div (n-i);
20 end;
21 assign(output, 'perm.out'); rewrite(output);
22 writeln(rez);
23 end.
1 #include <stdio.h>
2 int n; long m[1000],p[1000];
3 oid main () {
4 int i,j; long fact,rez=l;
5 freopen ("perm. in" , "r", stdin) ;
6 scarl:f("%d",&n);
7 for (\i=O;i<n;i++) scanf("%ld",m+i);
8 for (i=O;i<n;i++) {
9 scanf ("%ld" ,p+i);
10 for (j=O;j<n;j++) if (m[j]==p[i]) break;
11 p[i]=j;
12 }
13 for(fact=i=l;i<n;i++) fact*=i;
14 for (i=O;i<n;i++) {
15 rez+=p[i]*fact;
16 for(j=i+1;j<n;j++)
17 if (p[j]>p[i]) p[j]--;
18 if (i+1<n) fact/=(n-i-1);
19 }
20 freopen( "perm. out", "w", stdout) ;
21 printf("%ld\n",rez);
22 }
12. tNumere *) Pe fiecare linie a unui text se mai multe succesiuni
de O 1 (fiecare succesiune ncepe cu 1), fiecare linie un n baza
2. Dndu-se un astfel de un program care determine cel mai mare
par n format zecimal) care n - se
cel un par n
Datele se citesc din numere.in care mai multe linii formate din
succesiuni de O 1, separate prin cte un
Prima linie a numere.out un care va reprezenta cel mai
mare par care n de intrare.
Exemplu:
numere. in numere. out
1 1 1 6
1 O
1 O 1 1
1 1 O 1
1 O
(http://infoarena.devnet.ro)
67
freopen("numere.out", "w", stdout);
printf ("%d\n" .maxl :
}
Solutie:
Se fiecare binar din baza 2 n baza 10 se este par,
caz n care se
1 type binar=record n:integer; cif:array[l .. 100] of byte; end;
2 ar s:string; i,x,nr,max:integer; b:binar;
3 egin
4 assign(input, 'numere.in');reset(input);
5 while not seekeof(input) do begin
6 readln(s);
7 x:=length(s);
8 b.n:=O;
9 i: =1;
10 while ((s[i]='O')or(s[i]='l'))and(i<=x) do begin
11 inc (b.n) ;
12 b. cif [b. n] : =ord (s [i] ) -ord ( , O' ) ;
13 inc(i,2);
14 end;
15 nr:=O;
16 for i:=l to b.n do
17 inc(nr,b.cif[i]*(l shI (b.n-i)));
18 if (nr mod 2=O)and(max<nr) then max:=nr;
19 end;
20 assign(output, 'numere.out'); rewrite(output);
21 writeln(max);
22 nd.
1 <stdio.h>
2 #include <string.h>
3 typedef struct { int n; char cif[100]; } binar;
4 har s [256] ;
5 oid main(void) {
6 int i,nr,max=O; binar b;
7 freopen("numere.in", "r", stdin);
8 while (!feof(stdin)) {
9 memset(s, O, sizeof(s));
10 fgets(s, 255, stdin);
11 for (b.n=i=O;s[il=='o' Ils[i]=='l' ;i+=2)
12 b.cif[b.n++]=s[i]-'O';
13 for (nr=i=O;i<b.n;i++)
14 nr+=b.cif[i]*(1(b.n-i-1));
15 if (nr%2==0 && max<nr) max=nr;
16 }
17
18
19
13. *) Se cu elemente naturale din intervalul
[1,30000]. se determine reuniunea celor
Datele de intrare se citesc din text multimi.in, ce pe prima linie
cardinalul el ::; 30000 al primei pe el linii se elementele
primei (cte un element pe fiecare linie), pe linie se
68
l
!
69
cardinalul c2 S 30000 al celei de-a doua iar pe c2 linii se
elementele celei de-a doua (cte un element pe fiecare linie).
Datele de se n text multimi. out, care are
pe prima linie se va scrie un natural c3, reprezentnd cardinalul
reuniunii celor iar pe c3 linii se vor scrie elementele
reuniunii, n ordine
Exemplu:
1 #include <stdio.h>
2 typedef struct { int n; char elm[3000l]; } multime;
3 ultime a, b;
4 oid main() {
5 int i,x;
6 freopen ("multimi. in" , "r" , stdin) ;
7 scanf("%d",&a.n);
8 for (i=O;i<a.n;i++) { scanf("%d",&x); a.elm[x]=l;
9 scanf("%d",&b.n);
10 for (i=O;i<b.n;i++){ scanf("%d",&x); b.elm[x]=l;
11 for (a.n=0,i=1;i<=30000;i++) t '
12 a.elm[i] I=b.elm[i]; a.n+=a.elm[i];
13 }
(http://infoarena.devnet.ro)
multimi. out
4
1
2
4
10
multimi. in
3
4
2
2
10
2
Solutie: ,
Deoarece au doar elemente din intervalul [1, 30.000], ntr-un
v\ct?r cu elemente dintr-un tip logic un element sau nu
Astfel, procesul de reuniune se
1 type n:integer; elm:arra;y[l. .30000] of l:::oolean; end;
2 ar a,b:multime; i,x:integer;
3 egin
4 assign(input, 'multimi.in'); reset(input)i
5 readln (a. n ) ;
6 for i:=l to a.n do begin readln(x); a.elm[x] :=true; end;
7 readln(b.n);
8 for i:=l to b.n do begin readln(x); b.elm[x] :=true; end;
9 a.n:=O;
10 for i:=l to 30000 do begin
11 a.elm[i] :=a.elm[i] or b.elm[i];
12 if a.elm[i] then inc(a.n);
13 end;
14 assign(output, 'multimi.out'); rewrite(output);
15 writeln(a.n);
16 for i:=l to 30000 do
17 if a.elm[i] then writeln(i);
18 nd.
14 freopen ("multimi. out", "w", stdout) ;
15 printf("%d\n",a.n};
16 for (i=1;i<=30000;i++)
17 if (a.elm[i]) printf("%d\n",i};
18
14. (Bin - *) se determine toate numerele scrise n baza 2, care au n5:.1 Ocifre,
sunt prime exact cifre de 1.
Datele de intrare se citesc din text hin.in, ce pe prima linie
numere naturale n p (n - de cifre, p - de cifre ,,1")
Datele de (numerele ce din se n
text bin.out pe linii separate, n ordine Pe fiecare linie se scriu
numere separate prin n baza 2 transformat n baza 10.
Exemplu:
4 2
bin.in
0011 3
0101 5
bin.out
(http://infoarena.devnet.ro)
Solutie:
Se toate numerele binare de lungime n se care sunt prime au
p cifre de 1.
1 type binar=record n:integer; cif:array[l .. 10] of byte; end;
2 ar n,p,i,j,k:integer;ok:boolean;b:binar;
3 egin
4 assign(input, 'bin.in'};reset(input};
5 assign(output, 'bin.out'};rewrite(output);
6 readln(n,p};
7 for i:=2 to (1 shi n) do begin
8 fillchar(b,sizeof(binar} ,O};
9 j:=i; VJhi.le j>O do begin inc(b.n}; b.cif[b.n] :=j m:xi 2; j:=j div 2; end;
10 k:=O;
11 for j:=l to b.n do inc(k,b.cif[j]};
12 if k<>p then continue;
13 ok: =true;
14 for j:=2 to trunc(sqrt(i)) do
15 if i mod j=O then begin
16 ok:=false; break;
17 end;
18 if not ok then continue;
19 for j:=n downto 1 do write(b.cif[j]};
20 writeln(", i);
21 end;
22 end.
1 <stdio.h>
2 #include <string.h>
3 typedef struct { int
4 int n,p;
5 inar b;
70
n; char cif[10]; } binar;
6 oid.main(){
7 int i, j , k , ok :
8 freopen("bin.in", "r" ,stdin);
9 freopen("bin.out", "w" ,stdout);
10 scanf ("%d%d", &n, &p) ;
11 for (i=2;iln) ;i++) {
12 memset(&b,O,sizeof(binar));
13 for (j=i;j>0;j/=2) b.cif[b.n++]=j%2;
14 for (j=k=O;j<b.n;j++) k+=b.cif[j];
15 if (k!=p) continue;
16 for (ok=1,j=2;j*j<=i;j++)
17 if (i%j==O) { ok=O; break;
18 if (!ok) continue;
19 for (j=n-1;j>=0;j--) printf("%d",b.cif[j]);
20 printf(" %d\n",i);
21 }
22 }
15. tConcert ***) Un grup de N :5 1.000 a primit cnte la un
concert. artist i s-a trimis o pe care acesta era convocat
ntre orele A B :5 2.000.000.000. Oricare doi au intervalele diferite.
organizatorii acestui eveniment au timpurile n care ar fi trebuit
cnte se suprapuneau. fiind nu cnte
dect singuri. De asemenea ei cer li se cere cnte
ora A+1 sau termine nainte de ora B. Un anumit artist poate cnte doar
ntre orele A+1 B de pe Unele pot fi anulate, unii
pot nu cnte deloc. Cunoscndu-se intervalele ntre care poate cnte fiecare
artist, profitul pe care l aduce fiecare artist pe unitatea de timp
cerute n ambele cazuri mai sus, voi trebuie care este suma
care poate fi n concertul respectiv, cum poate fi ea
Profitul adus de fiecare artist sau cerute de fiecare dintre ei nu vor
trece de valoarea 500. se o nu pe unitate de timp.
Pe prima linie a concert. in se va afla N. Pe N linii ale
se vor cte cinci numere separate prin cte un Ele
A, B, profitul pe unitatea de timp n cazul n care artistul nu ncepe
cnte n A+1 respectiv, nu de cntat n B.
Pe prima linie a concert. out se va afla suma care poate fi
din concert.
Exemplu: concert. in concert. ou t
5 189
O 5 10 10 15
3 8 8 8 20
4 10 12 4 10
8 16 7 4 7
12 20 10 5 50
(http://infoarena.devnet.ro)
Solutie:
Se intervalele dreapta iar n caz de egalitate,
stng Se n C[l] suma care poate fi
71
!!!!!!!!!!!!!
din concert, artistul i valoare se n de
valorile CUl (j < i), lund n considerare cazuri: artistul j de
cntat nainte artistul i sau invers.
1 type interval=record a,b,c,p1,p2:longint; end;
2 ar n,i,j,t,rez:longint;
3 tmp:interval;
4 E:array[1 .. 1000] of interval;
5 C:array[1 .. 1000] of longint;
6 egin
7 assign(input, 'concert.in'); reset(input);
8 readln (n) ;
9 for i:=1 to n do read(E[i] .a,E[i] .b,E[i] .c,E[i] .p1,E[i] .p2);
10 for i:=1 to n do
11 for j:=i+1 to n do
12 if (E[i] .b>E[j] .b)or( (E[i] .b=E[j] .b)and(E[i] .a>E[j] .a)) t:hen begin
13 tmp:=E[i];
14 E[i] :=E[j];
15 E [j] : =tmp;
16 end;
17 fori: =1 to n do begin
18 C[i] :=(E[i] .b-E[i] .a)*E[i] .c;
19 for j:=1 to i-l do
20 if E[j] .b<=E[i].a then begin
21 t : =C [ j ] + (E [ i] . b-E [ i] . a) *E [ i] . c ;
22 if C[i]<t then C[i] :=t;
23 end
24 else begin
25 t:=c[j]-E[j] .p2-(E[j] .b-E[i].a)*E[j] .c+(E[i] .b-E[i] .a)*E[i] .c;
26 if C[i]<t then C[i] :=t;
27 t:=C[j]-E[i] .pl+(E[i] .b-E[j] .b)*E[i] .c;
28 if C[i]<t then C[i] :=t;
29 end;
30 if rez<C[i] then rez:=C[i];
31 end;
32 assign(output, 'concert.out');
33 rewrite(output);
34 writeln(rez);
35 end.
1 #include <stdio.h>
2 typedef struct { long a,b,c,p1,p2; } interval;
3 long n,C[lOOO],rez;
4 interval E[1000],tmp;
5 oid main ( ) {
6 long .i , j , t;
7 freopen ("concert. in" , "r" ,stdin) ;
8 scanf("%ld",&n);
9 for (i=O;i<n;i++)
10 scanf("%ld%ld%ld%ld%ld" ,&E[i] .a,&E[i] .b,&E[i] .c,&E[i] .pl,&E[i] .p2) ;
11 for (i=O;i<n;i++)
12 for (j=i+1;j<n;j++)
13 if (E[i] .b>E[jJ,bll (E[i] .b==E[j].b&&E[iJ,a>E[j] .a))
14 { tmp=E[i]; E[i]=E[j]; E[j]=tmp; }
72
n n-l ... 1
73
(http://infoarena.devnet.ro)
cuvinte. out
Ana
are
Gina
mere
pere
caise
n-are
prune
15 for (i=O;i<n;i++) {
16 C[i]=(E[i] .b-E[i] .a) *E[i] .c;
17 for (j=O;j<i;j++)
18 if (E[j].b<=E[i].a) {
19 t=C[j]+(E[i] .b-E[i] .a) *E[i] .c;
20 if (C[i]<t) C[i]=t;
21 }
22 else {
23 t=C[j]-E[j] .p2-(E[j] .b-E[i] .a)*E[j] .c+
24 (E[i] .b-E[i] .a)*E[i] .c;
25 if (C[i]<t) C[i]=t;
26 t=C[j]-E[i] .pl+(E[i] .b-E[j] .b)*E[i] .c;
27 if (C[i]<t) C[i]=t;
28 }
29 if (rez<C[i]) rez=C[i];
30 }
31 freopen ("concert. out" I "w" ,stdout) ;
32 pri nt.f ( "%ld\n" ,rez) ;
33 }
2. (Matrice - *) Pentru un natural n; se o matrice de forma:
1234 n
2 1 2 3 n-l
3 2 1 2 n-2
1. (Cuvinte - **) un text ce doar litere mari mici ale
alfabetului englezesc cratime ('-'), iar cuvintele sunt separate prin punct,
new-line, semnul semnul Se cere determinarea
cuvintelor distincte din text acestora n ordinea a lungimii.
Cuvintele cu lungime se vor n ordine de cuvinte
distincte din text este cel mult 500, iar lungimea unui cuvnt nu 100 de
caractere. Datele de intrare se citesc din text cuvinte. in, ce textul
scris pe un arbitrar de linii. Datele de se n text
cuvinte. out, care va lista cuvintelor, n ordinea a lungimii
acestora, cte unul pe linie.
Exemplu: cuvinte. in
Ana n-are mere. Gina are
pere prune,
caise .
1.3.2 Probleme propuse
(http://infoarena.devnet.ro)
matrice. out
5
4
3
2
1
4
3
2
1
2
3
2
1
2
3
2
1
2
3
4
1
2
3
4
5
3. (Pascal - **) Ion a la ora de despre triunghiul lui Pascal.
Fiecare rnd din acest triunghi are primul ultimul element egal cu O. Un element
din triunghi se ca fiind suma celor 2 elemente exact deasupra acestuia.
Rndurile sunt numerotate de la O, deci, spre exemplu, rndul 2 1 2 1.
Este un fapt binecunoscut valoarea elementuluij (cu indexarea elementelor de la
O) de pe linia i se poate calcula cu ajutorul formulei: i!Ii-j)!*j!) . (Prin it se
produsul 1*2*... *i). pe Ion calculeze cte numere de pe
rndul R::S 5.000.000 sunt divizibile la D::S 6.
Pe prima linie a de intrare pascal.in se numerele R D, iar pe
prima linie a de pascal. out se va cerut.
Exemplu: pascal. in I pascal. ou t
4 2 3
Datele se citesc din matrice. in, iar matrice. out va matricea
pentru natural n ::s 1.000 .
Exemplu: ma tri ce . in
5
(http://infoarena.devnet.ro)
4. (Text - **) de rezultatele sale -la ultimul concurs, Paftenie a
la programare s-a concentrat strict asupra muncii laborioase, dar care
mai efort intelectual. De el un text de cel mult
1.000.000 de caractere trebuie calculeze lungimea medie a cuvintelor textului,
un cuvnt fiind definit ca o de caractere ale alfabetului
englezesc ('a' .. 'z' , 'A' .. 'Z'). Definim lungimea medie = (lungimea a
cuvintelor textului) / de cuvinte al textului).
un program care i problema lui Paftenie. de intrare text.in
textul dat. de text. out va pe prima linie un singur
ntreg, reprezentnd partea a lungimii medii a cuvintelor textului.
Exemplu: text. in text. out
- Lasa-ma in pace, ca am invatat 3
azi noapte toata ziua!
(hUp://infoarena.devnet.ro)
5. (Cod secret - *) Simpatie mare ntre Ionel oara, doi elevi n
la ... ! Pentru a de colegilor, cei doi
mesaje, unul altuia, folosind o de criptare: textul de criptat se scrie
pe o foaie, aranjnd literele cuvintelor ntr-un tablou avnd cte 5 caractere pe
fiecare linie. dintre cuvinte este el caracter. Textul astfel aranjat pe un
suficient de linii pentru a ncape, se pe coloane, de sus n jos de la
74
!!!!!!!!!!!!
75
arhiva. out
Mult mai 1 din putin cat 2 4, 2-2
ca te pune pe ganduri 5 2 1.
1 2 3 4 5
T e a s
t e P t
d u P a
c i N a
1 a o r
a 8
stnga la dreapta. n locul dintre cuvinte se pun puncte. Tot puncte se pun
la textului, attea cte libere sunt la textului "pus"
n tablou.
Pentru textul: "Te astept dupa cina la ora 8".
Se va aranja:
re'aJiznd un program care codifice decodifice mesajele celor doi
copii. Pentru mesajelor ce trebuie codificate, de cele care trebuie
decodificate, primul caracter al mesajului va fi 'C' sau 'c' pentru codificare,
respectiv 'D' sau 'd' pentru decodificare. Aceste caractere, vor fi lipite de prima
din textul' mesajului.
Exemplu: intrare iesire
CAm un mar A.mm.aurn.
dTaGia.aubllcaaa.r.c. Tabara la Galaciuc
(O.N.I.2002, clasa a VI-a)

n exemplul de mai sus, "mai-mai" cuvinte.
Un text se trebuie dezarhivat el cel o
6. (Arhivare **) Se propune de arhivare/dezarhivare pentru
texte care nu caractere numerice. La arhivare, orice caracter nealfabetic al
textului este copiat direct n textul arhivat. Un cuvnt este copiat n textul arhivat
doar este la prima a lui de asemenea, este la unei
liste de cuvinte. n ulterioare cuvntul va fi nlocuit cu de ordine
din (numerotarea n ncepe de la 1).
se va codifica: Ttdclaeeuia..ppn.8ataao.s...r.
Decodificarea mesajului se va face invers
'\
un program care din arhiva. in un text format din mai multe
linii, tipul (arhivare/dezarhivare) scrie n arhiva. out
textula.rhivat/dezarhivat. n text maximum 2000 de cuvinte, iar cuvintele au
cel mult 20 de caractere liniile textului au cel mult 80 de caractere. Nu se va face
deosebire ntre literele mari cele mici.
Exemplu: arhiva. in
Mult mai mult din putin cat mai
putin, mai-mai ca te pune pe
ganduri cat mai mult.
alfabetice sunt: A..Z, a..z;
cuvinte n exemplul precedent este:
1) mult, 2) mai, 3)din, 4) putin, 5) cat, 6) ca, 7)te, 8)pune, 9) pe, 10) ganduri.
(O.N.I.2002, clasa a VII-a)
7. (Cut&Paste ***) un constituit din N::S 100.000 linii, pe
fiecare linie fiind cte un natural. pe linia 1 se valoarea 1, pe
linia 2, valoarea 2, pe linia N se valoarea N. a fost
modificat cu ajutorul unui editor de texte, prin efectuarea aM::S 1.000 de
tip cut&paste. O cut&paste n selectarea unui grup de linii
consecutive, eliminarea lor din inserarea lor ntr-o n
document. un program care, pentru o de cut&paste
primelor 10 linii din efectuarea

de intrare cp.in pe prima linie de linii din
de efectuate, iar pe M linii cte trei numere: Ii
k
Ifk::S N -linia
de nceput linia de ale celui de al k-Iea grup de linii selectat undek::S N-
(lf
k
-Ii
k
+1) - linia care se va insera grupul de linii specificat. undeveO,
deducem inserarea se va face la nceputul documentului.
de cp.out va 10 linii reprezentnd numerele scrise pe primele
10 linii din efectuarea
Exemplu: cp. in cp. ou t
1000 6 801
3 7 4 802
1 100 57 803
50 60 200 804
63 70 500 101
1 800 4 102
7 77 98 36
37
38
39
(O.N.I.2002, clasa a VIII-a)
8. (Fib **) lui Fibonacci: 0,1,1,2,3,5,8,13,21, ...
Fiind dat un natural (nEN), acest sub de de
elemente neconsecutive din Fibonacci, fiecare element putnd cel
mult o astfel nct de termeni ai sumei fie minim.
Din de intrare fib. in se de pe prima linie natural n. Acesta
poate avea maximum 80 de cifre.
n de fib.out se vo. termeni ai Fibonacci, cte unul pe
linie, a este n.
Exemplu: f ib. in f i.b . ou t
20 2
5
13
(O.N.I.2000, clasa a IX-a)
76
9. (Pentagon - *) n urma bombardamentelor din 11 septembrie 2001,
Pentagonului a suferit daune la unul din Imaginea a
peretelui avariat se sub forma unei matrice cu m linii 12coloane (m, 12::;
200) ca n figura de mai jos:
1110000111 unde 1 zid intact
1100001111 Ozid avariat
1000000011
1111101111
1110000111
Sumele alocate pentru refacerea Pentagonului vor fi donate celor care vor ajuta
americanii. prin plasarea, pe a unor blocuri de
k, k=l, ... , m, 1, n locurile avariate.
Pentru o a unui perete din Pentagonului,
minim al blocurilor, de k=l, k=2, ... , k=m, necesare refacerii
-,
de, intrare pentagon.in pe prima linie dimensiunile m 12 ale
peretelui iar pe m linii cte o de caractere 1 sau Ode
lungime n. pentagon.out va pe cte o linie, ordonate
k,
k nr - undejc este blocului,
- iar nr este de blocuri de k, separate prin cte un
Exemplu: pentagon . in pentagon. ou t
5 10 1 7
1110000111 2 1
1100001111 3 2
1000000011 5 1
1111101111
1110000111
(O.N.I.2003, clasa a IX-a)
10. (Perle - ****) nu se trece Asta pentru Balaurul Arhirel (mare
pasionat de nu pe nimeni dect ce la
n acea trei tipuri de perle normale (le vom nota cu 1, 2 3)
trei tipuri de perle magice (le vom nota cu A, B C). Perlele magice sunt
deosebite prin faptul se pot transforma n alte perle (una sau mai multe, normale
sau magice). Perla de tipul A se poate transforma n orice
(una Perla de tipul B se poate transforma ntr-o de
tipul 2 tina de tipul B, sau ntr-o de tipul 1, una de
tipul A, una de tipul 3, una de tipul A una de tipul C.
Perla de tipul C se poate transforma ntr-o de tipul 2 sau ntr-
o de tipul 3, una de tipul B una de tipul C sau ntr-
o de tipul 1, una de tipul 2 una de tipul A.
Ca cele de mai sus putem scrie:
A -> 1 I 2 I 3
B -> 2B I 1A3AC
C -> 2 I 3BC I 12A
77
!!!!!!!!!!!!
Balaurul Arhirel ne la nceput ne alegem o (una iar
apoi folosind numai de mai sus trebuie un anumit de
perle normale. Cnd o se perlele din stnga din dreapta
ei la fel n ordine). De asemenea, ordinea perlelor rezultate din
transformare este chiar cea mai sus.
De exemplu, balaurul ne cere facem de perle 21132123, putemalege o
de tipul B de B -> 2B -> 21A3AC ->
21A3A12A -> 21132123. ntruct Balaurul nu are prea el nu ne cere
dect spunem se poate sau nu respectiv de perle.
se determine pentru fiecare de intrare': se poate prin
le de mai sus sau nu (alegnd orice
de intrare perle. in are pe prima linie,
reprezentnd de din de intrare; N linii, a i-a linie
dintre cele N descrie i, printr-o succesiune de numere naturale de
cte un Primul lungimea 0.000, iar
Li numere sunt tipurile de perle normale, n ordine, de la stnga la dreapta.
perle.outve N linii. Pe linia i se va scrie un singur 1 sau O
(l se poate respectiv (al i-Iea) O nu se poate).
Exemplu: perle. in perle. out
3 1
821132123 O
2 2 2 1
1 3
(0.1.1.2004, clasa a X-a)
11. **) Se construit astfel nct fiecare element al
lui, cu primului, se din cel precedent: 1, 11, 21, 1211,
111221, ...
Termenii din sunt ncepnd cu 1.
Fiind dat n 35, un natural, se determine cel de-al n-lea termen din
dat.
Din text sir. in se natural n.
Pe prima linie a text sir. out se va scrie al n-lea termen al sirului.
Exemplu: sir.in I sir. out
5 111221
(0.1.1.2002, clasa
12. - *) Gigel mod de a transmite mesaje pe care
nimeni nu le descifra. Mesajul este.ascuns ntr-un text care. areJ\Tlinii pe
fiecare linie sunt exact N ::;; 50 caractere - litere mari ale alfabetului englezesc,
cifre, semne de caracterul Decodificarea se face cu ajutorul
unui de dimensiuni ca textul, care are cteva ..Suprapunnd
peste text vizibile cteva caractere. Acestea se citesc n .ordinea
liniilor, de sus n jos, iar pe linie de la stnga la dreapta. Apoi hrtia cu
textul se spre stnga, n sens trigonometric, cu 90, fix.
Alte caractere devin vizibile acestea se citesc n mod. se
78
de ori (rotire cu 180, respectiv cu 270), cnd textul ajunge,
printr-o cu 90, din nou n Din pentru
codificare/decodificare s-a pierdut. n schimba la Gigel mesajul iar la
a ajuns textul care mesajul. se reconstituie care a fost
folosit la codificare. Prin rotirea textului nici una din nu se va suprapune
peste nici una din ocupate de o n precedente ale textului.
de intrare sablon.in pe prima linie, mesajul Mesajul are
maximum 1000 caractere se ncheie cu un caracter diferit de Pe linia a
doua a de intrare se valoarea N. N linii textul
care ascunde mesajul.
sablon. out
XXXXOXXXXX
XXOXXXXXXX
OXXXXXXXXX
XXXOXXXXXX
XOXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
de sablon.out N linii a cte N caractere. Caracterele sunt' O'
(pentru reprezentarea unei 'X'.
Exemplu: -, sablon. in
CODIFICARgCU SABLON
10 \
ABCDCEFAGH .
IJOKLEMNOP
DQRSTUVWCX
YZAJ:BCRDEF
GFHIJKLMNJ:
AJKLMNOPSQ
RSTOUV WXY
ZBABCDEFGU
HIJKNLMCNO
PQLRS TUVW
(O.N.I.2004, clasa a IX-a)
13. iSeti *) care la programul SETI au
transmisii de date foarte ciudate, date care ar putea veni din partea unor
extraterestre. Primul set de date este format din 10 caractere distincte, date n
ordinea lor ce alfabetul extraterestru. A doua transmisie
cuvinte din exact 4 caractere.
trebuie ordoneze lexicografic cuvintele primite n a doua transmisie
(conform alfabetuluiextraterestru).
de intrare seti.in pe prima linie cele 10 caractere ale alfabetului, iar
pe fiecare din linii, cte-un cuvnt. n nu. sunt mai mult de
200.000 de cuvinte, iar caracterele sunt literele mici ale alfabetului englezesc.
de seti.out va cuvintele ordonate, cte unul pe linie.
Exemplu: seti. in seti. out
abcdefghij aaaa
aaaa aabc
fgaa fgaa
aabc iihf
iihf
(O.N.I. 2003, clasa a IX-a)
79
14. (Text -**) Vasile intens la un editor de texte. Un text este format din
unul sau mai multe paragrafe. Orice paragraf se cu Enter oricare
cuvinte consecutive din paragraf sunt separate prin (unul sau mai
multe). n de modul de setare a paginii, maxim de caractere care
ncap n pe o linie este unic determinat (Max). pe care Vasile
trebuie o implementeze acum este alinierea n a paragraf din text
la stnga la dreapta. Pentru aceasta el va trebui fiecare paragraf n linii
separate de lungime Max (fiecare linie cu Enter). se
punnd maxim posibil de cuvinte pe fiecare linie,
cuvintelor n silabe. Pentru aliniere stnga-dreapta, el trebuie repartizeze
n mod uniform ntre cuvintele de pe fiecare linie, astfel nct ultimul caracter de pe
linie fie diferit de iar total de caractere de pe linie fie egal cu
Max. face numai ultima linie din paragraf, care la stnga
(cuvintele fiind separate printr-un singur chiar linia nu este n
general, este probabil ca alinierea fie prin plasarea
de ntre oricare cuvinte consecutive de pe linie. Vasile
este mai elegant ca, ntre unele cuvinte consecutive trebuie plasat un
n plus de alte perechi de cuvinte consecutive, acestea fie plasate la
nceputul liniei. un program care lungimea unei linii textul dat
care alinieze textul Ia stnga la dreapta. Lungimea a cuvnt
din text este 25 de caractere nu Max. Lungimea unui paragraf nu
1000 de caractere.
de intrare text.in pe prima linie Max 1.000, lungimea a
unui rnd. Pe linii este scris textul.
de text. out textul aliniat stnga-dreapta.
Exemplu: text. in text. ou t
20 Vasile are multe
Vasile are multe bomboane bune. bomboane bune.
(OJ.I.2003, clasa a IX-a)
15. (Cod - ****) Principala misiune a unei este de a studia
pe o nou n urma studiilor efectuate,
au asociat organism viu descoperit pe acea un cod caracteristic.
Codul caracteristic este un natural de maximum 200 de cifre zecimale
nenule. De asemenea, au observat pentru orice organism viu de pe
codurile caracteristice ale pe scara se pot
prin unor cifre din codul caracteristic al organismului respectiv, iar un
organism este cu att mai evoluat cu ct codul caracteristic are o valoare mai
mare. Date fiind codurile caracteristice ale organisme vii diferite, un
program care determine codul caracteristic al celui mai evoluat comun
al lor.
de intrare cod. in n - codul caracteristic al primului organism pe
prima linie m - codul caracteristic al celui de-al doilea organism pe a doua linie.
de cod.out pe prima linie codul celui mai evoluat
comun al lui n m.
80
18. (Romane - **) n reprezentarea cu cifre romane se simbolurile 1, V,
X, L, C care respectiv valorile 1, 5, 10, 50 100. Pentru a reprezenta
alte valori, aceste simboluri se se De exemplu valoarea 3 se
prin III, iar valoarea 73 prin LXXIII. de la apar la
numerele care au una dintre cifre 4 sau 9: 4 se scrie IV, 9 se scrie IX, 40 se scrie
81
cod. out
(OJ.I.2002, clasa a X-a)
pal.out
2
75
pal.in
cod.in
\
17. (Program - ***) Atunci cnd este o ntr-un anumit limbaj
de programare, este util care, cu nu
vor fi executate atunci acestea ar putea reprezenta o eroare
n program. .. un limbaj de programare simplu, care admite

EXECUTA programului cu
SALT n - programului cu cea de a n-a
SALT n SAU m - programului cu cea de a n-a sau cea de a m-a
unui program ncepe ntotdeauna cu prima
un program care determine de care nu vor fi
executate. de este cel mult egal cu 10000.
sunt numerotate ncepnd cu 1.
de intrare program. in mai multe cte o pe
linie. Ultima linie din (ca marcaj de caracterul'.'.
de program. out o linie pe care se de
care nu vor fi executate.
Exemplu: program. in program. out
EXECUTA 2
SALT 4 SAU 6
EXECUTA
SALT 3
EXECUTA
SALT 8
EXECUTA
EXECUTA
Exemplu:
7145
847835
16. (Palindrom - ***) Un palindrom este un simetric, un care este la
fel citit de la stnga la dreapta, ct de la dreapta la stnga. un program,
care pentru un dat, minim de caractere care trebuie inserate
n pentru ca acesta palindrom.
n de intrare pal.in va fi pe prima linie de caractere al iar
pea doua linie, care va fi format doar din litere mici mari ale alfabetului.
n de pal.out se va scrie minim de caractere care trebuie
inserate.
Exemplu:
5
Abxbd
I
romane. out
28 10 14 O O
(http://campion.edu.ro)
XL, 90 se scrie XC, valoarea mai se scrie n valorii mai mari se
scade din ea. Astfel, cu cifre romane pentru 24, 39, 44, 49 94 sunt
XLIV, XLIX, XCIV. n multe are paginile
numerotate cu cifre romane, ncepnd cu I pentru prima un program
care determine cte caractere 1, V, X, L, C sunt utilizate pentru a numerota cele
n < 400 pagini din
de intrare romane. in pe prima linie un singur ntreg reprezentnd
de pagini din
de romane. out va o linie pe care se vor afla cinci
numere naturale separate prin cte un reprezentnd, n ordine, numerele de
caractere I, V, X, L, C necesare.
Exemplu romane. in
20
19. (Secvreg - ***) constituite numai din paranteze
rotunde paranteze din caracterele () [ ].
Prin o de paranteze este se aplicnd
reguli:
1.0 [] sunt regulate.
2. A este atunci (A) [A] sunt regulate.
3. A B sunt regulate, atunci AB este
De exemplu, OO[] [))][] sunt regulate, n timp ce ][ sau [(] sau([)] nu sunt
regulate. Se o de paranteze. La fiecare pas se o
sau sau la nceputul sau la
un program care determine, fiecare pas, lungimea celei
mai scurte regulate din caractere consecutive ale
care paranteza la pasul respectiv.
de intrare secvreg.in pe prima linie de paranteze.
Lungimea de paranteze va fi :s 100 000. Pe cea de a doua linie a
de intrare se un natural N:S 100.000 care
de Fiecare dintre N linii un natural un caracter
C separate printr-un singur A este O (zero) atunci caracterul C este
inserat la nceputul A este 1 (unu) atunci caracterul C este inserat la

de secvreg.out N linii. Pe cea de a i-a linie va fi
lungimea celei mai scurte regulate din caractere consecutive
ale care paranteza la pasul i. nu o astfel de
pe linia O.
Exemplu secvreg. in secvreg. ou t
[]) O
3 2
O 6
O
O
82
!!!!!!!!!!!!
(http://campion.edu.ro)
tunel.out
3
Ion la intrarea n tunel, iar Vasile la Fiecare
de nregistrare al trece pe el trimit
patrulei de care pe drum, ceva mai la vale.
de Ion Vasile, poate determina
au n tunel (ceeace este strict interzis). Presupunem n tunel
nu se pot opri.
program care determine de despre care poate
cu au o n tunel.
de intrare tunel.in 2N+1 linii. Pe prima linie se nn
N :::; 1.000, care de care au trecut prin tunel. Pe
N linii se numerele de nregistrare ale care au intrat n
tunel, n ordinea Pe N linii se numerele de nregistrare ale
care au din tunel n ordinea Numerele de nregistrare ale
au cel 6 cel mult 8 caractere care pot fi numai litere mari ale
cifre.
de tunel. out o linie pe care se de
care vor primi (cei despre care poate afirma cu au
efectuat n tunel).
Exemplu tunel. in
5
ZG5080K
PU305A
RI604B
ZG206A
ZG232ZF
PU305A
ZG232ZF
ZG206A
ZG5080K
RI604B
21. (Circular - ***) Se spune Yj, Y2, ... , Yn este o permutare cu p
a Xj, X2, ... , x
n
y]=xp+j, Y2=X
p+2,
... , Yn=x
p+m
unde indicii k, cu
k>n se la elementul de indice k-n. Pentru date al
doilea este o permutare a primului
Pe prima linie a de intrare circular.in este scris natural n:::; 5000.
Pe Iiriiile de caractere de lungimen, formate numai din
litere mari ale alfabetului latin.
Pe prima linie a circular. out se va scrie cel mai mic natural p
pentru care de pe linia a treia este o permutare cu p a
de pe liniaa doua, sau -1 nu avem o permutare
Exemplu: circular .in out
10 7
ABCBAABBAB
BABABCBAAB
(http://campion.edu.ro)
83
cifre. out
super. in
cifre. in
I
super. out
WUUSSSQRPDCLXXVIII
(http://campion.edu.ro)
23. (Cifre - **) Fie N::51.000.000.000 un natural nenul. Scriind n ordine,
unul altul, toate numerele naturale de la 1 la N o de cifre.
De exemplu, pentru N=22 12345678910111213141516171819202122.
un program care determine de cifre dintr-o astfel de
de intrare cifre.in o linie pe care se natural N.
de cifre.out o linie pe care se de cifre
determinat.
Exemplu:
15
22. (Super - **) Numerele romane, folosite pe vremea lui Midas exprimau dificil
numere mari, de ordinul milioanelor. De aceea, Midas a fost nevoit sa inventeze
numere noi, pe care le-a numit numere super-romane. Numerele super-romane
regulile de formare a numerelor romane.
simbolurile romane reprezentarea lor
1 = 1 V = 5 X = 10 L = 50 C = 100 D = 500 M = 1000
Simbolurile I, X, C, M pot fi scrise consecutiv n de maximum 3.
Celelalte simboluri nu se pot repeta consecutiv. Simbolurile sunt scrise
ntre ele, n ordinea a valorilor:
CCLXVIII= 100+100+50+10+5+1+1+1 = 268
Uneori un simbol I, X, C sau M este plasat naintea unuia dintre cele
simboluri de valori imediat superioare (I nainte de V sau X; X nainte de L sau C,
etc). n acest caz, valoarea simbolului mai mic este din valoarea simbolului
pe care l
IV = 5-1 = 4 IX = 10-1 = 9 XL = 50-10 = 40
Numere compuse ca XD, IC sau XM nu sunt corecte, deoarece simbolul din
are o valoare mult prea de a celui care Astfel:
pentru XD (490 scris se reprezentarea CDXC
pentru IC (99 scris se XCIX
pentru XM (990 scris se CMXC
Din nefericire, numere mari, cum ar fi 10000 s-ar reprezenta MMMMMMMMMM,
deci foarte dificil. De aceea, tabela numerelor romane se extinde:
1 1 L 50 M 1000 R 50000 U 1000000 N 50000000
V = 5 C = 100 P = 5000 S = 100000 B = 5000000 Y = 100000000
X = 10 D = 500 Q = 10000 T = 500000 W = 10000000 Z = 500000000
n acest fel, regulile de scriere, se pot reprezenta numere de
ordinul sutelor de milioane. un program care un natural
dintr-un l n echivalent n
Pe prima linie a de intrare super.in se natural
n:s2000000000.
Pe prima linie a de super.out se n n

Exemplu:
12345678
(http://campion.edu.ro)
84
24. (Parola ***) ntr-un seif se documente pe care trebuie le
Problema este seiful este cu un terminal care
introducerea unei parole pentru a-l putea deschide. La accesarea seifului, pe
ecranul terminalului este un cuvnt cheie format din litere mici ale
alfabetului englezesc. Parola este de cea mai la stnga (n ordine
a cuvntului cheie.
de intrare parola.in pe prima linie un de caractere format din
litere mici ale alfabetului englezesc. Lungimea din de intrare este un
ntreg cuprins ntre 1 100.000.
de parola. out trebuie un singur care
necesar de circulare la stnga ale din de intrare
pentru a parola de acces mai multe va fi
cea care un minim de circulare la stnga.
Exemplu: parola. in I parola. out
mississippi 10
\
fraza. out
5
am
fost
invins
de
eenarius
am
fostin
fost
deeena
ore
elf
narius
invins
de
eenarius
eena
rius
25. .:***) Un elf a scris un text pentru ca posteritatea
sale. Din nefericire, el nu a separat cuvintele ntre ele. Elfii cunosc
cuvintele folosite de doresc acum reconstituie fraza.
de intrare fraza.in pe prima linie, textul scris de lor.
Textul cel mult 30000 de litere. Pe linie se
n al cuvintelor din limba pe care le cunosc elfii.
cuvintelor este cuprins ntre 1 255. Fiecare dintre n linii
va cte un cuvnt din Fiecare cuvnt cel
mult 255 de litere.
de fraza. out trebuie pe prima linie k al cuvintelor
din textul reconstituit. Fiecare dintre k linii va
cuvintele textului, cte unul pe fiecare linie. Ordinea acestor linii trebuie fie cea
a cuvintelor n textul reconstituit. n cazul n care mai multe
ale frazei, va fi cea care cele mai cuvinte,
deoarece se elfi erau foarte
Exemplu: fraza. in
amfostinvinsdeeenarius
12
85
sir. out
12457 ,
26. naturii - *) Cu mii de ani nainte ca Fibonacci descopere celebrul
care i numele, elfii foloseau deja celebrele ale acestui
cum bine elfii erau foarte de era destul de greu nu
observe elementele acestui precum diverse numere derivate din acest
apar foarte des n Sistemul Fibonacci a fost, la un moment dat, baza
matematicii elfilor. au descoperit destul de repede bazele de
calculele, elfi erau sistemul de
pe care noi l numim Fibonacci. Din motive evidente, acest sistem era
numit de elfi sistemul naturii, iar era numit naturii. Numerele scrise
n sistemul naturii numai cifre O 1. Valoarea a unui scris
n sistemul naturii este de formula CI' al + C2' a2+ ... + C
n'
an, unde CI. C2, ...,
cnsuntcifrele scris n sistemul naturii, citite de la dreapta spre stnga,
iar al, a2, ..., an sunt elementele semnificative ale naturii (al =1, a2 =2,
a, =3, a, =5, as =8, a, = 13, etc.). 1010100000100101
scris n sistemul naturii. Valoarea a acestui este:
1 al + O a2 + 1 a3 + O a4 + O as + 1 a6 + O a7 + O as + O a9 + O alO +
O. all + 1 a12 + O a13 + 1 'aH" + O',alS + 1 a16 =
11+ 02 + 13 + 0',5 + 08 + 113 + 021 + 034 + 055 + 089 +
0144 + 1233 + 0371 + 1610 + 0987 + 11597
1 + 3 + 13 + 233 +610 + 1597 = 2457
de intrare sir.in un singur scris n sistemul naturii.
scris n sistemul naturii va cel mult 20 de cifre este ntotdeauna valid.
de sir.out trebuie o linie care va avea
convertitn sistemul zecimal.
Exemplu: sir.in
1010100000100101
27. (Multiplu - **) se determine, pentru un anumit acesta poate
avea un multiplu care doar o x cifra O.
de intrare multiplu.in pe prima linie al multiplu va fi
determinat. al multiplu este este cuprins ntre 1 10000. Cea
de-a doua linie a va cifra care poate n multiplu, pe
cifra O.
de multiplu.out trebuie o linie, pe care se va afla
multiplul determinat. Se multiplului faptul acesta
cel mult 10000 de cifre.
Exemplu:
7
1
multiplu. in
1111110
multiplu. out
28. (Intervale - ***) are un interval [1 ..L] (L:::;I.000.000.000) N:::;30.000
alte intervale incluse n intervalul [1..L]. El poate atribui dintre cele N
intervale o culoare, alb sau negru. determine o astfel de colorare cu
proprietatea att reuniunea intervalelor de culoare fie intervalul [1 ..L],
ct reuniunea intervalelor de culoare fie tot intervalul [1.L].
86
de intrare int.in pe prima linie numerele L N, cu din
Pe N linii se perechi de numere ntregi reprezentnd
intervalele.
de int.out trebuie N linii; pe fiecare se va afla cte o
Osau 1 (O pentru negru 1 pentru alb), linia i din de reprezentnd
culoarea intervalului de pe linia i+1 din de intrare. nu este o
astfel de colorare se va doar mesajul "Nu are
Exemplu
7 4
1 3
1 5
5 7
3 7
int. in
1
o
o
1
int. out
29. iPalindrom prim **) Un palindrom este un simetric, un care este
la fel att citit de la stnga la dreapta, ct de la dreapta la stnga. un
program, care pentru un interval [A, B], toate palindroamele prime din
interval.
n de intrare palprim.in vor fi, pe prima linie, numerele naturale A B :::;
100.000.000.
n de palprim.out se vor scrie toate numerele palindroame prime
din intervalul dat, n ordine
Exemplu:
5 500
palprim. in
5
7
11
101
131
151
181
191
313
353
373
383
palprim. out
30. (Lapte. **) are N:::;5.000 vaci pentru, fiecare se intervalul de
timp n care aceasta produce lapte. care este cel mai lung interval. de
timp n care, cel o produce lapte, cel mai lung interval de timp n care
nici o nu. produce lapte.
n de intrare lapte.in vafi, pe prima linie, N. Pe N linii
se perechi de numere ntregi S 1.000.000, reprezentnd intervalele.
n de lapte.out se vor scrie numere reprezentnd lungimea celui
mai lung interval de timp n care, cel o produce lapte lungimea celui
mai lung interval de timp n care, nici o nu produce lapte.
87
31. (Rebus **) Se un rebus tipic de N linii M coloane (N, M
16.000), care albe negre. Un cuvnt este o de
lungime cel 2, de albe pe sau se determine,
pentru un rebus dat, cte cuvinte pe cte cuvinte pe
n de intrare rebus. in vor fi, pe prima linie, numerele N M. Pe
N linii se numere naturale, primul reprezentnd cte
negre pe linia (linia i din corespunde liniei i-l din rebus),
urmat de coloanele pe care se negre. Se nu vor exista mai
mult de 30.000 de negre.
n de rebus. out se vor scrie numere reprezentnd de
cuvinte verticale de cuvinte orizontale.
Exemplu:
3
300 1000
700 1200
1500 2100
Exemplu:
5 5
1 5
234
o
223
1 1
lapte. in
rebus. in
900 300
4 5
lapte. out
rebus. out
32. tEditor ***) Se un editor de text care doar la a
taste, anume cele care au simbolurile: "(", ")", "[", "]", "*,, "E".
se una din tastele "(", ")", "[", "]", atunci se caracterul
respectiv pe ecran. se tasta "*,, se ultimul caracter nu
este nici un caracter, atunci nu se nimic). se tasta "E"
(Enter), atunci editorul va verifica pe ecran este un parantezat
corect. Un este parantezat corect este construit conform regulilor:
parantezat corect> = vid>;
parantezat corect> = "(" + parantezat corect> + ")";
parantezat corect> ="[" + parantezat corect> + "]";
parantezat corect> = parantezat corect 1> + parantezat corect 2>.
Prin X +Y s-a notat concatenarea X Y.
De exemplu, "[]([([])])", " "([([])[O]])[]" sunt parantezate
corect, iar ")[]([])", "[OOO()[([(" "[()[([]())]])" nu sunt parantezate
corect. Dndu-se o succesiune de taste care se cu tasta "E"
nu este nici un caracter pe ecran, trebuie
pe ecran n urma tastelor este un parantezat corect.
Pe prima linie a de intrare editor.in se un ntreg
reprezentnd de succesiuni de taste care vor fi descrise n continuare. Pe
88
!!!!!!!!!!
de templu.out trebuie trei linii. Pe prima linie se va afla
care poate fi de templu. Pe cea de-a doua linie se vor
afla numere, separate printr-un care din
dreapta-jos a templului. Pe cea de-a treia linie se vor afla numere, separate
printr-un care din stnga-sus a templului.
fiecare din T linii este cte o succesiune de taste Nici
o succesiune de caractere nu va mai mult de 60000 de taste
n editor.out scrie exact T linii, cte una pentru fiecare succesiune de
taste n de intrare. Pe fiecare linie ":)" ghilimele),
n urma succesiunii de taste este
parantezat corect, respectiv ":(" ghilimele), n caz contrar.
33. (Templu ,,- ***) Elfii doresc un mic templu de
n mijlocul copacilor. Ei trebuie descoperere o
pe care nu se afle nici un copac, deoarece ei nici nu
concep ideea de a copacii. poate fi ca o
iar copacilor sunt date prin coordonatele ntr-un sistem a origine se
n din stnga-jos a. dreptunghiului. Dimensiunile copacilor sunt
neglijabile, iar templul construit trebuie ocupe o ct mai mare.
Prima linie a de intrare templu.in numere separate printr-un
care lungimea Cea de-a doua linie
n al copacilor din copacilor din este cuprins ntre
1 200. Fiecare dintre n linii va descrie unui copac. Aceasta
este de coordonata de coordonata a copacului n
sistemul de coordonate descris. Aceste numere vor fi separate printr-un

89
templu. out
editor. out
("Stelele informaticii" 2003)
50
10 o
o 5
: I
: )
: I
: )
: (
: (
templu. in Exemplu:
10 10
3
3 5
3 8
6 6
Exemplu: edi tor. in
6
E
IIIII*****]]]]]*****E
(([[() [() [] ([]I] [[] () ([])] (())]])) ([
][] [] lE
** [*] * [ ] () (] * (* *) *E
( [] ( (] ))"E
[E \
de intrare traseu.in linii; prima linie lista lui Alice,
cea de a doua, lista lui Bob. Fiecare cel un caracter
cel mult 80 de caractere litere mici, care nu sunt separate prin nici un
de traseu. out va trebui toate traseele care
descrise mai sus fiecare traseu se va scrie n o Pe o
linie se va scrie un singur traseu. Se a cel unui traseu
nevid cel mult 1000 de trasee diferite.
35. (Paranteze ***) se adesea cu de paranteze (evident
doar corecte!). Uneori ajunge mari de tipul
").... )". Pentru a preveni astfel de a inventat "paranteza ]" care
una sau mai multe paranteze ")", cum este nevoie pentru a nchide
corect parantezele deschise. pentru un dat cte paranteze nchise

traseu. out
ababa
abaca
abcba
acbca
acaba
acaca
acbaa
traseu. in Exemplu:
abcabcaa
acbacba
34. (Traseu - ***) Alice Bob vor n Cei doi planificat
cte un traseu pe care doresc urmeze au scris o de pe care vor
le viziteze ntr-o ordine. O poate un anumit de mai
multe ori. Deoarece cei doi vor trebuie de acord
privind un traseu comun. Nici unul nu vrea schimbe ordinea n care au planificat
vizitarea conform listei proprii nu vor adauge noi la ea. n
concluzie, ei nu au posibilitate dect anumite din lista proprie.
traseul comun trebuie cel mai mare de posibile
de vizitat. n regiune exact 26 de care au fost codificate cu litere mici
de la 'a' la 'z'.
de intrare parantez. n linii: prima linie lungimea
iar cea de a doua,
de parantez.out attea linii cte paranteze magice sunt n
dat. Pe fiecare linie se va scrie cte paranteze nchise fiecare
luate n ordinea n care apar n dat de la stnga la dreapta.
Exemplu:
8
(( (( (])]
parantez.in
3
1
parantez.out
90
Subprograme Definite de Utilizator
Subprograme implementate n
2.1.1 Teste cu alegere
1. Ce se v.;t n urma programului
var x , y, z :\byte;
procedure P (a,b:byte;var c :byte) ;
var aux:byte;
begin
aux:=a; a:?b-a;
c:=c-aux; b:=aux;
end;
begin
x:=10; y:=100; z:=200;
p(x,y,z) ;
write(x,' " v :' ',z,' ');
p(x,y,z) ;
write(x,' ',y,' ',zi;
end.
a) 90 10 190 176 90 100
b) 10 10 190 10 10 180
#include <iostream.h>
int x,y,z;
void print a,int b, int. &c)
{ int aux;
aux=a; a=b-a ;
c=c-aux ; b=aux;
void main ()
{ x=10; y=100; z=200;
P(x,y,z) ;
coutx" " y" "Z" "i
P(x,y, z);
coutx" " y" "z" ni
c) 10 100 190 10 100 190
d) 10 100 190 10 100 180
2. Ce se va n urma programului
var a:byte;
procedure P(x:byte; var y:byte);
begin
y: =y*x; x: =x+y;
write(x,' ',y,' ')
end;
begin
a:=ll;
p(a,a) ;
writeln (a) ;
end.
a) 11 121 11
b) 132 121 121
#include <iostream.h>
int a =11;
void P(int x,int &y)
{
y=y*x; x=x+y;
coutx" "y" "j
}
void main() {
P(a,a) ;
couta;
}
c) 242 242 242
d) 11 121 121
91
3. n urma apelului P(n,x) se cifrei maxime a unui natural
prin intermediul apelului write(x), respectiv coutx. antetul corect al
subprogramului P.
a) a)
function P{n:integer) :byte; int p{int n)
b) b)
procedure P{var a,b:integer); void P{int &x,int &y)
e) e)
procedure P{n,x:integer) ; void P{int n, int x )
d) d)
procedure P{x:integer;var n:byte); void P{int x , int &n)
4. Subprogramul P dintr-un vector, transmis ca parametru, a
tuturor elementelor egale cu o valoare Subprogramul prin
intermediul altor doi parametri ntregi, lungimea tabloului valoarea elementelor
ce vor fi antetul corect al subprogramului P. Pentru varianta
Pascal, se de tip: type sir=array[l ..100] ofinteger.
a)
function P{a:sir;
n,x:integer;) :sir;
b)
procedure P{var a:sir;
n , x: integer);
e)
procedure P{var a:sir;var n:byte;
x:integer) ;
d)
procedure P(a:sir; n,x:integer);
a)
int P{int a[lOO], int n, x)
b)
void P(int a, int &x, int &y)
e)
void P{int a[lOO],int &n, int x)
d)
void P{int a[lOO], int x, int n)
5. Ce valori vor fi n urma program?
var x:integer;
procedure pl{y:integer);
var x:integer;
beg-in
x:=y; x:=2; write{x,' '); y:=x;
end;
procedure p2{var y:integer);
beg-in
x:=y; x:=3; write(x,' '); y:=x;
end;
92
!!!!!!!
#inelude <iostream.h>
int x;
void pl (int y)
{ int x;
x=y; x=2;
eoutx' '; y=x
void p2{int &y)
x=y; x=3;
eoutx' '; y=x;
7. Ce valori vor fi n urma program?
6. Ce valori vor fi n urma program?
var x,y:integer;
93
!!!!!!!!!
55
105
55
55
50
50
105
105
133
132
}
C) 55
d) 55
void main()
x=5; y=10;
p(x,y); coutx' 'y;
#include <iostream.h>
int x,y;
void p(int &a,int &b)
{ int x;
x=a*b; a+=x; b=a+x;
couta' 'b' 'x' ';
c) 30 20 43 20
d) 20 20 46 46
void main()
{ x=20;
p1(20); coutx' ';
p2(x); coutxendl;
void p2(int &x)
{int y;
y=x; x+=3; x+=y;
coutx' ';
#include <iostream.h>
int x;
void p1 (int x)
{ int y=10;
x=x+y;
coutx' ';
c) 2
d) 2
void main()
{ x=l;
p1(x); coutx' ';
p2(x); coutxendl;
105 105
55 55
105 50
55 50
a) 55
b) 55
begin
x:=5;y:=10;
p(x,y); write(x,' ',y);
end.
procedure p(var a,b:integer);
var x:integer;
begin
x:=a*b; a:=a+x; b:=a+x;
write(a,' ',b,' ',x,' ');
end;
a) 20 20 43 20
b) 30 20 43 43
begin
x:=20;
p1(20); write(x, , ');
p2 (x); write(x,' ');
end.
procedure p2(var x:integer);
var y:integer;
begin
y:=x; x:=x +"3;
x:=x + y; write(x,' ');
end;
procedure p1(x:integer);
var y: integer;
begin
y:=10; x + y; write(x,' ');
end;
var x:integer;
begin
x:=l;
p1 (x); write (x,' ');
p2(x); writeln(x);
end.
a) 2 2 3 3
b) 2 2 3 2
8. Ce valori vor fi n urma program?
9. care dintre antete de sunt corecte sintactic:
a) a)
function Fl (z byte); int Fl(int Zi)
b) b)
function F2 (x , y) : real; int F2(int x,y)
e) e)
function F3 (y:byte) : text; FILE* F3 (int y)
d) d)
function 12F(e:char) :real; float 12F(char e)
e) e)
function F4(y:byte;z:byte) :real; float F4(int x, int y)
d) 30. c) 32;
}
void main()
{ eout eif(n)+eif(n) i
}
#inelude <iostream.h>
int n=21987;
int cif (int &x)
{
int e;
e=x%10; x/=10;
return (e+ x%10)%10;
b) 10i a) 12;
var n:integer;
function cif(var x:integer) :byte;
var e:byte;
begin
e:=x mod 10; x:=x div 10i
eif:=(e+x mod 10)mod 10;
end;
begin
n:=21987;
writeln(eif(n)+eif(n))
end.
10. care dintre un real,
reprezentnd media dintre ctul restul la a numere
ntregi, transmise ca parametri:
a)
function M(x,y:integer) :byte;
begin
M := (x div y + x mod y)/2;
end;
a)
int M(int x,y)
{
return (x/y + x%y)/2;
b)
function M(x,y:integer) :real;
var medie:real;
begin
medie := x div y + x mod y;
M := medie/2;
end;
b)
float M(int x,int y)
{
float medie;
medie = x/y + x%y;
return medie/2;
e)
function M(x,y:integer) :real;
begin
M := x div y + x mod y;
M := M/2;
end;
e)
float M(int x,int y)
{
return x/y + x%y;
94
d)
funetion M(x,y:integer) :real;
begin
x.-xdivy;
y := x mod y;
M := (x + y)/2;
end;
d)
float M(int x,int y)
{
x = x/y ;
y = x%y ;
return (x+y)/2;
11. prim, care true n varianta Pascal,
respectiv 1 n varianta C++, valoarea ca parametru este un
prim false /0, n caz contrar. un tablou unidimensional a ce
n elemente de valori ntregi. care dintre
indicele din a al primului element prim. acesta nu
nici un element prim, se valoarea -1.
Pentru varianta Pascal, se definitie de tip: type
..100Jof integer, deci primul element este a[O].
al
funetion p(a:sir;n:byte) :integer;
var i:integer;
begin
p:=-l;
for i:=O to n-1 do
if prim(a[i]) then p:=i;
end;
bl
funetion p(a:sir;n:byte) :integer;
var x:integer;
begin
'x:=-l;
repeat
inc(x)
until(prim(a[x]or(x=n) ;
if x=n then p:=-l
else p:=x;
end;
el
funetion p(a:sir;n:byte) :integer;
var x,i:integer;
begin
x:=-l;
while x<n-1 do begin
inc(x) ;
if prim(a[x])=true then x:=n;
end;
p:=x;
end;
al
int p1(int a[101], int n)
int i,x=-l;
for(i=O;i<n;i++)
if (prim(a[i]) x=i;
return x;
bl
int p2(int a[101], int n)
{
int x=-l;
do x++;
while (lprim(a[x])&&(x<n);
if (x==n) return -1;
else return x;
el
int p3(int a[101], int n)
{
int i,x=-l;
while (x<n-1)
x++;
if (prim(a[x]l) return x;
}
return :x:-n-1;
95
!!!!!!!!!!!!
12. Considernd program, ce valori vor fi n urma
acestuia?
d)
function p(a:sir;n:byte) :integer;
var i:integer;
begin
p:=-l;
for i:=O to n-1 do
if prim(i) then
begin
p:=i;
exit;
end
end;
type sir=array[l .. 10] of integer;
var a:sir; i,n:integer;
procedure x(var a:sir;
var n:integer);
var i,j:integer;
begin
i:=l;
while i<=n do
if a[i]<O then begin
for j:=i to n-1 do
a[j] :=a[j+1];
dec(n) ;
end
else inc(i);
end;
begin
n:=6;
a[1]:=-3;
a[2] :=2; a[3] :=-1;
for i:=l to n div 2 do
a[n-i+1] :=a[i];
x(a,n) ;
for i:=l to n do write(a[i],' ');
end.
a)-3 -1 -1 -3
b) -2 -2
d)
int p4(int a[101], int n)
int i,x=O;
for(i=O;i<n;i++)
if (prim(i)) x=i;
return x;
#include<iostream.h>
int i,n=6,a[10];
void x(int a[10], int& n)
{int i=O,j;
while (i<n) {
if (a[i]<O) {
for(j=i;j<n-1;j++)
a[j]=a[j+1] ;
n--i
}
else i++;
void main()
{
a[0]=-3;
a[I]=2;
a[2]=-I;
for(i=n/2;i<n;i++)
a[i]=a[n-i-1];
x(a,n) ;
for(i=O;i<n;i++)
couta [i]' ';
c) 2 2
d) 3 3 3 3
13. un tablou unidimensional a, ce n elemente de valori
ntregi. care dintre indicele din a al
primului element de valoare O. acesta nu nici un element nul, se
valoarea -1. Pentru varianta Pascal, se de
tip: type ..100] of integer, deci primul element este a[O).
96
a}
function p(a:sir;n:byte} :integer;
var i:integer;
begin
p:=-l;
for i:=O to n-l do
if a[i]=O then p : =i;
end;
b}
function p(a:sir;n:byte} :integer;
var x:integer;
begin
x:=-l;
repeat
ine(x}
until (a[x]=O) or (x=n) ;
p: =x; end;\
e)
function p(a:sir;n:byte} :integer;
var x,i:integer; ok:boolean;
begin
x:=-l; ok:=true;
while (x<n-l) and ok do begin
ine(x) ;
if (a[x]=O) then ok: =false;
end;
if ok then p:=-l else p:=x;
end;
d)
function p(a:sir;n:byte} :integer;
var x:integer;
begin
x:=-l;
while( (a[x+l]<>O)and(x<n-l}) do
ine (x);
p: =x+l;
end;
a}
int p(int a[lOl], int n}
int i,x=O;
for(i=O;i<n;i++}
if (a[i]==O) x=i;
return x;
b}
int p(int a[lOl], int n}
{
int x=-l;
do x++;
while ((a[x] !=O}&&(x<n});
return x;
e}
int p(int a[lOl] I int n}
{
int i,x=-l;
while (x<n-l)
{
x++;
if (a [x] ==0)
return x;
return x-n;
d}
int p(int a[lOl], int n}
{
int x=-l;
while((a[x+l] !=O}&&(x<n})
x++;
return x+l;
14. Ce se va n urma program:
var a:string; var b:ehar;
procedure x(var s:string;
var e: ehar) ;
begin
while e=s[length(s}] do
delete(s,length(s},l} ;
if length(s}>O then
e:=upease(s[length(s}]}
else e:=' .';
end;
#inelude <iostream.h>
#inelude <string.h>
char *a, b;
void x(char *s, char &e} {
while (e==s[strlen(s}-l])
s[strlen(s}-l]=O;
if (strlen(s}>O)
e=s[strlen(s}-l],
e=e>='a'&&e<='z'?e+'A'-'a' :e;
else e=' . ' ;
97
15. Care dintre cea mai mare putere a lui 2 care este
mai sau cu o valoare (<15), ca parametru?
beg-in
a:='copiii'; b:='i';
x(a,bl;
writeln (a, b) ;
end.
b)
funetion F(n:byte) :integer;
var x:integer;
begin
x:=l;
while (x<n) do x:=x*2;
F:=x;
end;
d) copiiiP
x++;
while (1 x <= n );
return 1 (x-1l;
e)
int F(int n)
{
int x=l;
do
c) copiiii
d)
int F(int n)
{
int i,x;
x=l;

{
x*=2;
if (x<=n) return x:
}
return x-1;
b)
int F(int n)
{
int x=l;
while (x-eri) x*=2;'
return x;
a)
int F(int n)
{
int x=-l;
do
void main() {
a = "copiii"; b = 'i';
x(a,b) ;
coutabendl;
}
x*=2;
while (x<n);
return x-1;
b) copiii. a) copP
e)
funetion F(n:byte) :integer;
var x:integer;
begin
x:=l;
repeat
x:=x*2;
until x>=n;
F:=x-1:
end;
d)
funetion F(n:byte) :integer:
var i,x:integer;
begin
x:=l;
for i:=l to n do begin
x:=x*2;
if x<=n then bagin
F:=x; exit;
emd;end;
F:=x-1;
end;
a)
funetion F(n:bytel:integer;
var x:integer;
beg-in
x:=-l;
repeat
inc (xl :
until 1 shI x>n;
F:=l shI (x-1);
end;
98
-
16. Ce se va n urma program:
var a:real;
function F{var x:real) :real;
begin
x: =abs (x*10) ;
F:=int{x/10) + frae{x);
end;
begin
a:=15.25;
write{F{a) :0:2, o O);
write{F{a) :0:2, o ');
writeln{a:0:2) ;
end,
a) 15.50 15.50 1525.00
b) 15.50 1,5.50 152.50
"
#inelude <stdio.h>
float F{float &x)
{ x= (x > o ? x: - (x) ) ;
x*=10;
return int(x/10) + x - int{x);
}
void main{)
{float a=15. 25;
printf{"%0.2f ",F{a;
printf{"%0.2f ",F{a;
printf{"%0.2f ",a);
c) 15.50 152.00 1525.00
d) 15.50 152.00 152.50
17. Cte elemente divizibile cu 10 se vor n urma programului

var x , y: byt.e
function F(var y:byte;x:byte) :byte;
begin
y:=y div 10 + x;
F:= x+y ;
end;
begin
x:=101; y:=10;
write{F{x,y) , o O);
write{x, o , ,y, o ');
writeln{F{x,y ;
end.
#inelude <iostream.h>
int F{int &y, int x)
y = y/10 + x;
return x + y;
}
main{)
{int x = 101, y = 10;
eoutF{x,y)" ";
cout x " 11 y11 Il;
eoutF (x , y) ;
a) 1 b) 2 c) 3 d) 4
18. n urma apelului write(P(n, x)), respectiv coutP(n, x), se
de al cifrei x n scrierea a ntreg n.
antetul corect al subprogramului P.
a) a)
procedure P{n,x:integer) void P{int n, int x)
b) b)
function P{x,e:integer) :integer int P{int x, int e)
e) e)
function P(n:real;x:byte) :byte int P{int n[10] r int x)
d) d)
function P{x:integer;n:ehar) :byte void P{int x, float n)
99
void P2(float n,float x)
variabila n, global, are valoarea 32. Ce se va
n urma apelului write(P(n)+P(n)+1), respectiv cout< <P(n)+ P(n)+ 1?
end.
d) 1.
s+=x%2;
x/=2;
}
return s;
int x[100];
c) 4;
void Pl(int n)
{ char x;
int P(int &x)
{ int s=O;
while (x I =0)
{
b) 3;
20. de
a) 2;
end;
var x:array[l .. 10]of byte;
begin
procedure P2(n,x:real);
begin
end;
void main ()
Care dintre este
procedure Pl(n:integer);
var x:integer;
begin
function P(var x:integer) :byte;
var s:byte;
begin
s:=O;
while x>O do begin
s:=s+x mod 2; x:=x div 2;
end;
P:=s;
end;
19. subprogramul
a) Elementul x[l] poate fi referit oriunde n program, deci n oricare subprogram
Pi sau P2;
b) Programul erori de
c) Elementul x[l] poate fi referit doar n programul principal (varianta Pascal),
respectiv numai n main (varianta C++);
d) Elementul x[ 1] poate fi referit doar n subprogramele Pl P2.
100
2.1.2 Probleme rezolvate
1. Se un vector cu n (1<5: n<5: 40) componente numere naturale mai mici
sau egale cu 60000. se realizeze un subprogram care, primind prin intermediul a
doi parametri tabloul respectiv lungimea sa, ntoarce printr-un alt parametru, cel
mai mare element prim. nu se va returna valoarea 1.
prim care valoarea ca
parametru este un prim. Ea n Pascal valoarea True sau False,
respectiv o valoare sau On C++, cum valoarea parametrului este sau
nu prim.
Exemplu: Pentru n=5 tabloul (1, 6, 7, 55, 19), subprogramul va returna prin
intermediul unui parametru valoarea "19".
Solutie: ,
Subprogramul va avea trei parametri, dintre care unul faptului
valoarea poate fi -1, tipul parametrului nu poate un tip de date
semn. Pentru varianta Pascal este definit tipul de date sir, iar subprogramul realizat
este o faptului rezultatul este returnat prin intermediul unui
parametru. Tot din acest motiv, n varianta C++, are tipul void.
2. Se un vector cu n (1<5: n<5: 50) componente numere naturale, mai mici
sau egale cu 30000. se realizeze un subprogram care, primind prin intermediul a
doi parametri tabloul respectiv lungimea sa, toate elementele care
un maxim de cifre n reprezentarea n baza 10.
nrc care pentru o valoarea printr-un parametru,
de cifre din reprezentarea acesteia n baza 10.
Exemplu:Pentru n=4 tabloul (231, 54, 809,2), subprogramul va 231, 809.
type sir=array[l .. 40] of word;
procedure P{x:sir; n:byte;
var y: longint) ; {
int i;
y = -1;
for{i = O;i < n; i++)
if (prim{x[i])&&{x[i]>y))
y = x[i];
void P{unsigned int x[40],
int n, long &y)
1
2
3
4 var i:byte;
5 begin
6 y:=-l;
7 for i:=l to n do
8 if (prim{x[i]))and{y<x[i])
9 then y:=x[i];
10 end;
Solutie:
Subprogramul va avea doi parametri valoare. Pentru varianta Pascal, subprogramul
realizat este o faptului pe care trebui o realizeze
este cea de fie necesar transferul unor rezultate. Tot din acest motiv,
n varianta C++, are tipul void. Pentru varianta Pascal se
definit tipul de date I ..50] ofword;.
101
4. Subprogramul L permite, .nlocuirea elementelor unui vector a, transmis ca
parametru, cu. suma factorialelor cifrelor lor, nu se ntr-un
interval [x,y]. Subprogramul va primi prin intermediul a trei parametri ntregi,
lungimea vectorului n (n5. 50) limitele intervalului. El va face apel la S,
102
Solutie:
n se faptul rezultatul nu va fi transferat prin intermediul
parametrilor Deoarece tipul valorii rezultat unui tip de date
simplu, este realizarea unei al rezultat va fi de tipbyte /
unsigned int,
nu va realiza transfer de date prin parametri valoare, deoarece limitele
intervalelor citite acestora vor reprezenta variabile locale.
3. Se citesc de la n (15. n5. 50) intervale de numere ntregi de forma [a, b],
introduse prin limitele a b a5.b5. 100). se realizeze un subprogram
care de citire a intervalelor maxim de
valori palindrom incluse ntr-unul dintre intervalele citite, a folosi vreun
parametru. pal care valoarea
printr-un parametru un palindrom. Ea
n Pascal valoarea True sau False, respectiv o valoare sau On C++,
cumvaloarea parametrului este sau nu palindrom.
Exemplu:Pentru intervalele [32, 44], [2,4], [5, 12], [56, 62], subprogramul
va returna valoarea 6, deoarece intervalul [5, 12] 6 numere palindrom.
unsigned int citeste()
{
int i,j,nr,m,n,a,b;
m=O; cinn;
for (i=l;i<=n;i++) {
cina; cinb; nr=O;
for (j=a;j<=b;j++)
if (pal(j)) nr++;
i.f (nr>m) m=nr;
}
return m;
}
void P(int x[50],int n)
{
int i,m=O;
for (i=O; i<n;i+*)
if (rrrc tx i l j c-m)
m=nrc{x[i]) ;
for (d=O;i<n;i++)
if (nrc(x[i])==m)
coutx[i]' ';
1 function citeste:integer;
2 V'ar i,j,nr,m,n,a,b:byte;
3 begin
4 m: =0; readln (n ) ;
5 for i:=lto n do begin
readln{a,b); nr:=O;
7 for j:=a ta b do
8 if pal{j) then inc{nr);
9 if nr>m then. m:=nr;
10 end;
11 citeste:=m;
12 end;
p.:t;0ce,dureJ {x : sir; n : byte) ;
var m, i:byte;
3 begin
4. m:=O;
5 for i:=l ta n do
6 if (nrc(x[i]m)then
7 m: =nrc (x[i]);
8 for i:=l ton.do
9 if (nrc{x[i]);=m)then
10 write{x[i],' ');
11 end;
{
long i,v;
for (i=O;i<n;i++){
v=S(a[i]);
if ((v<x) II (v>y)) a[i]=v;
}
}
void L(long a[50],int n,
int x , int y) L(var a:sir;
n,x,y:integer) ;
var i,v:longint;
begin
for i:=l to n do begin
v:=S(a[i]);
if (v<x)or(v>y)then ari] :=v
end;
end;
type \
sir=array[1 .. 50]of longint;
1
2
3
4 function S(x:integer) :longint;
5 var sm,p,i:longint;
6 begin
7 sm:=O;
8 while x<>O do begin
9 p:=l;
10 for i:=l to x mod 10 do
11 p: =p*i;
12 sm:=sm+p; X:=X div 10;
13 end;
14 s:=sm;
15 end;
16 procedure
17
18
19
20
21
22
23
24
care suma factorialelor cifrelor unui natural transmis printr-un
parametru. complete ale subprogramelor L S. elementele
vectorului sunt numere ntregi mai mici ca 10.000.
Exemplu: Pentru n=5, x=5 y=35 tabloul a=(lO, 234, 21, 148, 34) la finalul
subprogramului L, elementele lui a vor fi (2,234, 3, 40345, 34).
Solutie:
Subprogramul va avea patru parametri, dintre care unul Pentru
varianta Pascal este definit tipul de date sir, iar subprogramul realizat este o
faptului rezultatele sunt returnate prin intermediul unui
parametru (ce nu unui tip de date simplu). Tot din acest motiv, n varianta
C++, are tipul void.
Valoarea de S este n variabila v, pentru a se evita
apelul repetat pentru o valoare a parametrului.
long S (int x)
{
long s,p,i;
s=O;
while (x!=O)
p=l;
for (i=1;i<=x%10;i++)
p*=i;
s+=p;
x/=10;
}
return s;
5. un subprogram S, care ordonarea elementelor unui vector a
de numere ntregi, transmis ca parametru. Subprogramul va primi, prin intermediul
parametrilor ntregi x y, indicii elementelor ntre care se va face sortarea. Tipul
care se a fi va fi transmis
codificat prin parametrul ntreg k. la apel, acestuia i se transmite valoarea 1,
atunci se va realiza o ordonare iar valoarea acestuia
este -1, sortarea va fi
Exemplu: vectorul a=(lO, 234, 21, 1, 34). Subprogramul S apelat de
ori, pentru ordonarea a primelor trei elemente a
elementele tabloului astfel: (l0, 21, 234, 34, 1).
103
Solutie:
Subprogramul va avea patru parametri, dintre care unul (tabloul a). Pentru
varianta Pascal este definit tipul de date sirsarray]1:.50]of integer, iar
subprogramul realizat este o faptului rezultatele sunt
returnate prin intermediul unui parametru (ce nu unui tip de date simplu).
Tot din acest motiv, n varianta C++ are tipul void.
Inegalitatea care intervine n procesul de ordonare k*a[i]>k*aljl
semnul cnd valoarea lui k este -1, realizndu-se astfel o ordonare

6. S un tablou uni dimensional, pnrmt prin intermediul
parametrului a, o permutare, puncte fixe, a numerelor de la
1 la n (n:::;50, transmis ca parametru ntreg). Subprogramul n Pascal,
valoarea True sau False, respectiv o valoare sau n C++, cum tabloul
primit sau nu o permutare puncte fixe.
Spunem o permutare (a), a2 ...a
n
) are puncte fixe cel un element
ai = i (l:::;i:::;n). De exemplu, pentru n=4, permutarea (2,4,3,1) are puncte fixe
deoarece a3=3.
Subprogramul S va apela nr, care de al unei
valori ntr-un vector. Att valoarea ct tabloul lungimea acestuia sunt
primite de nr prin intermediul parametrilor.
complete ale subprogramelor S nr.
1 procedure S(var a:sir;
2 k,x,y:integer);
3 var i,j,t:integer;
4 beg-in
5 for i:=x ta y-l do
6 for j:=i+l ta y do
7 if k*a[i]>k*a[j] then
8 beg-in
9 t: =a li] ;
10 ali] :=a[j];
11 a[j] :=t
12 end;
13 end;
void S(int a[50],int k,
int x , int y)
{
int i,j,t;
for (i=Xii<Yii++)
for (j=i+l;j<=y;j++)
if (k*a[i]>k*a[jJ) {
t=a[i] i
ali] =a[j] ;
a [j] =t;
}
Exemplu: Pentru n==5 oricare dintre tablourile (2, 4, 5, 1, 2) sau (2, 1,5,4,3 ) se
va returna valoarea False/O.
Solutie:
S va avea doi parametri: tabloul a n, lungimea acestuia. nr va fi
pentru a verifica tabloul a o permutare a
numerelor de la 1 la n. Pentru varianta Pascal este definit tipul de date sir=
array[1..50]ofbyte.
104
nr:=m;
end;
function nr(a:sir;
n , x: byte) :byte;
var m:byte;
begin
m:=O;
for i:=l ta n do
if a[i]=x then inc(m);
var i:byte;
begin
S:=true;
for" i:=l ta n do
if
then S,: =false;
end;
m++;
return 1;
return m;
int S(int a[50],int n)
{
int i;
for (i=l;i<=n;i++)
if ((nr(a,n,i) !=1) II
(a[i-1]==i) )
return O;
int nr(int a[50] ,int n,int x)
{
int m=O;
for (i=O;i<n;i++)
if (a[i]==x)
1
2
3
4
5
6
7
8
9
10
11 function S(a:sir;n:byte):
12 boolean;
13
14
15
16
17
18
19
7. Subprogramul X prin intermediul a doi parametri, un tablou
unidimensional' de numere ntregi de elemente al acestuia (::;100). El
prin intermediul altor doi parametri ntregi, cifra ce apare n
scrierea din baza IOa elementelor vectorului de al acesteia.
n cadrul subprogramului X se subprogramul D, care pentru o
valoare ca parametru, cifra a sa de
al acesteia. Aceste valori sunt returnate de D prin intermediul a doi parametri
ntregi.
complete ale celor subprograme.
Exemplu: Pentru tabloul ce 5 elemente: (22, 405, 5125, 102, 53),
subprogramul X va returna valori 5 4, reprezentnd cifra a
elementelor din vector de al acesteia.
Solutie:
Pentru varianta Pascal, ambele subprograme vor fi implementate ca proceduri,
rezultatele fiind returnate, pentru fiecare, prin intermediul a doi parametri
Pentru varianta C++, vor fi, din motiv, de tip void. Subprogramul
D va determina, pentru fiecare element din vector, cifra de
al acesteia.
Pentru varianta Pascal definit tipul de date sir=array[1..100jofinteger.
1 procedure D(x:integer;
2 var c,m:byte);
3 begin
4 m:=O; c:=O;
5 while x<>O do begin
6 if c<x mod 10 then begin
7 c:=x mod 10; m:=l;
8 end
void D(int x,int &c, int &m)
{
m=O; c=O;
while (x!=O) {
if (c<x%10) {
c=x%10;
m=l;
}
105
Solutie:
Fib o valoare x un termen al lui
Fibonacci folosind trei variabile locale de tip ntreg. Ea este de L
pentru fiecare element din matrice, contorizndu-se n timp de
valori corecte de pe fiecare linie. Pentru varianta Pascal, definit tipul de
date mat=array[1..10,1..10}of integer.
8. o matrice cu n linii n.coloane O), cu elemente valori
strict pozitive. L de ordine al liniei ce cele mai
multe elemente care sunt termeni ai lui Fibonacci. Matricea n de
linii sunt transmise prin intermediul a doi parametri.
n cadrul L se va face apel la Fib .care o. valoarea
ca parametru un termen al lui Fibonacci. Ea
n Pascal valoarea True sau False, respectiv o valoare sau On
C++, cum valoarea parametrului este sau nu termen al
complete ale subprogramelor L Fib.
Exemplu: Pentru n=3 tabloul: L va returna valoarea 2.
2 14 8
3 5 21
21 4 4
9 else
10 if c=x mod 10 then inc (m) ;
11 x:=x div 10;
12 end;
13 end;
4
15 procedure X(a:sir; n:byte;
16 var cm,nm:byte) ;
17 var i,c,m:byte;
18 begin
19 cm:= O; nm := O;
20 for i: =1 to n do begin
21 D(a[i] ,c,m);
22 if c=cm then nm:=nm+m
23 else if c>cm then begin
24 cm:=c;
25 nm:=m
26 end
end
end;
1 function Fib(x:integer) :boolean;
2 var a,b,c:integer;
3 begin
4 a:= 1; b := 1;
5 while a+b<=x do begin
6 c:= a + b; a := b; b := c;
7 end;
8 fib.- (c = x)or(x = 1);
9 end;
106
else
if (c==x % 10) m++;
x=x / 10;
}
}
void X{int a[100],int ni
int &cm,int &nm)
{
int i,c,m;
cm = O; nm = O;
for (i=O;i<n;i++) {
D(a[i] ,c,m);
if (c==cm) nm+=m;
else
if (c>cm)
{cm=c; nm=m;}
}
}
int Fib(int x)
{
int a,b,c;
a = 1; b 1;
while (a + b<=x) {
c = a + b; a = b; b = c;
}
return (c==x) II(x==l) ;
Solutie:
de zerouri n care se produsul unor numere este egal cu cel mai
mic exponent al factorilor de 2 de 5, care apar n descompunerea lor.
Z va apela subprogramul Exp pentru a determina n
varianta Pascal, subprogramul Exp va fi implementat ca deoarece se
impune ca valoarea exponentului fie lui X prin intermediul unui
parametru Din motiv, n varianta C++, Exp va avea tipul
void.
9. text in.txt pe o linie, mai multe numere naturale mai
mici ca 30000, separate prin cte un Z permite citirea tuturor
valorilor Cli,n de zerouri n care se produsul
valorilor citite.
n cadrul ei este apelat subprogramul Exp care prin intermediul unui
parametru ntreg, exponentul la care apare un prim n descompunerea unui
natural. Ambele valori sunt primite de subprogram prin intermediul a doi
-e'
parametri ntregi.
complete ale subprogramelor Z Exp.
Exemplu: Considernd in.txt 24, 25, 15,.10, 150, atunci
Z va returna valoarea 5.
procedure Exp(x,f:integer;
var e: integer) ;
107
!!!!!!!!!!!!!
e++;
x/=f;
}
}
int Z()
{
FILE *f; int e5,e2,x;
e5=e2=0;
f=fopen( "in. txt", "r");
void Exp(int x,int f,int &e)
{
while (x%f==O)
{
int L(int a[10] [10] ,int n)
{int 1,i,j,m,mx;
mx=O;
for (i=O;i<n;i++) {
m=O;
for (j=O;j<n;j++)
if (Fib(a[i] [j])) m++;
if (m > mx) {
1 = i; mx = m;
}
}
return 1+1;
do begin
begin
while x mod f=O
inc(e) ;
x:=x div f;
end;
end;
1
2
3
4
5
6
7
8
9
10 function Z: integer;
11 var f:text;e5,e2,x:integer;
12 begin
13 e5:=0; e2:=0;
14 assign(f, 'in.txt'); reset(f);
10 Function L(a:mat; n:byte) :byte;
11 var i,j,m,mx:byte;
12 begin
13 mx: = O;
14 for i: =1 to n do begin
15 m: = O;
16 for j:=l to n do
17 if Fib(a[i,j]) then inc(m);
18 if m > mx then begin
19 L: = i; mx: = m;
20 end
21 end;
22 end;
10. Se un natural x, citit de la se realizeze un program
care cel mai apropiat de x care factorialul unei valori.
Programul va subprograme:
P, care o valoare ca parametru poate fi scris
sub forma k!
A, care are doi parametri ntregi x t. Ea cel mai mic
mai mare ca x sau cel mai mare mai mic dect x de forma k!,
cum valoare unui parametru teste 1 sau - 1 la apel.
Exemplu: Pentru x=10 se va 6 (6=3!)iar pentru x=22 se va 24 (24=4!).
Solutie:
A va sau valoarea a parametrului x, cnd acesta
va avea o valoare de forma k!. Valoarea la apel de parametru valoare t va
reprezenta valoarea cu care se va modifica x n cadrul
P n Pascal, valoarea True sau False, respectiv o valoare
sau On C++, cum valoarea parametrului sau nu factorialul unei
valori.
15 while not eof(f) do begin
16 read(f,x);
17 Exp(x,5,e5); Exp(x,2,e2);
18 end;
19 close(f);
20 if e5<e2 then Z: =e5
21 else Z:=e2;
22 end;
while (fscanf(f,"%d",&x)==l)
{
Exp(x,5,e5); Exp(x,2,e2);
}
fclose(f) ;
return e5<e2 ? e5 e2;
function A(x,t:integer) :integer;
begin
while (not P(x)and(x>O)) do
int A(int x,int t)
{
while (!P(x)&&(x>O)) x+=t;
return x;
void main ()
cinx;
if (x-A(x,-l)<A(x,l)-x)
coutA(x, -1) ;
else coutA(x,l);
int P(int x)
{ int i,y;
y=l; i=l;
while (y<x)
y*=i; i++;
}
return (y==x);
#include <iostream.h>
int x;
then
x:=x+t;
begin
readln (x) ;
if x-A(x,-l)<A(x,l)-x
write (A(x, -1) )
else write(A(x,l));
end.
A:=x;
end;
1 var x:integer;
2 function P(x:integer) :boolean;
3 var i,y:integer;
4 begin
5 y:=l; i:=l;
6 while y<x do begin
7 y:=y*i; inc(i)
8 end;
9 p:= y=x;
10 end;
11
12
13
14
15
16
17
18
19
20
21
22
23
24
108
11. o matrice cu n lini n coloanetxsl O), cu elemente valori
strict pozitive. L de ordine al liniei ce cele mai
multe elemente care sunt valori autopomorfice. Numim autopomorfic o
valoare care este cu unul dintre sufixele Exemplu de valoare
este 25 .deoarece 25
2
=625.
Matricea n de linii ale sale sunt transmise prin intermediul a doi
parametri.
n cadrul L se va face apel la A, care o valoarea
ca parametru este Ea n Pascal
valoarea True sau False, respectiv o valoare sau O n C++, cum
valoarea parametrului este sau nu autopomorfic.
complete ale subprogramelor L A.
Exemplu: Pentru n=3 tabloul: L va returna valoarea 2.
2 5 8
3 5 25
644
Solutie
A o valoare x este autopomorfic folosind o
care este cu lui x.
Ea este de L pentru fiecare element din matrice, contorizndu-se n
timp de valori corecte de pe fiecare linie.
Pentru varianta Pascal, definit tipul de date mat=array[l.. 10,1..10]of
integer.
}
return 1+1;
}
return 1;}
int L(int b[10] [10] ,int n)
{ int 1,i,j,ro,mx;
mx = O;
for (i=O;i<n;i++) {
ro = O;
for (j=O;j<n;j++)
if (A(b[i] [j])) ro++;
if (ro > mx) {
1 = i; mx = ro;
}
int A(int x)
{ int y;
y = x * x;
while (x>O) {
if (y % 10!=x % 10)
return O;
x/=10;
y/=10;
mx := ro; L := i;
end
end;
end;
1 function A(x:integer) :boo1ean;
2 var y:integer;
3 begin
4 y:= x * x; A:=true;
5 while x>O do begin
6 if y mod 10<>x mod 10 then
7 begin
8 A:=fa1se; exit;
9 end;
10 x : =x div 10; y: =y div 10;
11 end; end;
12 Function L(b:mat; n:byte) :byte;
13 var i,j,m,mx:byte;
14 begin
15 mx:= O;
16 for i: =1 to n do begin
17 ro:= O;
18 for j:=l to n do
19 if A(b[i,j]) then inc(ro);
20 if ro > mx then begin
21
22
23
24
109
!!!!!!!!!!!!!
Solutie:
Pentru a determina suma elementelor POZitive din cu numerele de ordine
cuprinse ntre x y(inclusiv x y), se va apela S pentru k = x k = y + 1.
Programul va celor valori returnate de Ambii
parametri ai un transfer prin valoare.
13. un program care verifice o valoare x (2<x<1000),
de la un perfect (egal cu suma divizorilor
strict mai mici dect el). Vor fi definite apelate subprograme:
D, care suma divizorilor unei valori transmise printr-un
parametru ntreg k, divizori strict mai mici dect k.
F, care de valori perfecte dintr-un interval [a, b]
transmis prin intermediul a doi parametri ntregi (1<a<b).
Exemplu: Pentru x=28 programul va mesajul "Da" (28=1+2+4+7+14), iar
pentru x=29 se va mesajul "Nu".
12. S prin intermediul parametrului a, un vector de numere
ntregi cu 10 de elemente prin intermediul parametrului k, un natural
nenul (kS;10). suma tuturor elementelor pozitive a[iJ cu
proprietatea kS; iS;lO. un program care de la intrarea standard un
de 10 de valori ntregi numere naturale nenule x y (x<yS;10)
suma elementelor pozitive din cu numerele de ordine cuprinse ntre x y,
folosind apeluri la S.
Exemplu: Pentru 2, 5, 3 ,-7, -8, -9,4, 2, 3, 3, A,=3 y=8 programul va
valoarea 9. (3+4+2=9)
int S{int a[ll], int k)
{int t,i;
t=O;
for (i=k;i<=10;i++)
if (a[i]>O) t+=a[i];
return t;
#include <iostream.h>
int i,x,y, v[ll];
void main{)
{
for (i=1;i<=10;i++)
cinv[i];
cinxy;
cout(S(v,x)-S(v,y+1)) ;
}
begin
for i:=l to 10 do read{v[i]);
readln{x,y) ;
writeln{S{v,x)-S{v,y+1)) ;
end.
type
sir= array[l .. 10]of integer;
var i,x,y:integer; v:sir;
1
2
3
4
5 function S{a:sir;k:byte) :word;
6 var t,i:integer;
7 begin
8 t:=O;
9 for i:=k to 10 do
10 if a[i]>O then t:=t+a[i];
11 S:=t;
12 end;
13
14
15
16
17
18
Solutie:
D va fi n cadrul subprogramului F, pentru fiecare din valorile
ntregi din intervalul [a, b], contorizndu-se de valori perfecte.
110
111
ca x fie perfect este cu expresia F(2, x-l)=l:F(2, x).
n cadrul ambelor se doar transfer prin valoare.
Solutie:
n varianta Pascal, subprogramul P va fi implementat ca deoarece
rezultatul este returnat printr-un parametru. Din motiv, n C++, P
are tipul void.
Subprogramul.va identifica prin apeluri la Nr, elementul din vector pentru
care se k-l elemente de valori strict mai mici dect el.
cinxi
if (F(2 , x-T) !=F(2, x)}
cout"DA" i
else cout "NU" i
void main(}
{
int F(int a/int b)
{int S/ii
S=Oi
for (i=aii<=bii++)
if (D(i) ==i} s++;
return Si
long int D(int k}
{long int S/ii
S=Oi
for (i=lii<=k/2ii++)
if (k%i==O) S+=ii
return Si
# include<iostream.h>
int Xi
x} then
begin
readln (x) i
if F(2, x-I)<>F(2 ,
write ('DA')
else write('NU'}i
end.
function F(a,b:integer} :wordi
var s,i:integer;
begiD:
s: =0 f,.
for i:=a to b do
if D(i}=i then inc(s}i
F:=Si
endi
function D(k:integer} :wordi
var s,i:wordi
begin
S:=Oi
for i:=l to k div 2 do
if k mod i=O then S:=S+ii
var x: wordi 1
2
3
4
5
6
7
8
9 D:=Si
10 endi
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
14. un vector a cu n (n<100) elemente numere naturale distincte
9999) o valoare k (k<n). Se determinarea celui de-al k-Iea
element din vectorul ordonat. Subprogramul P acest element a sorta
efectiv elementele vectorului. Acesta are ca parametri pe a, n k, iar valoarea
o prin intermediul unui parametru ntreg x.
n cadrul subprogramului se face apel la Nr care cte elemente
dintr-un vector sunt mai mici dect o valoare Vectorul, de elemente
ale acestuia valoarea sunt transmise prin parametri.
complete ale subprogramelor P Nr.
Exemplu: Pentru tabloul ce 5 elemente: (220,45,5125, 102,53) k=3, se
va determina valoarea 102.
Exemplu: Pentru n=21 se va 13+5+2+1, iar pentru n=150 se va 144+5+1
15. un program care descompune un natural n n
de minimum doi termeni ai lui Fibonacci (f
l=1,
f
2=1,
f
3=2,
fn=f
n_
l+f
n
-
2).
n cadrul programului va fi o Fib care cel mai mare
termen din Fibonacci, strict mai mic dect o valoare prin
intermediul unui parametru.
{
int i;
i=O;
while ((Nr(a,n,a[i]) !=k-l}&&
(i<=n}) i++;
x=a[i] ;
}
void P(int a[lOO],int n,
int k,int &x}
int Nr(int a[lOO],int n,int x}
{
int t,i;
t=O;
for (i=O;i<n;i++)
if (a[i]<x) t++;
return t;
and (Nr(a,n,a[i]}<>k-l)
(i<=n) do inc(i};
x:=a[i] ;
end;
function Nr(a:sir;
n,x:integer} :byte;
var t,i:integer;
begin
t:=O;
for i:=l ta n do
if a[i]<x then inc(t};
Nr:=t;
end;
1
2
3
4
5
6
7
8
9
10
11 procedure P(a:sir;n,k:integer;
12 var x:integer};
13 var i:integer;
14 begin
15 i:=l;
16 while
17
18
19
Solutie:
Fib va avea un singur parametru, transmis prin valoare, va returna o
valoare dintr-un tip ntreg. Ea va fi pentru valoarea n, apoi pentru
dintre n valoarea anterior, Toate valorile n
urma apelurilor la Fib, vor reprezenta termeni din scrierea lui n ca de
elemente ale lui Fibonacci.
1 var n,x:byte;
2
3 function fib(n:byte} :byte;
4 var a,b,c:byte;
5 begin
6 a:=l;b:=l;
7 while a+b<n do begin
8 c:=a+b;
9 a:=b;
10 b: =c;
11 end;
12 fib: =b;
13 end;
14
#include <iostream.h>
int n,x;
int fib(int n}
{int a,b,c;
a=l; b=l;
while (a+b<n)
c=a+b;
a=b;
b=c;
}
return b;
}
112
n:=n-x;
end;
writeln(n)
end.
15 begin
16 readln (n) ;
17 while n>2 do begin
18 x:=fib(n);
19 write(x,");
20
21
22
23
void main()
{cin n;
while (n>2) {
x=fib(n) ;
coutx' ';
n=n-x;
coutn' ';
16. Se un de n numere scrise n baza 16. se realizeze un program
care cel mai mare divizor comun al acestor numere, n
reprezentarea din baza 10. n cadrul programului, vor fi definite apelate
subprograme:
Conv, care un de caractere reprezentnd un
exprimat n baza 16 n urma conversrei
acestuia n baza 10.
Cmmdc, care cel mai mare divizor comun a valori
naturale transmise prin intermediul a doi parametri.
Cifrele din baza 16 sunt reprezentate prin cifrele zecimale 0, ..,9 majusculele
A,B,C,D,E,F resturilor de la IOla 15).
Exemplu: Pentru n=3 numerele IA, 27 41 valoarea 13.
Solutie:
Ambele vor realiza transfer de date prin intermediul unor parametri valoare.
Conv va fi pentru fiecare hexazecimal. Valorile returnate de
ea vor constitui parametri actuali(efectivi) n cadrul apelurilor la Cmmdc.
Conv:=nr;
end;
var s:string; n,i,a,b:integer;
function Conv(s:string) :integer;
var i, nr:integer;
begin
nr:=O;
for i:=l to length(s) do
if s [ i ] in [' O' .. ' 9 '] then
nr:=nr*16 + ord(s[i])-48
else
nr:=nr*16 + ord(s[i])-55;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 functicn ChIIrlc(a,b:integer) :integer;
16 begin
17 while a<>b do
18 if a>b then a: =a-b
19 elsa b:=b-a;
20 cmmdc: =a;
21 end;
22
#include <iostream.h>
#include <string.h>
char s[100]; int n,i,a,b;
int Conv(char [100])
{int i, nr=O;
for (i=O;i<strlen(s) ;i++)
if (s[i]>='O' && s[i]<='9')
nr=nr*16 + s[i]-48;
else
nr=nr*16 + s[i]-55;
return nr;
int Cmmdc(int a,int b)
{
while (a!=b)
if (a>b) a=a-b;
else b=b-a;
return a;
113
Solutie:
n varianta Pascal, toate subprogramele vor fi implementate ca proceduri avnd ca
parametru tabloul bidimensional. Din motiv, n C++ toate cele trei
au tipul void, numele tabloului transmis ca parametru fiind el un
pointer.
Pentru varianta Pascal definit tipul de date mat=array[l.. 100,1..100Jaf
byte.
couta
void main() {
cinn; cins;
a=Conv(s) ;
for (i=2; i<=n ;i++){
cin s; b=Conv(s);
a=Crmndc (a, b) ;
se va tablou
132
123
213
23 begin
24 readln(n); readln(s);
25 a:=Conv(s);
26 for i: =2 to n do begin
27 readln(s); b:=Conv(s);
28 a: =Crmndc (a, b) ;
29 end;
30 writeln(a);
31 end.
17. o matrice a cu n linii n coloane (n:SJOO). Se
ordonarea elementelor diagonalei principale prin de linii coloane.
subprograme:
subprogramul interl, care elementele a linii, ale
indici sunt ca parametri.
subprogramul intere, care elementele a coloane, ale
indici sunt ca parametri.
subprogramul S care elementele diagonalei secundare prin apeluri
la interl intere.
Toate cele trei subprograme vor avea matricea a n de linii transmise
prin parametri.
Exemplu: Pentru n=3 tabloul
321
213
312
var i,t:bytei
{
int i,ti
for (i=O;i<n;i++){
t=a[x] [i];
a [x] li] =a [y] li] ;
a [y] li] =t;
{ int i,t;
}
}
void interc(int a[100] [100],
int n,int x,int y)
void interl(int a[100] [100],
int n,int x,int y)
procedura interc(var a:mat;
n,x,y:byte) ;
procedure interl(var a:mat;
n,x,y:byte) ;
1
2
3 var i, t:byte;
4 begin
5 for i:=l to n do begin
6 t:=a[x,i);
7 a[x,i]:=a[y,i];
8 a[y,i]:=t;
9 end;
10 end;
11
12
13
14
114
procedure S(var a:mat;n:byte};
begin
for i:=l to n-l do
for j:=i+l to n do
if a[i,i]>a[j,j] then begin
interl(a,n,i,j} ;
interc(a,n,i,j} ;
end;
end;
15 begin
16 for i: =1 to n do begin
17 t:=a[i,x]; a[i,x] :=a[i,y];
18 a[i,y] :=t;
19 end;
20 end;
21
22
23
24
25
26
27
28
29
30
for (i=O;i<n;i++) {
t=a[i] [x]; ali] [x]=a[i] [y];
ali] [y]=t;
}
}
void S(int a[lOO] [lOO],int n}
{
for (i=O;i<n-l;i++)
for (j=i+l;j<n;j++)
if (a[i] [i]>a[j] [j])
{
interl(a,n,i,j) ;
interc(a,n,i,j) ;
}
18. O care suma tuturor cifrelor a valori
naturale transmise prin intermediul a doi parametri.
Se determinarea unei perechi de elemente distincte, ale unui tablou
unidimensional care au proprietatea suma tuturor cifrelor lor este
Vectorul se a avea maximum 100 de elemente pozitive cu valori mai
mici dect 2.000.000.000.
Subprogramul P, prin doi parametri, vectorul lui de elemente
prin intermediul altor doi parametri, elementele tabloului ce au
proprietatea Acesta va face apel la S.
celor subprograme.
Exemplu: Pentru n=5 tabloul (86, 15, 13, 86, 112), subprogramul P va returna
valorile 86 15(8+6+1+5=20=suma
Solutie:
n varianta Pascal, subprogramul P va fi implementat ca avnd doi
parametri ntregi. vor returna elementele tabloului, pentru care
suma tuturor cifrelor este Din motiv, n C++ P are tipul
void.
Tabloul de elemente ale acestuia vor reprezenta, pentru subprogramul
P, parametri valoare. Pentru varianta Pascal definit tipul de date
sire.array[ 1.. 100Jof longint.
1 function S(x,y:longint} :byte;
2 var su:byte;
3 begin
4 su:=O;
5 while (x>O}or(y>O}do begin
6 su:=su+x mod 10+y mod 10;
7 x:=x div 10; y:=y div 10;
8 end;
9 S:=su;
10 end;
int S(long x,long y)
{
int su;
su=O;
while (x>ol IY>O) {
su += X % 10 + y % 10;
x 1= 10; y 1= 10;
}
return su;
115
19. Fie un tablou unidimensional cu n elemente ntregi. Se cere se realizeze un
subprogram S care elementele vectorului, de
cifre distincte pe care le n cazul elementelor cu de cifre
distincte, ordonarea se va face valorile lor. Subprogramul va
apela Nr care de cifre distincte ale unui ntreg
primit prin intermediul unui parametru.
11 procedure P(a:sir;n:byte;
12 var x,y:longint);
13 var max,i,j:byte;
14 begin
15 max: =0;
16 for i:=l to n-l do
17 for j :=i+l to n do
18 if (max<S(a[i] ,a[j]) )and
19 (a[i]<>a[j]) then begin
20 max:=S(a[i] ,a[j]);
21 x:=a[i]; y:=a[j];
22 end;
23 end;
void P(long a[100],int n,
long & x,long & y)
{int max,i,j;
max=O;
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
if (max<S(a[i],a[j])
&& ari] !=a[j])
{
max=S(a[i] ,a[j]);
x=a [ i]; y=a [ j ] ;
}
Exemplu: Primind n=7 tabloul (334, 124, 21, 34, 222, 1, 9) subprogramul S va
transmite, n urma tabloul (124, 334, 34, 21, 222, 9, 1).
Solutie:
n varianta Pascal, subprogramul S va fi implementat ca avnd ca
parametru tabloul unidimensional ca parametru valoare de
elemente ale acestuia. Din motiv, n C++ S are tipul void, numele
tabloului transmis ca parametru fiind el un pointer.
Pentru varianta Pascal definit tipul de date l .. lOOjofinteger.
1 function Nr(x:integer) :byte;
2 var m:byte; e:set of byte;
3 begin
4 m:=O;
5 e:= u.
6 while (x>O) do begin
7 if not (x mod 10 in e) then
8 begin
9 ine (ml :
10 e:=e+[x mod 10];
11 end;
12 x:=x div 10;
13 end;
14 Nr:=m;
15 end;
16
17 procedure S(var a:sir;n:byte);
18 var i,j :byte;x:integer;
19 begin
116
!!!!!!!!!!!!!
int Nr(int y)
{
int x,i/m/ci
m=O;
for (i=0;i<10;i++){
e=O;
x=y;
while (x>O)
if (x % 10 i) e=l;
x /= 10;
}
if (e) m++;
}
return m;
}
void S (int a[lOO], int n)
{
int i, j ,x;'
Solutie:
n varianta Pascal, subprogramele Ins Rez vor fi implementate ca proceduri,
ambele avnd prin parametri tabloul unidimensional
lungimea acestuia. n C++, Ins Re: au tipul void, transferul tabloului
a lungimii acestuia realizndu-se tot prin parametri
L va fi pentru oricare pereche de elemente consecutive de semne
contrare. Valorile returnate de ea, vor constitui parametri actuali la apelul
subprogramului Ins.
Pentru varianta Pascal, definit tipul de date sir=array[l ..lOO]of
integer.
20. Se un vector ce n elemente ntregi. n element
precedat de un element de semn contrar se un element pozitiv, a
valoare este prin alipirea cifrelor celor numere de semne contrare, n
ordine. se scrie trei subprograme:
L, care natural prin alipirea, n ordine, a
cifrelor a valori primite prin intermedul unor parametri ntregi.
subprogramul Ins, care permite inserarea ntr-un vector, pe o a
unei valori date. Vectorul, indicele pe care se efectueze inserarea
valoarea care se va insera sunt transmise subprogramului prin intermediul
parametril or.
subprogramul Rez, care n urma apelurilor la subprogramele Ins A,
prelucrarea prin asupra unui vector pe care l
pintr-un parametru.
Exemplu: subprogramuluiRez, tabloul (3,-1, 73, 5, -9,2) va
elementele (3,31,-1,173,73,5,59, -9, 92, 2).
20 for i:=l to n-1 do
21 for j:=i+1 to n do
22 if (Nr(a[i])<Nr(a[j]))or
23 ((Nr(a[i])=Nr(a[j])) and
24 (a[i]<a[j]))
25 then begin
26 x: =a [i]; a [i] : =a [j ] ;
27 a[j] :=x;
28 end;
29 end;
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
if (Nr(a[i])<Nr(a[j]) II
Nr(a[i])==Nr(a[j])&&
a[i]<a[j] )
{
x=a[i]; a[i]=a[j] ;a[j]=x;
}
function L(x,y:integer) :integer;
var z:integer;
begin
1
2
3
4 z:=y;
5 while (z>O) do
6 x:=x*10;
7 z:=z div 10;
8 end;
9 L:=x+y;
10 end;
begin
int L(int x,int y)
{
int z;
z=y;
while (z>O)
x *=10;
z/=10;
}
return x+y;
117
118
2. Se un tablou unidimensional a ce n (n::;100) elemente numere
ntregi. se realizeze un program care elementele situate n
prima a vectorului pe cele situate n a doua
Programul va subprograme:
1. Se un tablou unidimensional a ce n (n::;100) elemente numere
naturale. Se cere realizarea unui program care fiecare element din
vector cu cel mai apropiat prim de acesta. Programul va
subprograme:
subprogramul Citeste, care citirea de la a valorii lui n
a elementelor vectorului a.
Prim, care valoare printr-un parametru ntreg
este prim. Rezultatul va fi de tip logic n varianta Pascal de
tip ntreg (0/1) pentru C++.
Det, care va determina cel mai apropiat prim de o valoare
printr-un parametru, folosindu-de de apeluri la Prim.
Rezultatul Det va fi de tip ntreg.
subprogramul Scrie, care permite elementelor unui vector. Tabloul
de elemente ale acestuia sunt primite de subprogram prin
intermediul a doi parametri.
Exemplu: Pentru n=4 tabloul a=(5, 16, 33, 24) se va 5 17 31 23
2.1.3 Probleme propuse
{
int i,j;
for (i=n-l;i>=p;i--)
a [i +1] =a[ i] ;
a[p]=x; n++;
}
}
else i++;
void Rez(int a[lOO], int &n)
{
int x,y;
i=O;
while (i<n-l)
if (a[i]*a[i+l]<O) {
x=abs(a[i]) ;y=abs(a[i+l]);
Ins(a,n,L(x,y) ,i+l);
i += 2;
void Ins (int a[lOO],
int & n,int x,int p)
procedure Rez(var a:sir;
var n:byte);
var x,y:integer;
begin
i:=l;
while i<n do
if a[i]*a[i+l]<O then begin
x:=abs(a[i]);y:=abs(a[i+l]) ;
Ins(a,n,L(x,y) ,i+l);
inc (i, 2) ;
end
else inc(i)
end;
11 procedure Ins (var a:sir;
12 var n:byte; x,p:integer);
13 var i,j:byte;
14 begin
15 for i:=n downto p do
16 a[i+l] :=a[i];
17 a[p] :=x; inc(n)
18 end;
19
20
21
22
23
24
25
26
27
28
29
30
31
32
subprogramul Citeste, care citirea de la a valorii lui n
a elementelor vectorului a.
subprogramul Sortare, care la alegere elementele unui vector,
ntre doi indici prin intermediul a doi parametri ntregi. (vezi
problema 5, 2.1.2). Vectorul va fi transmis subprogramului printr-
un parametru.
subprogramul Scrie, care permite elementelor unui vector. Tabloul
de elemente ale acestuia sunt primite de subprogram prin
intermediul a doi parametri.
Exemplu: Pentru n=5 tabloul a=(153, 16,8,33, 124) se va
16 153 12433 8
3. Se un tablou unidimensional a ce ne n elemente numere
ntregi. se realizeze un program care un subtablou a lui a, format din k
elemente, subtablou care cele mai multe valori cuburi perfecte.
In cadrul programului, vor fi definite subprograme:
subprogramul Citeste, care citirea de la a valorilor
variabilelor n, k a elementelor vectorului a.
Cub, care valoare printr-un parametru ntreg
este cub perfect. Rezultatul va fi de tip logic n varianta Pascal de
tip ntreg (0/1) pentru C++.
Poz, care (indicele) de nceput a subtabloului de k
elemente care cele mai multe cuburi perfecte. va face apel la
subprogramul Cub. Vectorul, de elemente ale acestuia valoarea
lui k vor fi primite de subprogram prin intermediul parametrilor.
subprogramul Scrie, care permite unei de k elemente,
ncepnd cu o p, dintr-un vector transmis prin parametru. Valorile lui
k p vor fi primite desubprogram prin intermediul a doi parametri ntregi.
Exemplu: Pentru n=7, k=4 tabloul a=(1, 9, 4, 27,8, 1, 12) se va 4, 27,8, 1
4. Se numere naturale, n b( se un
tablou unidimensional ale elemente vor fi primele n numere naturale, care au
proprietatea n baza b se numai cu cifre de O 1.
n cadrul programului, vor fi definite subprograme:
care valoare printr-un parametru ntreg se
ntr-o b doar prin cifre de O 1. Baza bva fi tot prin
intermediul unui parametru ntreg. Rezultatul va fi de tip logic n
varianta de tip ntreg (0/1) pentru C++.
subprogramul Det, care un vector cu n elemente. Acestea
primele n valori naturale ce au proprietatea n baza b sunt scrise
numai cu cifre de O 1. Tabloul, valoarea lui n a lui b sunt transmise
subprogramului prin intermediul parametrilor.
119
subprogramul Scrie, care permite elementelor unui vector. Tabloul
de elemente ale acestuia sunt primite de subprogram prin
intermediul a doi parametri.
Exemplu: Pentru n=7 b=3 tabloul va valorile O, 1,3,4,9, 10, 12.
5. Se un tablou unidimensional a ce ne n (n:::;100) elemente numere
naturale, mai mici ca 2.000.000.000. se realizeze un program care pe
linii, n Nr.txt, elementele din vectorul a, grupate cifra
(prima n scrierea O linie va doar elemente cu
Scrierea n se va face n ordinea a primei cifre.
n cadrul programului, vor fi definite subprograme:
subprogramul Citeste, care citirea de la a valorii lui n
a elementelor vectorului a.
Cif, care cifra a unei valori primite printr-un
parametru ntreg .
subprogramul Scrie, care pe linii, n Nr.txt, elementele din a, "
regula n Se vor folosi apeluri la Cif Tabloul
de elemente ale acestuia sunt transmise subprogramului prin
intermediul parametrilor.
Exemplu: Pentru tabloul a=(334, 124, 71, 34, 122, 1, 39) Nr.txt va

124 122 1
334 34 39
71
6. Se tablouri unidimensionale a b ce n, respectiv m
elemente numere ntregi (m:::; n:::; 50). se realizeze un program care de
cte ori toate elementele lui b apar pe consecutive n tabloul a.
n cadrul programului, vor fi definite subprograme:
subprogramul Citeste, care citirea de la a de
elemente ale unui vector a elementelor acestuia. Transferul datelor citite
va fi realizat prin parametri.
Ok, care elementele unui vector b se n
vectorul a, pe consecutive, ncepnd de la un indice dat. va
avea 5 parametri: cele tablouri, de elemente ale
indicele ncepnd cu care se face verificarea. Rezultatul va fi de tip
logic n varianta Pascal de tip ntreg (0/1) pentru C++.
Nr, care de cerut n Cei doi vectori
de elemente ale sunt transmise subprogramului prin
intermediul parametrilor. Se vor folosi apeluri la Ok.
Exemplu: Pentru n=7, m=3 tablourile a=(33, 3, 71, 3, 71, 3, 39), b=(3, 71, 3),
Nr va returna valoarea 2.
120
!!!!!!!!!!!
7. Se un tablou unidimensional a cu nlOO) elemente ntregi. se
determine toate de elemente situate pe consecutive care au suma
cu S. Fiecare de elemente va fi pe cte o linie pe
standard.
n cadrul programului, vorfi definite subprograme:
subprogramul Citeste, care citirea de la a valorilor
variabilelor n, S ale elementelor vectorului a.
Sum, care suma elementelor unui vector, situate ntre
date. Tabloul cei doi indici vor fi subprogramului prin
intermediul parametrilor.
subprogramul Scrie, care permite tuturor de elemente
dintr-un tablou care din Vectorul de
elemente ale acestuia vor fi de subprogram prin intermediul
parametrilor.
Exemplu: Pentru n=7, S=9 vectorul (3, 2, 3, 4,5, 11, -7) se va
234
45
511-7
8. Se un tablou unidimensional a ce n (n::;lOO) elemente numere
naturale.imai mici ca 20.000. se realizeze un program care un
subtablou al cu proprietatea suma elementelor este cu n.
n cadrul programului, vor fi definite subprograme:
subprogramul Citeste, care citirea de la a valorii lui n
a elementelor vectorului a.
Rest, care restul la cu n a sumei primelor k
elemente ale unui vector. Tabloul, n k vor fi trimise subprogramului prin
intermediul parametrilor.
subprogramul Det, doi indici din vectorul a, care
subtabloul cu proprietatea n Se vor folosi apeluri la
Rest. Subprogramul va primi, prin intermediul a doi parametri, vectorul
de elemente ale acestuia va returna, prin intermediul altor doi
parametri ntregi, cei doi indici
subprogramul Scrie, care permite unei de elemente dintr-un
tablou, situate ntre date. Vectorul cei doi indici vor fi
de subprogram prin intermediul parametrilor.
Exemplu: Pentru n=7 tabloul a=(4, 5, 1,3,2, O, 9), se va 32 O9.
9. Se n doi vectori. se realizeze un program
care reuniunea, lor. Pentru fiecare dintre
se cere definirea unui subprogram. Acestea vor apela Ap care
o valoare unei Rezultatul va fi de tip logic n
varianta Pascal de tip ntreg (0/1) pentru C++. Transferul datelor ntre
subprograme va fi realizat prin intermediul parametrilor.
121
Exemplu: A=(2, 4, 1, 6, 7), B=(3, 4, 8, 9) se va
Reuniunea=(2,4, 1,6,7,3,8,9) ; Intersectia=(4) ; Diferenta=(2, 1,6,7)
10. un vector a ce o permutare a numerelor de la 1
la n Se cere determine toate circulare ale lui a care nu
puncte fixe.
Spunem o permutare (al, a2...a
n
) are puncte fixe cel un element
ai = i De exemplu, pentru n=4, permutarea (2,4,3,1) are puncte fixe,
deoarece a3=3.
n cadrul programului, vor fi definite subprogramele
subprogramul Citeste, care citirea de la a valorii lui n
a elementelor vectorului a.
Pfix, care un vector, ce o permutare, are
puncte fixe. Vectorul lungimea acestuia vor fi primite prin intermediul
parametrilor. Rezultatul va fi de tip logic n varianta Pascal de tip
ntreg (0/1) pentru C++.
subprogramul Perm, care va genera o permutare cu o spre '
stnga a unui vector primit printr-un parametru.
subprogramul Scrie, care permite circulare ale unui
'lector, ce nu puncte fixe. Acest subprogram va face apel la
Pfix Perm. Tabloul de elemente ale acestuia sunt primite de
subprogramul Scrie prin intermediul a doi parametri.
Exemplu: Pentru n=4 tabloul a=(5, 1,3,2,4) se va
24513
45132
11. Se un tablou bidimensional cu n linii se determine
elementele care sunt situate pe linii coloane de Un element a[i,j] va
fi suma pe linia i este cu suma pe coloanaj.
n cadrul programului, vor fi definite subprograme:
subprogramul Citeste, care citirea de la a valorii lui n
a elementelor tabloului a.
Suml; care suma elementelor dintr-o matrice, situate pe o
linie, al de ordine este transmis printr-un parametru ntreg.
Sume, care suma elementelor dintr-o matrice, situate pe o
al de ordine este transmis printr-un parametru ntreg.
subprogramul Scrie, care permite tuturor elementelor dintr-o matrice
ce din Tabloul de linii/coloane, sunt
primite de subprogram prin intermediul parametrilor.
Exemplu: Pentru n=4 tabloul
O 5 O O
3 1 2 4
-20.Q 2010
. O-2 O O se vor elementele 7 6.
122
12. Se un tablou bidimensional cu n linii (n:::;20). se
determine toate elementele ce puncte minim pe linie
maxim pe coloana pe care este situat).
n cadrul programului, vor fi definite subprogramele
subprogramul Citeste, care citirea de la a valorii lui n
a elementelor tabloului a.
MinL, care cea mai valoare n matricea a pe o
linie, al de ordine este transmis printr-un parametru ntreg.
MaxC, care valori ntregi, prin intermediul a doi
parametri x c. Ea x maximul pe coloana c a
matricii a. Rezultatul va fi de tip logic n varianta Pascal de tip
ntreg (011) pentru C++.
subprogramul Scrie, care permite tuturor punctelor dintr-o
matrice, Tabloul de linii/coloane, sunt primite de subprogram
prinintermediul parametrilor.
Exemplu: Pentru n=4 tabloul
98Q7
8354
99Q7
5143
se vor elementele 6 6.
13. Se un tablou bidimensional a cu n linii m coloane (l:::;n, m :::;50), cu
componente ntregi. se identifice numerele de ordine ale coloanelor care
cele mai multe elemente n afara intervalului [x,y].
n cadrul programului, vor fi definite subprogramele
subprogramul Citeste, care citirea de la a valorilor lui n
m ale elementelor tabloului a.
Nr, care trei valori ntregi prin intermediul parametrilor x, y
c. Ea cte elemente situate pe coloana c, n matricea a, se n
afara intervalului [x,y].
subprogramul Det, care indicii coloanelor cu proprietatea n
n cadrul acestuia se va face apel la Nr.
Exemplu: Pentru n= 4, m=5, x= 2, y=7 tabloul
28583
43675
88888
99999
se va 24 (coloana a doua a patra).
14. Se un tablou bidimensional a cu n linii m coloane (l:::;n, m :::;50) cu
componente ntregi. Folosind de coloane, se ordoneze
elementele pare situate pe ultima linie din tabloul a.
123
!!!!!!!!!!
se va
1423
1423
1246
n cadrul programului, se vor defini subprogramele
subprogramul Citeste, care citirea de la a valorilor lui n
m ale elementelor tabloului a.
subprogramul InterC, care valori ntregi prin intermediul
parametrilor x, y. Acesta elementele coloanei x cu cele situate pe
coloana y n matricea a.
subprogramul Sortare, care ordonarea a elementelor
pare situate pe ultima linie n matricea a folosind apeluri la InterC.
subprogramul Scrie, care pe ecran a elementelor tabloului
bidimensional a.
Exemplu: Pentru n=3, m=4 tabloul a:
1234
1234
1462
15. Se un tablou bidimensional a cu n linii m coloane (l::;;n, m ::;;50), cu
componente ntregi. se identifice numerele de ordine ale liniilor care
elemente ordonate n plus, dintre oricare elemente
este n cadrul liniei. n cadrul programului, se vor defini
subprogramele
subprogramul Citeste, care citirea de la a valorilor lui n,
lui m ale elementelor tabloului a.
Ok, care o valoare prin intermediul parametrului 1
elementele liniei de indice 1, din matricea a, regula
din Rezultatul va fi de tip logic n varianta Pascal de tip
ntreg (011) pentru C++.
subprogramul Scrie, care pe ecran a numerelor de ordine
determinate.
Exemplu: Pentru n= 4 tabloul a:
1 357
4321
2468
9998
se va 1 3 (prima linie a treia).
16. Se un tablou bidimensional a cu n linii n coloane (n ::;;50)
cu ntregi. se permute circular cu k spre dreapta, toate liniile
tabloului. In cadrul programului, se vor defini subprogramele
subprogramul Citeste, care citirea de la a valorilor lui n,
lui k ale elementelor tabloului a.
subprogramul Perm, care o valoare prin intermediul
parametrului 1 toate elementele liniei de indice 1, cu o spre
dreapta.
124
subprogramul Solve, care cu k spre dreapta, toate liniile unei
matrici prin apeluri la Perm.
subprogramul Scrie, care pe ecran a numerelor de ordine
ale liniilor lui a care au proprietatea prin
Tabloul bidimensional de linii ale acestuia sunt transmise
subprogramelor prin intermediul a doi parametri.
xemplu: Pentru n=4, k=2 tabloul a: se va
234 3412
1234 3412
1462 6214
2453 5324
7. Se un tablou bidimensional a cu n linii m coloane (1Sn, m cu
componente numere naturale se pentru fiecare linie,
<le zerouri h .care se produsul elementelor lor. n cadrul programului, se
yor defini subprogramele
subprogramul Citeste, care citirea de la a valorilor luin,
lui m ale elementelor tabloului a.
Exp, care exponentul la care apare un prim n
descompunerea unui natural. .Ambele valori sunt primite de
subprogram prin intermediul a doi parametri ntregi.
Nrz. care o valoare prin intermediul parametrului 1
de zerori n care se produsului elementelelor
situate pe linia 1, n matricea a. Se vor folosi apeluri la Exp.
subprogramul Scrie, care pe ecran, pentru fiecare linie, a
de zerouri n care se produsul elementelor lor. Se vor
folosi apeluri la Nrz:
Exemplu: Pentru n= 4, m=3 tabloul a
285
436
101010
25254
se va 1,0,3,2.
18. Se un tablou bidimensional a cu n linii m coloane (1Sn, m cu
componente cifre zecimale(0..9). fiecare linie cifrele unui
Se cere identificarea celei mai mici baze comune tuturor numerelor
reprezentate n matrice acestora n urma conversiei din baza
n baza 10.
n cadrul programului, se vor defini subprogramele
subprogramul Citeste, care citirea de la a valorilor lui n,
lui m ale elementelor tabloului a.
Baza, care cea mai tuturor numerelor
reprezentate n matricea a.
125
!!!!!!!!!!!
Conv, care valori naturale prin intermediul
parametrilor b 1. Ea valoarea din baza 10 n urma
conversiei reprezentat n baza b pe linia 1.
subprogramul Scrie, care pe ecran, pentru fiecare linie, a
returnat n urma apelului la Conv.
Exemplu: Pentru n= 3, m=3 tabloul a
215
436
1 01
se va 110, 223, 50 (baza 7).
19. Se un tablou bidimensional a cu n linii m coloane (1:0l, m ::;50), cu
componente cifre zecimale(0..9). De la este introdus un de m-l
caractere + -, avnd operatorilor aritmetici Ele vor fi
"plasate" n ordine ntre valorile de pe fiecare linie. Se cere se determine care
este valoarea care se n urma expresilor n cadrul
linii.
n cadrul programului, se vor defini subprogramele
subprogramul Citeste, care citirea de la a valorilor lui n,
lui m ale elementelor tabloului a.
Eval, care o valoare printr-un parametru 1 un
de caractere printr-un parametru s. Aceasta expresia prin
plasarea n ordine a operatorilor + - din care este format s, ntre
elementele situate pe linia 1a matricei a.
Max, care valoarea care se n urma
expresiilor n cadrul linii, prin apeluri la
Eval.
Exemplu: Pentru n= 3, m=4, s=" ++-" tabloul a
2152
4363
1 O1 2 se va 10 (4+3+6-3)
20. Se un natural n (n<=100). se creeze o matrice ale
elemente sunt numerele de la 1 la n
2
Valorile sunt plasate n matrice, consecutiv n
cadrul unei linii, dar alternnd monotonia, cum reiese din tabloul
1 2 3 4
8 7 6 5
9 101112
16151413
n cadrul programului, vor fi definite subprogramele
subprogramul linieC, care valori naturale prin intermediul
parametrilor x 1. Acesta valori consecutive pe linia 1
ncepnd cu valoarea x.
126
subprogramul linieD, care valori naturale prin intermediul
parametrilor x 1. Acesta valori consecutive pe linia
l ncepnd cu valoarea x.
subprogramul Salve, care o matrice de ordin n, ale
elemente regula din Acesta va face apel la
subprogramele linieC linieD. Matricea n de linii este transmis
subprogramului Salve prin intermediul a doi parametri.
subprogramul Scrie, care pe ecran elementelor unui
tablou bidimensional transmis printr-un parametru. de linii
al este transmis prin al doilea parametru.
21. Se un de cel mult 100 de caractere, format din litere mici ale
alfabetului englez. Se numeste o de caractere care apare n de cel
ori una alta. De exemplu "abddcabddabcabc" blbele
"d" "abc".
a) se realizeze MaxB, care cea mai dintr-un
de caractere primit printr-un parametru.
b) se realizeze Cod, care un de caractere primit ca parametru.
Regula de codificare este fiecare caracter este nlocuit cu ultima a
2\ unde x este codul ASCII asociat literei respective. Rezultatul returnat
de este un de caractere.
Exemplu: Pentru "abbcabab", MaxB va returna "ab", iar
Cod va returna de caractere "24482424"
22. un vector a, care n elemente numere reale Se
construirea unui vector b cu n elemente numere ntregi, creat pe baza
elementelor lui a elementul a[i] are partea
un par, atunci b[i] va reprezenta cel mai apropiat ntreg de a[i] divizibil cu
10; n caz contrar, b[i] va fi egal cu cel mai apropiat ntreg de a[i] divizibil cu 100.
n cadrul programului, vor fi definite subprograme:
subprogramul Citeste, care citirea de la a valorii lui n
a elementelor reale ale vectorului a.
Divl O, care o valoare printr-un parametru, la
cel mai apropiat ntreg divizibil cu 10.
DiviOO, care o valoare printr-un parametru,
la cel mai apropiat ntreg divizibil cu 100.
subprogramul Salve, care primind prin parametrul a un vector cu elemente
reale, printr-un alt paremetru b, un vector ale elemente
ntregi regula din Se vor folosi apeluri la DiviO
DiviOO.
subprogramul Scrie care permite elementelor ntregi ale unui vector.
Tabloul de elemente ale acestuia sunt primite de subprogram prin
intermediul a doi parametri.
Exemplu: Pentru n=3 a=(1327.3, 234.67, 487.34), se va 1300,230,500.
127
!!!!!!!!!!!
23. Se un tablou bidimensional a cu n linii (n:S:50), cu
componente numere ntregi. se identifice o n matrice, cu latura
strict mai dect n, care cele mai multe valori egale cu ntreg
k. mai multe astfel de zone se va cea de arie Programul
va definite subprograme:
subprogramul Citeste, care citirea de la a valorilor lui n,
lui k ale elementelor tabloului d.
SubT, care trei valori ntregi prin parametrii x, y, l. Aceasta
de valori egale cu k din zona care are stnga-sus n
coordonatele x, y este din llinii 1coloane.
subprogramul Salve, care zona din matricea a care
cele mai multe valori egale cu k. Rezultatul este returnat prin trei
parametri xl, yl, lm reprezentnd coordonatele stnga-sus (xl, yl)
de linii coloane ale zonei determinate.
Exemplu: Pentru n= 5, k=3 tabloul a
21563
43333
10123
24567
23336
se va 224 stnga sus de coordonate 2, 2 avnd 4 linii 4 coloane).
24. Numim matrice o matrice ale elemente sunt n majoritate egale cu O.
O astfel de matrice poate fi ntr-un vector de n care fiecare
element nenul este memorat cu de ordine al n urma
matricei. Pornind de la un astfel de vector, cunoscnd de linii
de coloane (n, m:S:50) ale matricei rare pe care o se genereze n
memorie tabloul bidimensional acestuia.
Programul va definite subprogramele:
subprogramul Citeste, care citirea de la a valorilor lui n,
lui m ale tuturor celor nr ale vectorului a.
L, care primind trei valori ntregi prin parametrii x, y t,
linia pe care este situat elementul cu de ordine t, la
liniarizarea unei matrice cu x linii y coloane.
C, care primind trei valori ntregi prin parametrii x, y t,
coloana pe care este situat elementul cu de ordine t, la
Iiniarizarea unei matrice cu x linii y coloane.
subprogramul Salve, care n memorie tabloul bidimensional
matricei rare codificate ntr-un vector de
este primit ca parametru, cu de elemente al Matricea
este printr-un alt parametru.
128
1.
2.2.1 Teste cu alegere
!!FI Subprograme implementate n
129
!!!!!!!!!!
float F(float x, int n)
{
if (n<=2) return 2.0;
else return 2*x + F(x-l,n-l);
end;
function F(x:real;n:byte) :real;
begin
if n<=2 then F:=2.0
else F:=2*x + F(x-l,n-l);
Exemplu: Pentru n=3, m=4, nr=4 vectorul de ((2,3) (7,5) (5,6) (4,9)
(S,ll)) se va construi matricea:
0020
7500
40S0
25. Toate cele n (n:S;SO) camere ale unui hotel au Pentru
mochetarea acestora, patronul la o care i trimite o de
l de o reducere de x% din valoarea a produselor
Patronul dispune de s de lei se un sortiment de
care y lei pe m'.
un program care maxim de camere care pot fi
mochetatecornplet, cu suma de bani de care dispune patronul efectiv pe
care acesta, l va n cadrul programului, vor fi definite subprogramele
.
subprogramul Citeste, care preia, de la valorile n, x, y, s n
perechi de numere naturale, reprezentnd lungimile laturi lor camere.
Subprogramul va returna, prin parametrul a, un vector ale elemente
ariilor camerelor.
subprogramul Ordon, care ordonarea a elementelor
unui vector primit printr-un parametru.
subprogramul Calcul, care ariilor prin parametrul a trei
valori ntregi prin parametrii s, x y. Subprogramul prin
parametrul nr, maxim de camere care pot fi mochetate complet cu
suma de bani s. Valoarea de avnd o reducere de x% va fi
prin parametrul ntreg p.
Exemplu:
Pentru n=4, x=3, y=15, s=1000 dimensiunile camerelor (5, S), (3, 6), (3, 7;,(4, 5)
se va 3 camere; final=S5S.
2. Se program iterativ:
Ce valori vor fi executarea de
write{F{3.0,2):O:O,' ');
write{F{2.0,4):0:O,' ');
write{F{2.0,5):0:0,' ');
a) 6 2 2
b) 2 8 8
c) 2 5 5
d) 1 7 7
procedure invers;
var i,j,t:integer;
a:array[l .. 100]of byte;
begin
j: =0;
read{i) ;
while (trunc{i)<=l) do begin
inc{j); a[j] :=i; read{i);
end;
for t:=j downto 1 do write{a[t])
end;
coutF{3.0,2)" ";
coutF {2. 0,4)" ";
coutF(2 . r 5) n ";
void invers ( )
{int i,j,t,a[100];
j=O;
cini;
while (floor{i)<=l)
j++;
a [j] =i;
cini;
}
for{t=j;t>=l;t--)couta[t];
}
Care dintre subprogramele recursive constituie o
a)
procedure invers;
var j:byte;
begin
read(j) ;
if (j in [O.. 1]) then begin
invers; write{j);
end;
end;
b)
procedure invers(j:integer);
begin
read{j) ;
if (j in [O.. 1]) then begin
write{j); invers{j);
end;
end;
c)
procedure invers (i:integer) ;
var a:array[l .. 100]of byte;
begin
read (a [ i] ) ;
if (ari] in [O.. 1]) then
invers (i+1) ;
write(a[i]);
end;
130
a)
void invers ( )
{int j;
cinj;
if (floor(j)<=l){
invers{); coutj;
}
}
b)
void invers {int j)
cinj;
if (floor(j)<=l) {
coutj; invers(j);
}
}
c)
void invers {int i)
{
int a[100];
cina[i] ;
if (floor{a[i])<=l)
invers (i+1) ;
couta[i] ;
}
3. La fiecare apel recursiv al unui subprogram, n memoria STAeK sunt salvate:
a) adresa de revenire, valorile variabilelor locale a parametrilor prin

b) adresa de revenire valorile variabilelor globale;
c) adresa de revenire, valorile variabilelor locale a parametrilor prin
valoare adresele parametrilor prin
d) adresa de revenire valorile variabilelor locale globale.
4. Se programul
var x,y:integer;
function f(a,b:word) :word;
begin
if a<>b tll.en
if a>b then f:=f(a-b,b)
else f:=f(a,b-a)
else f:= x*y diva;
end;
begin
readln (x, y) ;
write(f(x,y)) ;
end.
#include <iostream.h>
int x , y;
long F(int a, int b)
{
it (a!=b)
if (a>b) return F(a-b,b);
else return F(a,b-a);
else return x*y/a;
}
void main()
{
cinxy ;
coutF (x, y) ;
}
Ce valoare va fi pentru setul de date de intrare x=32, y=14?
a) 2 b)256 c) 200 d) 224 e) 14
5. Pentru subprogramul recursiv variabilele ale valori vor
fi n
procedure E(a:byte;var n:byte;
var s: char) ;
var i,j:integer;
begin
if n<lOO then E(a,n,s);
end;
a) a, n, i, j
b) n , s, i, j
c) a, il j
d) al ni s, i, j
void E(int a,int &n, char &s)
{
int i,j;
if (n<lOO) E(a,n/s);
131
6. Care dintre subprograme permit, ca la executarea lor, se
cinci valori, parametrul efectiv(la apel) are valoarea l?
a)
procedure A{i:integer);
begin.
write{i,' '); A{5*i)
end;
b)
function B{i:integer) :integer;
begin
if i<=lO then begin
write{i,' '); B:=B{2*i+l)
end else B:=O
end;
e)
function C{i:integer) :integer;
begin
if i<=5 then begin
write{i,' ') ;C:=C{i+l); end
end;
d)
procedure D{i:integer);
begin
if i>=-4 then D{i-l);
write{i,' ');
end;
7. program:
var x:byte;
function Joe{ x,y:byte) :byte;
begin
write{x,' ');
if (x<=3) then begin
write{y,' ');
ine{y) ;
Joe:=Joe{x+l,y)+l;
end
else Joe:=O;
end;
begin
x:=l;
write{Joe{2,x)) ;
end.
a)
void A{int i) {
eouti" ";
A{5*i) ;
}
b)
int B{int i) {
if (i<=lO) {
eouti" "; return B{2*i+l);
} else return O;
}
e)
int C{int i)
if (i<=5) {
couti" "i
return C(i+l) ;
}
}
d)
void D{int i) {
if (i>=-4) D{i-l);
eouti" ";
#inelude <iostream.h>
int X;
int Joe{int x, int y)
{
eoutx" ";
if (x<=3) {
eouty" "; y++;
return Joe{x+l,y)+l;
}
else return O;
void main{)
{x=l;
eoutJoe (2, x) ;
}
Ce valori vor fi executarea acestuia?
a) 2 1 3 2 4 2; b) 2 1 3 1 4 2; C) 2 1 3 2 4; d) 1 1 1 2 1 2.
132
!!!!!!!!!!!
Ce valori se vor executarea acestuia?
a) 4 3 6 6 4 6;
b) 4 2 7 2 4 2 ;
c) 4 3 6 6 4 ;
d) 4 2 7 2 4 3.
#include <iostream.h>
int x;
, .
,
y=x; x--;
Joc(x) ;
couty' ';
coutx'
x--;
cout c-cx-c-c " II j
return Joc(x, y+2)-1;}
else {
coutx" ";
return 5;}
void Joc (int &x)
{ int y;
if (x>=8) {
#include <iostream.h>
int x;
int Joc(int &x, int y) {
y++;
couty" ";
if (y<=5) {
void main() {
x=3; cout Joc(x, x);
cout II Il Xi
program:
r x:byte;
ction Joc (var x:byte;
y:byte) :byte;
begin
x:=3;
writeln(Joc(x, x),' ',x);
end.
egin
inc(y) ;
write(y,' ');
if (y<=5) then begin
dec (x);
write(x, , ');
Joc:=Joc(x, y+2)-1 end
else begin
write(x, , ');
Joc:=5 end
end;
var x:byte;
9. program:
procedure Joc (var x:byte);
var y:byte;
begin
if x>=8 then begin
y : =X; dec (x) ;
Joc(x) ;
write(y,' ')
end;
write(x, , ')
end;
begin
x: =10; Joc (x) ;
end.
void main ()
x=10; Joc (x) ;
Ce valori se vor executarea acestuia?
a) 8 9 10; b) 7 8 7 9 8 10 9; c) 7 8 7 8 7 8 7; d) 7 8 7 9 7 10 7
133
a) 10 9 8 3 3; b) 10 9 8 3 2; c) 10 9 8 7 4 4 4; d) 10 9 8 7 4 3 2.
11. Se
Pentru ce valoare a parametrului x, F va returna valoarea 4?
d) 31.
d) 1233.
x--; y++;
Joc (x,y);
couty" ";
}
coutx" ";
if (x>=8) {
c) 4;
int P(int n)
{
if (n<50)
if (n%3==0)
return P(2*n - 3);
else return P(2*n - 1);
else return n;
c) 4;
int F(int x)
{
if (x==O) return O;
else
if (x%3==0)
return F(x/10) + 1;
else F(x/10);
void main()
x=10; y=l;
Joc (x, y);
#include <iostream.h>
int x,y;
void Joc (int &x, int &y)
{
b) 61;
b) 21369;
a) 16;
134
!!!!!!!!!!!!
function P(n:integer) :integer;
begin
if n<50 then
if n mod 3=0 then
P:=P(2*n - 3)
else P:=P(2*n - 1)
else P:=n;
end;
a)13369;
12. Se
function F(x:integer) :byte;
begin
if x=O then F:=O
else
if x mod 3=0 then
F:=F(x div 10)+1
else F:=F(x div 10)
end;
Ce valori se vor executarea acestuia?
Pentru care dintre valorile parametrului n, P va returna valoarea 61?
procedure Joc (var x,y:byte);
begin
write(x, , ');
if x>=8 then begin
dec (x); inc (y) ;
Joc (x,y);
write(y,' ')
end;
end;
begin
x:=10; y:=l;
Joc (x,y);
end.
var x,y:byte;
10. program:
n>1, n urma apelului F(n, n div 2) n Pascal, respectiv F(n, n12) n C++,
valoarea 1 numai
a) valoarea lui n un care nu se divide cu [n/2] (partea
b) valoarea lui n un prim;
c) valoarea lui n nu un prim;
d) valoarea lui n un par;
14. Se
135
!!!!!!!!!
d) 8.
d) F(5040,2)
}
elBe {
coutendl;
S(i+1,1);
}
c) 10 i
c) F(24,2)
void S(int i,int j)
{
if (i<=4)
if (j<=i)
cout'8' ;
S(i,j+1);
int F(int n,int x)
{
if (n<2) return 1;
elBe
if (n%x==O)
return F(n/x, x+1);
elBe return O;
int F(int n,int x)
{
if(x<2) return 1;
elBe
if(n%x==O) return O;
elBe return F(n,x-1);
b) 16 i
b) F(36,2)
Cte caractere vor fi n urma apelului 5(1,1)?
end
elBe begin
writeln;
S(i+1,1);
end;
end;
a) F(25,2)
procedure S(i,j:byte);
begin
if i<=4 then
if j<=i then begin
write (' 8' ) ;
S (i, j+1)
15. subprogram recursiv:
Pentru care dintre apeluri, F va returna valoarea 1:
function F (njx : integer) :byte;
begin
if n<2 then F:=l
elBe
if n mod x=O then
F:=F(n div x, x+1)
elBe F:=O;
end;
function F(n,x:integer) :byte;
begin
if x<2 then F:=l
elBe
if n mod x=O then F:=O
elBe F:=F(n,x-1)
end;
13. Se subprogram recursiv:
16. subprogram recursiv:
17. Care dintre subprograme recursive n mod corect, suma
cifrelor unei valori naturale primite prin parametrul x?
Cte caractere vor fi n urma apelului 5(1,1)?
d) 7.
}
else {
eoutendl;
S(i+1,i+2);
}
e)
int A(int x)
{
if (x!=O)
return x % 10 + A(x / 10);
else return O;
b)
int A(int x)
{
if (x<9)
return x % 10 + A(x / 10);
a)
int A(int x)
{
return A(x / 10)+ x % 10;
c) 8;
void S(int i,int j)
{
if (i<=4)
if (j<=4)
eout'6' ;
S(i,j+1);
b) 6;
e)
function A(x:integer) :integer;
begin
if x<>O then
A:=x mod 10 + A(x div 10)
else A: =0;
end;
b)
function A(x:integer) :integer;
begin
if x>9 then
A:=x mod 10 + A(x div 10)
end;
a)
function A(x:integer) :integer;
begin
A:=A(x div 10)+ x mod 10;
end;
a) 4;
procedure S(i,j:byte);
begin
if i<=4 then
if j<=4 then begin
write('6') ;
S(i,j+1)
end
else begin
writeln;
S(i+1,i+2) ;
end;
end;
d)
function A(x:integer) :integer;
begin
if x<9 then
A:=x mod 10 + A(x div 10)
else A:=x;
end;
d)
int A(int x)
{
if (x<9)
return x % 10 + A(x / 10);
else return x;
136
!!!!!!!!!
Cu ce valoare trebuie nlocuite punctele de suspensie, pentru ca subprogramul
returneze cifra a primit prin parametrul x ?
20. Se incomplet:
19. Se subprogram recursiv, definit incomplet:
137
!!!!!!!!!!!!!!
d) 9
}
int F(long- x, int d)
{
if ... return d;
else return F(x,d-1);
c) -1
int Min(int x)
{
if (x==O) return ... ,
else
if (Min(x / 10)<x % 10)
return Min(x / 10);
else
return x % 10;
}
}
void main() {
x=O;
coutA(12031,x) ;
}
#include <iostream.h>
int x;
int A(int x, int &y)
{
if (x==O) return y;
else {
y=y*10 + x%10;
return A(x / 10, y);
b) 1 a) O
function F(x,d:longint) :integer;
beg-in
if ... then F:=d
else F:=F(x,d-1)
end;
function Min(x:integer) :byte;
beg-in
if x=O then Min:= ...
else
if Min(x div 10)<x mod 10
then
Min:=Min(x div 10)
else
Min: =x mod 10;
end;
Care dintre sunt
a) Programul o eroare de
b) Programul valoarea Odeoarece 12031 nu este palindrom.
c) Programul valoarea 13021.
d) Subprogramul A oglinditul primit prin parametrul x.
\
beg-in
x:=O;
writeln (A(12031,x));
end.
beg-in
if x=O then A:=y
else beg-in
y:=y * 10 + x mod 10;
A:=A(x div 10, y)
end
end;
var x:integer;
function A(x:integer;
var y:integer) :integer;
18. program:
21. Se subprogram recursiv, definit incomplet:
Cu ce expresie trebuie nlocuite punctele de suspensie astfel nct, n urma apelului
S(5), se 9 de caractere' * '?
Cu ce expresie trebuie nlocuite punctele de suspensie astfel nct, n urma apelului
F(x, 99), returneze cel mai mare divizor de cel mult cifre al
natural transmis prin parametrul x?
d) nici una din
variantele anterioare
eout' *' ;
8 (x-1);
eout'*';
if ...
}
}
c) (x>2)
a) (x % d< 100)
b) (x%d==l)
e) (x%d==O)
d) (x /10 ==0 && d<100)
void 8 (int x)
{
b) (x>O) a) (.x>l)
end;
end;
procedure 8(x:integer);
begin
write ( '*' ) ;
if ... then begin
write('*');
8 (x-1)
a) x mod d < 100
b) x mod d = 1
e) x mod d = O
d) (x div d = 0)and(d<100)
22.
function 8(n: integer) :longint;
begin
if n=O then 8:=0
else
if n mod 2=0 then
8:=8(n div 10)- 2*n
else
8:=8(n div 10) + 3*n;
int 8(int n)
{
if (n)
if (n%2)
return 8(n/10)+3*n;
else
return 8(n/10)-2*n;
else return O;
end;
Care dintre expresii au valoarea 830?
a) S(255) b) S(253) c) S(255) - 6 d) S(41O)
23. subprogram recursiv:
procedure 8(i,j:byte);
begin
if i>O then
if j>o then begin
write('*');
8(i,j-1)
end
void 8(int i,int j)
{
if (i>O)
if (j>O)
eout'*' ;
8(i,j-1);
138
Ce se pe ecran n urma apelului 5(305, 4)?
Ce apel trebuie utilizat pentru ca pe ecran se
****
**
*
Ce se va n urma acestuia:
139
d) 29 29
d) 1220
d) 5(4,3)
else {
coutendl;
S{i-1,i-1};
}
c) 15 15
}
}
void main{}{
x=15;
S(x,23)j coutx" "i
S{x,23}; coutx;}
c) 131
#include <iostream.h>
int x;
void S(int &x, int b)
{
if (b>0){
x=x + b % 10 + b / 10;
S {x, b / 10};
c) 5(3, 3)
}
}
void S{int x,int b)
{
if {x<b} coutx;
else {
S{x/b,b};
coutx % b;
b) 22 29
b) 103001
b) 5(3, 4)
a)22 22
25. program:
begin
x:=15;
S{x,23}; write{x, , '};
S{x,23}; write{x};
end.
a)10301
var x:byte;
procedure S{var x:byte;b:byte};
begin
if b>O then begin
x:=x + b mod 10 + b div 10;
S{x, b div 10};
end
end;
24. Se subprogram:
procedure\S {x,b: integer} ;
begin
if x<b then write{x}
else begin
S{x div b,b};
write {x mo.d b) ;
end;
end;
a) 5(3, 2)
else begin
writeln;
S{i-1,i-1} ;
end;
end;
1. un de n valori naturale (n::;50), n tabloul unidimensional
a. un subprogram care permite acestora n ordinea a,,, an-J, ..ai.
variante recursive ale acestui subprogram. modul n
care poate fi apelat subprogramul din programul principal(n Pascal), respectiv din
cadrul mainiit: C++). Vectorul de elemente ale acestuia le
definite ca variabile globale.
Exemplu: Pentru n= 5 2, 4, 5, 7, 8 subprogramul va pe standard
valorile 8, 7, 5, 4, 2.
Solutie:
Prima a subprogramului recursiv For al
contor valoarea la fiecare Practic, este vorba de
pacurgerea n ordine a elementelor vectorului.
A doua a subprogramului, proprietatea de revenire
n subprograme pentru executarea abandonate, n ordinea a
autoapelurilor (se mecanismul stivei Last in-Firs out).
Ambele subprograme au un singur parametru ntreg, reprezentnd indicele
elementului curent din vector.
Subprogramul va fi implementat n Pascal ca iar n C++ ca de
tip void.
140
!!!!!!!!!!!!
Ce se va n urma acestuia:
d) 18 36
2.2.2 Probleme rezolvate
c) O O
}
else return o;
void main(){
x=O;
coutF (x, 123)' ';
coutF (x , 123) ;
}
#include <iostream.h>
int x;
int F(int &x,int b){
ii (bl=O) {
x=x + b % 10;
return F(x, b / 10)+ x;
b) 18 18 a) 14 14
begin
x:=O;
write(F(x,123),' ');
write(F(x,123)) ;
end.
26. program:
var x:byte;
function F (var x: byte; b: byte) : byte;
begin
if b<>O then begin
x:=x + b mod 10;
F:=F(x, b div 10)+ x;
end
else F:=O;
end;
1 VARIANTA 1 VARIANTA 1
2 procedure Afis (i :byte) ; void Afis (int i)
3
begin {
4 if i>O then begin if (i>=O) {
5 write(a[i]} ; couta[i];
6 Afis(i-i} Afis(i-i} ;
7 end }
8 end; }
9
10 begin void main(}{
11 ... Afis (n}; ... Afis (n-i) ;
12 end.
13 VARIANTA 2 VARIANTA 2
14 procedure Afis (i: byte) ; void Afis (int i)
15 begin {
16 if i<=n then begin if (i<n) {
17 {\fis(i+i} ; Afis (i+i)
18 wfite(a[i]} couta[il;
19 end }
20 end; }
21
22 begin void main(} {
23 ... Afis'(l} ; Afis (O}; ...
24 end.
2. un subprogram recursiv care memorarea, ntr-un vector, a
primelor n (n::;SO) numere pare n ordine Subprogramul va fi
implementat n n este o
global. modul n care poate fi apelat subprogramul din programul
principal(n Pascal), respectiv din cadrul main(n C++).
Exemplu: Pentru n=S subprogramul va construi un vector ale elemente vor fi
8,6,4,2, O.
Solutie:
Subprogramul va avea doi parametri: un parametru reprezentnd vectorul
ale elemente vor fi memorate n cadrul subprogramului un parametru
valoare ntreg ce va reprezenta indicele elementului curent. Subprogramul va fi
implementat n Pascal ca iar n C++ ca de tip void.
1 procedure e(i:byte;var a :sir};
2 begin
3 if i<=n then begin
4 ari] :=2* (n-i);
5 e(i+i,a}
6 end
7 end;
8
9 begin
10 '" e(i,a};
11 end.
void e(int i, int ar]}
{
if (i<n) {
ari] =2* (n-i-i);
e(i+i,a} ;
}
}
void main(} {
e(O,a}; ...
141
!!!!!!!!!

In cazul primei variante de implementare, va returna un rezultat ntreg
reprezentnd elementul minim determinat. Parametrul ntreg i
elementului curent din vector.
n cazul celei de a doua variante de implementare, rezultatul va fi transmis prin
intermediul parametrului x. Valoarea acestuia se va actualiza la revenirea
din recursivitate.
3. un de n valori naturale n tabloul unidimensional
a. variante recursive ale unui subprogram .care
elementul minim al tabloului. definite global att variabila n, .ct
vectorul a. n varianta Pascal, subprogramul va fi implementat ntr-o ca
iar n cea de a doua ca n varianta C++, una din va fi de
tip int, iar cea de a doua de tip void. modul n care poate fi apelat
subprogramul, din programul principal(n Pascal), respectiv din cadrul
main(n C++), pentru a fi elementul minim determinat.
Exemplu: Pentru n= 5 12,4,5, 7,8, subprogramul va determina minimul4.
end
end;
}
}
void main{) {
M{O,x) ;coutx; ...
VARIANTA 2
void M(int i,int &x)
{
if (i==n-i) x=a[n-i]
else{
M{i+i, x) ;
if (a[i]<x) x=a[i];
void main() {
... coutM{O);
}
VARIANTA 1
int M(int i)
{
if (i==n-i) return a[n-i];
else
i f { a [ i ] <M( i +1) )
return a[i];
else return M(i+i) ;
begin
., .M{i,x); writeln(x,' '); ...
end.
VARIANTA 2
procedure M{i:byte;var x:word);
begin
if i=n then x:=a[n]
else begin
M{i+i,x) ;
if a[i]<x then x:=a[i];
VARIANTA 1
function M(i:byte) :word;
begin
if i=n then M :=a[n]
else
if a[i]<M(i+i) then
M :=a[i]
else M :=M{i+i)
end;
1
2
3
4
5
6
7
8
9
10
11 begin
12 ... write{M{l;
13 end.
14
15
16
17
18
19
20
21
22
23
24
25
26
4. Se tablouri unidimensionale: a de lungime n b de lungime m,
ale elemente naturale sunt ordonate se realizeze subprogramul
recursiv Inter care de interclasare a elementelor celor
tablouri n vectorul c. Subprogramul va avea trei parametri valoare i, j, k. Primii doi
142
!!!!!!!!!!!!!
n ordine, elementelor din a repectiv din b, care se la
pasul curent. Parametrul k pe care este plasat elementul minim n
vectorul c. cele trei tablouri lungimile lor sunt declarate gobal.
Exemplu: Pentru n=5, m=3 tablourile a= (1, 4, 5, 7, 8), b= (2,17,18),
subprogramul Inter elementele n vectorul c n ordinea (1,2,4,5,7,8,17,18).
Solutie:
Algoritmul de interc1asare parcurge elementele celor doi vectori realiznd
compararea a elementelor curente. Compararea ncepe cu elementele
situate pe prima cel mai mic fiind plasat ntr-un nou vector (C). Se
cu o n vectorul din care s-a copiat elementul plasat n C,
Subprogramul va avea trei parametri valoare i, j, k, reprezentnd,n ordine,
elementelor din a b care se la pasul curent respectiv, pe care
este plasat elementul minim n vectorul c. de oprire a este
(i>n)and(j>{n) - Pascal, respectiv (bn && j>m) n C++. Subprogramul va fi
implementat-n Pascal ca iar n C++ ca de tip void.
void Inter(int i,int j,int k)
{
if (i<n && j<m)
if (a [ i ] <b [ j ] )
c[k]=a[i] ;
Inter(i+l,j,k+l) ;}
else {
c[k]=b[j];
Inter(i,j+l,k+l) ;
else
if (i<n) {
c[k]=a[i] ;
Inter(i+l,j,k+l) ;}
else
if (j<m) {
c[k]=b[j] ;
Inter(i,j+l,k+l) ;}
procedure Inter(i,j,k:byte);
begin
if (i<=n)and(j<=m) then
if a[i]<b[j] then begin
c[k]:=a[i];
Inter(i+l,j,k+l) ;end
else begin
c[k] :=b[j];
Inter(i,j+l,k+l) ;
end
else
if i<=n then begin
c[k] :=a[i];
Inter(i+l,j,k+l); end
else
if j<=m then begin
c[k]:=b[j];
Inter(i,j+l,k+l); end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 end;
5. un de n valori naturale (n::;;SO), n tabloul unidimensional
a. se realizeze subprogramul recursiv Det care un vector b cu
elementele distincte din a. Ok va fi din subprogramul Det
pentru a verifica o valoare ca parametru se n vectorul b.
n Pascal valoarea True sau False, respectiv o valoare
sau On C++. Vectorii variabila n sunt considerate globale.
Subprogramul Det va avea doi parametri ntregi i k reprezentnd, n ordine,
elementului curent din vectorul a respectiv lungimea vectorului b.
Ok va avea trei parametri ntregi: x, reprezentnd valoarea n
vectorul b, i, reprezentnd indicele curent din vectorul b k, reprezentnd
lungimea acestuia. complete ale subprograme.
143
Exemplu: Pentru n=5 vectorul a=(1, 8, 1, 7, 8) subprogramul Det va permite
memorarea n vectorul b a valorilor 1, 8, 7.
Solutie:
Ok parcurge elementele vectorului b, oprirea fiind n
n care valoarea lui x este cu elementul curent din b, sau n cazul n
care nici un element nu a fost egal cu x, deci ik.
Subprogramul Det prin parametrul k, de valori
distincte din vectorul a. Parametrul valoare i elemetul curent din
vectorul a. Subprogramul va fi implementat n Pascal ca iar n C++ ca
de tip void.
function Ok(x,i,k:byte):
boolean;
}
}
if (! Ok (a [i] , O, k ) ) {
k++;
b[k-1]=a[i] ;
}
Det(i+1,k) ;
void Det(int i,int &k)
{
if (i<n)
{
int Ok(int x,int i,int k)
{
if (i>=k) return O;
else
if (x==b[i]) return 1;
else return Ok(x,i+1,k);
beg-in
if (i<=n) then beg-in
if not Ok(a[i],1,k)then
beg-in
inc(k) ;
b[k] :=a[i];
end;
Det(i+1,k) ;
end;
end;
beg-in
if i>k then Ok:=false
else
if x=b[i] then Ok:=true
else Ok:=Ok(x,i+1,k);
end;
1
2
3
4
5
6
7
8
9
10 procedure Det (i : byte;
11 var k:byte);
12
13
14
15
16
17
18
19
20
21
6. un de n valori naturale (ns50), n tabloul unidimensional
a. subprogramul recursiv Nr care de elemente prime
din vector. Rezultatul va fi returnat prin intermediul unui parametru ntreg.
Subprogramul va apela Ok, care o valoare ca
parametru un prim. n Pascal, valoarea True
sau False, respectiv o valoare sau On C++. Vectorul a lungimea n a
acestuia sunt considerate variabile globale.
complete ale celor subprograme.
Exemplu: Pentru n=5 vectorul a=(11, 8, 13,7, 8) subprogramul Nr va returna
valoarea 3.
Solutie:
Ok va avea doi parametri ntregi x i: Parametrul x valoarea
care se este un prim, iar i un posibil divizor al lui.
Aceasta din valoarea cu o unitate la fiecare autoape1.
144
este prim valoarea lui i ajunge n urma autoapelurilor mai mare dect [x/2]. Se
poate limita valoarea a lui i la [""xl
Subprogramul Nr prin parametrul k, de numere
prime din vectorul a. Parametrul valoare i elemetul curent din
vector. Subprogramul Nr va fi implementat n Pascal ca iar n C++ ca
de tip void.
function Ok(x,i:integer):
boolean;
begin
if (i<=n) then begin
if Ok(a[i) ,2) then inc(k);
Nr (i+l: k) ;
end;
end;
begin
if i>x div 2 then Ok:=true
else
if x mod i=O then Ok:=false
else Ok:=Ok(x,i+1);
end;
1
2
3
4
5
6
7
8
9
10 Nr(i:integer;
11 var k:byte);
12
13
14
15
16
17
int Ok(int x, int i)
{
if (i>x/2) return 1;
else
if (x%i==O) return o;
else return Ok(x,i+1);
void Nr(int i,int &k)
{
if (i<n)
{
if (Ok(a[i),2)) k++;
Nr(i+1, k l :
}
}
7. un de n valori naturale n tabloul unidimensional
a. subprogramul recursiv Cm, care cifra ce apare n
scrierea n baza IOa tuturor elementelor vectorului a de ale
acesteia. Ambele rezultate vor fi returnate prin intermediul a doi parametri. n
cadrul subprogramului se va face apel la alte subprograme recursive:
Mx, care cifra a unei valori transmise ca
parametru;
Nr, care valori ntregi prin parametri x c. Aceasta
de al cifrei c n x.
complete ale celor trei subprograme. Vectorul a lungimea n a
acestuia sunt considerate variabile globale.
Exemplu: Pentru n=5 vectorul a=(121, 38, 183, 7, 8), subprogramul Cm va
returna, prin cei doi parametric, cifra 8 valoarea 3 reprezentnd ei de

Solutie:
Subprogramul Cm prin parametrii c m, cifra a tuturor
elementelor vectorului a de ale acesteia. Parametrul i
elemetului curent din vector. Valoarea lui c se caz, cu
cea mai mare cifra a elementului ari], valoarea la apelul Mx(a[i]).
De asemenea, valoarea lui m se sau se cu valoarea
de Nr n urma apelului Nr(a[i],c).
145
!!!!!!!!
Subprogramul Cm va fi implementat n Pascal ca iar n C++, ca
de tip void.
8. un subprogram recursiv care citirea de la a unui.
de n valori ntregi le pe cele care un maxim de cifre
distincte. Subprogramul nu va utiliza date structurate. El va apela
D, de cifre distincte ale unei valori ntregi. primite ca
parametru. La rndul D va apela Nr, care
de al unei cifre ntr-un Ambele valori vor fi transmise prin
parametri. complete ale celor trei subprograme, considernd
global.
Exemplu: Pentru n=5 valorile 121,.38, 7, 1188,22 se va 1188, 38, 121
}
elsEl
if (Mx(a(i)==e)
m=m + Nr(a(i),e);
Cm(i+1,e,m) ;
}
}
return Mx(x/10) ;
void Cm(int i,int &e,int &m)
{
if (i<n) {
if (Mx(a(i) e)
e=Mx (a (i) ) ;
m=Nr(a(i) /e);
int Mx(int x)
{
if (x==O) return O;
else
if (x % 10>Mx(x/10
return x % 10;
else
int Nr(int x,int e)
{
if (x==O) return O;
else
if (x % 10==e)
return Nr(x/10, e)+l;
else return Nr(x/10, e);
function Nl:'(x,e:integer):
integer;
begin
4 if x=O then Nr:=O
5 else
6 if x mod 10=e then
7 Nr:=Nr(x div 10, e)+l
8 else Nr:=Nr(x div 10, e);
9 end;
10
11 function Mx(x: integer) :byte;
12 begin
13 if x=O then Mx:=O
14 else
15 if x mod 10>Mx(x div 10)
16 then Mx: =x mod 10
17 else Mx:=Mx(x div 10)
18 end;
19
20 procedure Cm(i: integer;
21 var e,m:integer);
22 begin
23 if i<=n then begin
24 if Mx(a(i) e then begin
25 e :::Mx(Ci[i) ;
26 m:=Nr(a(i) ,e);
27 and
:28 else
29 if Mx(a(i)=e then
30 m:=m + Nr(a(i) /e);
31 Cm(i+1,e,m);
32 end;
33 end;
Solutie:
de cifre distincte ale parametrului x prin
cifrelor de la Ola 9 care apar cel o n scrierea acestuia. Cele 10 cifre sunt
146
prin intermediul parametrulvaloare i. n acest fel,laapelul.D(x,O) se
de cifre distincte ale lui x.
Subprogramul P permite citirea valori din celor n. de. cifre
distincte va fi salvat cu ajutorul variabilei locale y.La
revenirea din recursivitate vor fi acele valori pentru care valoarea variabilei
y este cu valoarea a lui max.
Subprogramul P va fi implementat n Pascal ca iar n C++, ca de
tip void.
4
5
6
7
8
9
1.0
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var n ,max: integer ;
function Nr(x,e:integer):
integer;
begin
t:f ..:X:=O then Nr: =0
else
if xffiod 10=e then
Nr:=Nr(xdiv 10; el 1
else Nr:=Nr(x div. 10, e);
endi
"
function D(x,i:integer) :byte;
begin
if i>9 then D:=O
else
if Nr(x,i=l then
D:=D(x,i+1)+1
else D:=D(x,i+1)
end;
procedure P(i:integer;
var. max:integer);
var x,y:integer;
begin
if i<=n then beg-in,
readln(x); y:=D(x,O);
if y>max then max:Sy;
P(i+1,max) ;
if max=y then write(x,' ')
end;
end;
beg-in
max:=O; read1n(n); P(l,max);
end.
#inelude <iostreame , h>
int max,n;
int Nr(int x,int e)
{
if (x==O) return O;
else
if (x % 10==e)
returnNr(x / 10, e) + 1;
else return Nr(x / 10, e);
int D(irit x,int i)
{
if (i>9) return O;
else
if (Nr(x,i=l)
return D(x,i+1)+1;
else return D(x, i+1);
void P(int i, int &max)
{
int x,y;
if (i<=n){
einx; y=D(x,O);
if (y>max)max=y;
P(i+1,max) ;
if (max==y) eoutx' ';
}
}
void main () {
max=O; einn; P(l,max);
}
9. un subprogramrecursiv Nr care permite citirea a n de caractere
de lungimi egale care prin intermediul unui parametru, de
ce sunt anagrame cu ultimul citit. Subprogramul nu va utiliza tablouri pentru
memorarea acestora.
n cadrul lui se va apela Ok, care de caractere
147
primite prin intermediul a doi parametri sunt anagrame. Ok n
Pascal valoarea True sau False, respectiv o valoare sau O n C++.
n
Exemplu: Pentru n=4 arc, rac, dar, car subprogramul Nr va: returna
printr-un parametru ntreg valoarea 2.
Solutie:
Ok succesiv primul caracter al parametrului a, n cel de al doilea (b).
n cazul n care este va fi din a din b, autoapelndu-se pentru
noile valori ale parametrilor. Procedeul fie cnd caracterul nu este
caz n care valoarea False/O , fie cnd lungimea lui a este
O, caz n care cuvintele sunt anagrame.
Subprogramul Nr va avea doi parametri
parametrul ntreg m, care "cuvinte" anagrame cu
ultimul citit;
parametrul de caractere y, care va ultimul de caractere citit.
La revenirea din autoapeluri, parametrul m valoarea cu o unitate,
la apelul Ok(x,y), se valoarea True/l. Parametrul efectiv x va transmite,
la fiecare apel, de caractere citit la pasul curent. Subprogramul Nr va fi
implementat n Pascal ca iar n C++, ca de tip void.
{
char x[256];
if (i==n) ciny;
else {
cinx;
Nr(i+1,m,y) ;
if (Ok(x,y)) m++;
}
}
void Nr(int i,int &m,
char y[])
int Ok(char ar], char b[])
{
int p;
char c[256];
strcpy(c,b) ;
if (strlen(a)==O) return 1;
p=strchr(c,a[O])-c;
if (p<strlen(c)) {
strcpy(c+p,c+p+1);
strcpy(a,a+l);
return Ok(a,c);
}
else return O;
procedure Nr(i:byte;
var m:byte; var y:string);
var x: string;
begin
if i=n then readln(y)
else begin
readln(x) ;
Nr(i+1,m,y) ;
if Ok(x,y) then inc(m);
end;
end;
function Ok(a,b:string):
boolean;
1
2
3 begin
4 if a=" then Ok:=true
5 else
6 if pos(a[l],b)<>O then
7 begin
8 delete(b,pos(a[l],b),l);
9 delete(a,l,l);
10 Ok: =Ok (a, b) ;
11 end
12 else Ok:=false;
13 end;
14
15
16
17
18
19
20
21
22
23
24
25
26
148
10. un de n valori naturale (n::::;50), ntr-un tablou
unidimensional. subprogramul recursiv M, care prin parametrul
a, un astfel de vector care fiecare element ali] cu suma cifrelor lui
care au paritate cu indicele i.
Subprogramul va apela C, care la alegere suma cifrelor pare sau
impare ale unei valori transmise prin parametrul ntreg x. Parametrul t al va
primi la apel valoarea 1 se calcularea sumei cifrelor impare n caz
contrar. n,
Exemplu: Pentru n=5 valorile 121, 382, 7, 1188, 22, se va n Pascal, 2, 10,
7,16, Oiar n C++, 2, 3, O, 2, 4
Solutie:
C parcurge cu transmis prin parametrul x verificnd
restulla la 2 este egal cu t.
Subprogramul M are, ca parametru vectorul a ca parametru valoare,
indicele i. La fiecare autoapel se elementul a[i] cu valoarea
n urma apelului C(a[i],i mod 2) (n Pascal), respectiv C(a[i],i%2) (n C++).
Subprogramul M va fi implementat n Pascal ca iar n C++ ca de
tip void. n Pascal definit tipul de date sir=array[ 1..50]0! integer.
function C(x,t:integer) :byte;
begin
if x=O then C:=O
else
if x mod 2=t then
C:=C(x div 10,t)+x mod 10
else C:=C(x div 10,t)
end;
1
2
3
4
5
6
7
8
9
10 procedure M(i:byte;var a:sir);
11 begin
12 if i<=n then begin
13 ali] :=C(a[i],i mod 2);
14 M(i+l,a)
15 end
16 end;
int C(int x,int t)
{
if (x==O) return O;
else
if (x % 2==t)
return C(x/10,t) + x%lO;
else return C(x/10,t);
void M(int i,int al])
{
if (i<n) {
a[i]=C(a[i] ,i%2);
M(i+l,a);
}
}
11. Un elev un text ce n cuvinte, pe care l
cuvintele n cadrul textului literele n cadrul cuvintelor.
un subprogram recursiv M, care permite citirea celor n cuvinte care
textul n urma procesului de codificare. Subprogramul nu va
tablouri pentru memorarea cuvintelor. Acesta va face apel la
V, care inversul unui de caractere primit prin intermediul
unui parametru. n
Exemplu: Pentru n=4 cuvintele: ana are multe mere, subprogramul va
eremetlumeraana
149
!!!!!!!
..,
Solutie.,
V inversul unui cuvnt prin concatenare n ordine a
literelor acestuia. Astfel, prima a parametrului s va fi concatenat la finalul
inversului cuvntului care ncepe de la a doua
Subprogramul M are. un singur. parametru ntreg i, care de ordine al
cuvntului citit. Acesta va fi memorat n variabila s. Cuvntul returnat n
urma apelului V(s) va fi la revenirea din recursivitate.
Subprogramul M va fi implementat n Pascal ca iar n C++, ca
de tip void.
1 function V(s:string) :string;
2 begin
3 if s=" then V:="
4 else
5 V:=V(copy(s,2,length(s)-1))+s[1]
end;
7
8 procedure M(i:byte);
9 var s: string;
10 begin
11 if.i<=nthen begin
12 readln(s);
13 M(i+l);
14 write(V(s))
15 end
16 end;
char* V(char s[])
{
char t[256] = {O};
if (strlen(s)==O) return s;
else {
strcpy(t,V(s+l));
t[strlen(t)]=s[O]j
return t;
}
}
void M(int i) {
char s[256];
if (i<=n) { cins; M(i+l);
coutV(s); }
12. un de 11 valori naturale (n:::;50), n tabloul
unidimensional a. un subprogram recursiv S care ordonarea la
alegere a elementelor lui. Tipul care se a
fi va fi codificat prin parametrul ntreg t. la apel, acestuia
i se transmite valoarea 1, atunci se va realiza o ordonare iar
valoarea acestuia este -1, sortarea va fi
variante de a lui S. Una dintre ele nu va nici o
Vectorul a lungimea n a acestuia sunt considerate variabile
globale.
Exemplu: n=5 tabloul (l0, 234, 21, 1, 34). n urma apelului la
subprogramul-S pentru t= -1 elementele vectorului vorfi (234,34,21,10,1).
Solutie.
n prima de implementare, subprogramul S are doi parametri valoare
ntregi i t, Variabila j contorul unei For, care
parcurge elementele cu indici mai mari ca i.
n a doua de implementare S are trei parametri valoare ntregi i; j t.
Subprogramul nu nici o El va fi implementat n Pascal
ca iar n C++, ca de tip void. n varianta Pascal, se
definit tipul de date sir=array[1..50]01integer.
150
1 VARIANTA 1
;2 p:z:;ocedure integer) ;
var x,j:integer;
4 begin
5 if i<n then
6 for j:=i+l ta n do
7 if a[i]*t>a[j]*t then begin
8 x:=a[i]; ari] :=a[j];
9 a[j] :=X;
10 end
11 else S(i+l,t)
12 end;
13
14 . VARIANTA 2
15 procedure S(i,j',t:integer);
16 var x: integer ;
17 begin
18 if i<h then
19 if then begin
20 if a[i]*t>a[j]*t thenbegin
21 x:=a[i];
22 ari] :=a[j];
23 a[j]':=x;
24 end;
25 S(i,j+l,t)
26 end
27 else S(i+l,i+2,t)
end;
VARIANTA 1
void S(int i,int t)
int x, j;
if (i<n-l)
for (j=i+l;j<n;j++)
if (a [i] *t>a [ j ] *t) {
x=a [ i]; a [ i ] =a [ j ] ;
a[j]=x;
}
else S (i+l, t) ;
VARIANTA 2
void S(int i,int j,int t)
{
int x;
if (i<n-l)
if (j<n) {
if (a[i]*t>a[j]*t) {
x=a[i];
a[i]=a[j);
a[j] =x;
}
S(i,j+l,t);
}
else S(i+l,i+2,t);
13. un subprogram recursiv care pe ecran n linii numere
naturale sub forma n
Exemplu: Pentru n=4 se va 1
123
12345
1234567
Solutie:
Subprogramul S are doi parametri valoare ntregi i j, reprezentnd de
ordine al liniei pe care se face respectiv valoarea care vafi'
Subprogramul nu nici o El va fi implementat 1n Pascal
ca iar n C++, ca de tip void.
procedure.. S(i,j :integer);

if i<=ri then
if then begiri
write ( j r ');
S(i,j+l)
7 end .
8 else begin
9 writeln; S(i+l,l)
10 e:nd;
11 end;
void S(int i,int j)
{
if (i<=n)
if (j<=2*i-l){
coutj' ';
S (i, j+l).;
}
else {
coutendl; S(i+l,l);
}
151
*
14. un subprogram recursiv care, primind printr-un parametru un
natural strict pozitiv n, pe ecran 2*n-1 linii caractere sub forma

Exemplu: Pentru n=3se va
**
***
* *
*
Solutie:
Subprogramul S are trei parametri valoare n, i j. Valoarea parametrului i
de ordine al liniei pe care se face Parametrul j
de ordine (n cadrul liniei) al caracterului care va fi Subprogramul
nu nici o El va fi implementat n Pascal ca
iar n C++, ca de tip void.
}
else {
coutendl;
S(n,i+l,l);
}
else {
coutendl;
S(n,i+l,l) ;
}
else
if (i<=2*n)
if (j<2*n-i+l) {
coutI1* IIi
S(n,i,j+l);
}
void S(int n, int i, int j)
{
if (i<=n)
if (j<=i) {
cout"* ";
S (n, i, j+l) ;
procedure S(n,i,j:integer);
begin
if i<=n then
if j<=i then begin
write('* ');
S(n,i,j+l)
end
else begin
writeln;
S(n,i+l,l)
end
else
if i<=2*n then
if j<2*n-i+l then begin
write('* ');
S(n,i,j+l)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 end
18 else begin
19 writeln;
20 S(n,i+l,l)
21 end
22 end;
15. un de n valori naturale (n::;;SO), n tabloul
unidimensional a. un subprogram recursiv S care doi
vectori ce vor elementele lui a care au prima respectiv cele care
au prima Subprogramul va returna vectorii lungimi le
acestora prin intermediul parametrilor. El va apela C, care
prima a unei valori naturale primite prin intermediul unui
parametru. tabloul a lungimea n a acestuia declarate global.
complete ale celor subprograme.
Exemplu: : Pentru n=S a=(lO, 234, 21, 1, 34), subprogramul S va construi doi
vectori de lungime 3, respectiv 2: (10,1,34) (234, 21).
152
!!!!!!!!!!!
Solutie:
Transferul de date pentru subprogramul S se prin cinci parametri:
parametrul valoare i, patru parametri tablourile b d, respectiv
lungi mile lor, k 1. n urma apelului C(a[i]), se o valoare
atunci elementul ali] este memorat n vectorul b, altfel n vectorul d.
Subprogramul S va fi implementat n Pascal ca iar n C++, ca de
tip void. n varianta Pascal se definit tipul de date sir=array[1..50]of
word.
k, l:byte) i
function C(x:word) :byte;
beg-in
if x<10 then C:=x
else C:=C(x div 10);
end;
1
2
3
4
5
6
7 proce4ure S(i:byte;
8 var b,d:sir;var
9 beg-in
10 if i<=n then beg-in
11 if C(a[i]) mod 2=0
12 beg-in "
13 inc (k);
14 b[k] :=a[i];
15 end
16 else beg-in
17 inc (1) ;
18 d[l] : =a [il ;
19 end;
20 S(i+1,b,d,k,1);
21 end;
22 end;
then
int C(int x)
{
if (x<10) return x;
else return C(x/10);
void S(int i,int bel,
int d[],int &k,int &1)
{
if (i<n) {
if (C (a [i]) %2==0)
{
b[k] =a [il ;
k++;
}
else {
d[l]=a[i]; 1++;
}
S(i+1,b,d,k,1) ;
}
}
16. de n cifre zecirnaleorslO), memorate n tablourile
unidimensionale a b. se realizeze E, care valoarea
expresiei a[l]b[ll+ a[2]b[2
1
+...+ a[n]bf/ll. n cadrul acesteia se va face apel la
Pow, care primind prin parametrii x numere naturale,
valoarea x".
Tablourile lungimea acestora se a fi declarate ca variabile globale.
Exemplu: Pentru n=5 tablourile: a=(1,2,3,4,5) b=(5,4,3,2,1), se va 65.
Solutie:
Pow valoarea :>2' prin repetate. de oprire a
este cnd y este egal cu O, caz n care
valoarea 1. E un natural prin parametrul valoare i. Acesta
a elementelor din cei doi vectori. n varianta Pascal se
definit tipul de date sir=array[1..10]ofbyte.
153
!!!!!!!!!
function Pow(x,y:byte} :
longint;
begin
if y=O then Pow:=l
else
pow:=x*Pow(x,y-1};
E;lnd; .
1
2
3
4
5
6
7
8
9 fUriction E(i:byte} :longint;
10 begin
11 if i<=n then
12 E:=Pow(a[i),b[i)}+E(i+1}
13 else
14 E:=O;
15 end;
long Pow(int x,int y}
{
if (y==O) return 1;
else
returnx*Pow(x,y-1};
}
long E(irit i}
{
if (i<n}return
Pow(a[i),b[i))+E(i+1};
else
return O;
17. 1, 3,6, 10,15,21,28, 36.... se realizezecusuhpr?gram
recursivM care permite memorarea primilor n
2
termeni ai ,l]tr-o matrice
cu n linii n coloane(n<IO).Termenii vor fi n ordine pe linii dela
stnga la dreapta. Subprogramul va apela care
termenul cu de ordine transmis prin intermediul unui parametru
ntreg. Variabila n se global.
complete ale celor subprograme.
Exemplu: Pentru n=4, subprogramul M va memora n matrice elementele:
1 3 6 10
15 21 28 36
45 55 66 78
91 105 120136
.
Termenii Astfel, tehl)eniI1al
pornind de la T(l)=L .
T
valori naturale prin parametrii .. 'i 'i.
indicele . liniei colo;anei ele
l11entului

prin parametrul a. Elementul a[i;j] va memora termenul din
cu de ordine pe care l are a[i;j] laliniarizarea matricei.
Subprogramul M va fi implementat n Pascal ca iar n C++, ca
de tip void. n varianta Pascal se definit tipul de date
matearray1.'10;1..10] of longint.
;1 functionT(x:byte} :longint;
2 bE;lgin
3 if x=l then T:=l
4 else T:=x+T(x-1};
5 end;
154
long T(int x}
{
if(x<=l} return 1;
else return x+T(x-1};
6 procedureM(i,j:byte;
7 var a:mat);
8 begiri
9 if i<=n then
10 if j<=n then begin
11 a[i,j]:=T(n*(i-l)+j);
12 M(i,j+1,a);
13 end
14 elseM(i+1,1,a);
15 end;
void.M(inti,int j,
long a[10] [10])
{
if (i<n)
if (j<n) {
ari] [j]=T(n*i+j+1);
M(i,j+1,a);
}
else M(i+1,0,a);
}
18. Se de la un de n valori naturale de cel mult 9 cifre. Se
n ordine a valorilor citite din care au fost cifrele
impare. Subprogramul recursiv M prelucrarea a folosi
tablouri pentru valorilor citite. Subprogramul
T, care cifrele impare ale unei valori transmise ca parametru. Variabila nse
a'fi global.
complete ale celor subprograme.
Exemplu: Pentru n=5 valorile 1324,4325,4356,492181, 32474 se
244 ,428, 46;'42, 24
Solutie:
o valoare prin intemediul unui
ntreg lung. Acesta va fi parcurs cu valoarea de
reprezentnd un creat doar din cifrele lui pare.
un singur parametru ntregi, deordine al
citit. .Acesta va fi memorat n variabila x. returnat n
UrIna apelului T(x) va fi la revenireadinrecursivitate:Subprogramul M va fi
implementat n Pascal ca iar nC++, de tip voi:
function T(x:1ongint) :longint;
begin
if x=O then T:=O
else
if x mod 2=0 then
T:=x mod 10+10*T(x div 10)
else T:=T(x div 10)
end;
1
2
3
4
5
6
7
8
9
10 procedure M(i :byte) ;
11 var x: longint;
12 begin
13 if i<=n then begin
14 readln(x); M(i+1);
15 write(T(x),")
16 end
17 end;
long T(lorig:x:)
{
if (x==O) return O;
else
if (x % 2==0)
return x%10 10*T(x/l0) ;
else return T(x/10);
void M(int i)
{long x;
if (i<=n) {
cinx; M(i+1);
coutT (x) " ;
155
se va
4123
5234
6345
7456
19. Se o matrice a cu n linii n coloane, ale elemente sunt
numere naturale. Se permutarea a elementelor de pe fiecare linie
cu k spre stnga. un subprogram recursiv M care
Acesta printr-un parametru, indicele liniei care
a fi n cadrul acestuia se va face apel la subprogramul recursiv Inv, care
elementele situate pe linia l ntre coloanele i j. Toate cele. trei valori
sunt primite prin intermediul parametrilor.
Tabloul a variabila n se declarate global.
Exemplu:
Pentru n=4, x=3 tabloul a
1234
2345
3456
4567
Inv(i,O,k-l)i
Inv(i, O, n-l) i
Inv(i, O,n-k-l) i
M(i+l,k)i}
void M(int i,int k)
{
if (i<n) {
void Inv(int l,int i,int j)
{int Xi
if (i<=j) {
x=a [ 1] [i] i a [ 1] [il =a [1] [j] ;
a [1] [j] =Xi
Inv(l, i+l, j-l) i
}
procedure M(i,k:byte)i
begin
if i<=n then begin
Inv(i,l,k) i Inv(i,l,n)i
Inv(i,l,n-k)i M(i+l,k)
endi
endi
Solutie:
tabloul unidimensional cu n=5 elemente (1, 2, 3, 4, 5). Permutarea
cu k spre stnga o putem realiza prin trei de inversare a
unor subtablouri.
inversarea primelor k elemente;
inversarea tutoror celor n elemente;
inversarea primelor n-k elemente.
n aceste 102, tabloul va suferi
2 13 4 5, 5 4 3 12, 3 4 5 12.
cum se vectorul a fost permutat cu k spre stnga.
Aceasta este. metoda prin care subprogramul /t4 va permuta elementele .linii.
Cele valori. primite de subprogram prin parametri i k vor reprezenta n
ordine: indicele liniei ce va fi respectiv de cu care. se vor
permuta elementele. Subprogramul M va fi implementat n Pascal ca iar
n C++, ca de tip void.
1 procedure Inv(l,i,j:byte)i
2 var x:integeri
3 begin
4 if i<=j then begin
5 x:=a[l,i] ia[l,i] :=a[l,j] i
6 a [1 r j] : =x i
7 Inv(l,i+l,j-l)
8 end
9 endi
10
11
12
13
14
15
16
17
156
!!!!!!
20. un natural x de cel mult 9 cifre. un program care l
scrie pe xca de termeni din lui Fibonacci. Primii termeni ai
sunt 1, 1, 2, 3, 5, 8, 13,..... n cadrul programului, vor fi definite
subprograme recursive:
Fib, care termenul din Fibonacci cu de
ordine transmis printr-un parametru.
subprogramul Gen, care valori naturale prin parametrii v n.
Acesta n cadrul autoapel, cel mai mare termen al
Fibonacci mai mic sau egal cu valoarea v. de ordine al acestui
termen este dat de valoarea lui n. autoapelurilor, subprogramul Gen
va n final descompunerea x n termeni ai lui
Fibonacci.
Exemplu: Pentru se va 55, 21, 3, 1
Solutie:
Termenii regula jj=l, 12=1, in= fn-l+fn-2. este
n n cadrul Fib.
Subprogramul Gen n cadrul autoapeI, cel mai mare termen mai
mic sau egal cii valoarea parametrului v. Subprogramul Fib.
de oprire din recursivitate a subprogramului este cnd valoarea
lui v devine O. Un astfel de procedeu conduce la scrierea lui x ca cu
minim de termeni ai
var x:longint;
function .Fib(n:byte) : longint;
begin
if (n<=2)thenfib:=1
else Fib:=Fib(n-1)+Fib(n-2);
end;
1
2
3
4
5
6
7
8
9 procedure Gen(v,n:longint);
10 var y: longint;
11 begin
12 if Fib (n+l )<=v then
13 Gen(v,n+1)
14 else begin
15 y:=Fib(n);
16 write(y,");
17 if v-y>O then Gen (v__y, O) ;
18 end;
19 end;
20
begin
readln(x) ;
Gen(x,O)
end.
#include<iostream.h>
long X;
long Fib(int n){
if (n<=2) return 1;
else return
Fib(n-1)+Fib(n-2) ;
void Gen(long v,long n)
{long y;
if (Fib(n+1)<=v)
Gen (v, n+1) ;
elae {
y=Fib(n) ;
couty' ';
if Gen(v-y,O);
}
}
main() {
cinx;
Gen(x, O);
}
157
!!!!!!!!!
1. Se un de n valori naturale de cel mult 9 cifre.
de valori care pot fi scrise sub forma k! (l *2*3*.;. *k). Nu se vor folosi date
structurate pentru celor n numere. n cadrul programului.rsevor defini
subprograme recursive:
Ok, care o valoare printr-un- parametru
factorialul unei valori. n Pascal; valoarea
True sau False, respectiv o valoare sau On C++;
'Nr, care permite citirea. celor n numere de
valori factoriale. n cadrul ei se va apela Ok.
Exemplu: Pentru n=5 valorile 7, 16, 6, 13, 24, se va 2, deoarece 6=1*2*3,
24=1*2*3*4.
2. un tablou unidimensional a .cun(n<50)
un program pe linii,element.9Ie din vector
cifra (prima n scrierea linie.vor fi scrise el9mente
cu n .cadrul programului, se vor defini
recursive: .
Cif, care cifra a unei valori primite printr-un
parametru.
subprogramul Afis, care pe o linie a standard elementele. din
vector ce au cifra cu o valoare prin parametrul c.
Parametrul ntreg i va indica elementului curent din'vector.
Exemplu: Pentru n=7 124,21,34,122,1,39), se va
124122 1
21
3343439
3. un tablou unidimensional a cu n(n<50) elemente numere naturale de
cel mult 9 cifre. se realizeze un program care elementele vectorului,
de cifre pare pe care le n cu
de cifre pare, ordonarea se va face n de valorile acestora. n
cadrul programului, se vor defini subprograme recursive:
Nr, care de cifre pare al unei valori primite printr-
un parametru.
subprogramul Sortare, care ordonarea a elementelor
vectorului, regula Acesta va face apel la nu va
repetitive.
Exemplu: Pentru n=7 a=(384, 824,21,34, 122, 1268,39), se va
39,21,34,122,384,824,1268,
158
!!!!!!!!!!!
4. un tablou unidimensional.c cu n(n<50).elemente numere naturale de
cel mult 9 cifre. se realizeze un program care permite elementului care
are cel mai mare produs al cifrelor impare ce apar nscrierea .sa, mai
multe elemente cu proprietate, se va elimina cel de indice minim.
n cadrul programului, se vor defini subprograme recursive:
P, care produsul. cifrelor impare ale unei valori primite
printr-un parametru.
subprogramul Del, care permite unui element dintr-un vector, al
indice este transmis prin parametrul ntregi. Subprogramulva avea
doi parametri reprezentnd tabloul din care se
lungimea acestuia. seva face prin deplasarea elementului a[i+1]
pe i,
Exemplu: Pentru n=7 a==(384, 824, 21, 349, 122, 1268, 37), se va vectorul
cu (384, 824,21, 122,1268,37);
5. un tablou unidimensional a cu n(n<50) elemente numere naturale de
cel mult 9 cifre. se realizeze un program care mai mare divizor
comun al; elementelor care nu sunt numere prime. n. cadrul programului, se vor
defini subprograme recursive:
.Ok, care. o. valoare printr-un parametru
un prim. .n Pascal valoareaZrue sau
False, respectiv o valoare sau On C++..
Cmmmd, care cel mai mare divizor comun a valori
transmise prin intermediul unor parametri valoare.
Exemplu: Pentru n=7 a=(37, 40, 13,60,31, 11,140), se va 20.
6. un tablou unidimensional a cu n(n<50) elemente numere naturale de
cel mult 9 cifre. se realizeze un program care fiecare element. cu
valoarea lui din care s-au eliminat toate cifrei maxime.A.stfel, elementul
34241 va deveni 321. n cadrul programului, se vor defini trei subprograme
recursive:
Cmax, care cifra a unei valori primite printr-un
parametru ntreg-lung.
DeICif, care prin parametrii x c, valori ntregi.
Aceasta valoarea din x prin cifrei c.
subprogramul S, care parcurge elementele vectorului ' primit printr-un
parametru le cu valorile ce
Subprogramul indicele elementului curent printr-un parametru
valoare.
Exemplu: Pentru n=7 443, 13, 160,31, 11, 140), se va
a=(3, 3, 1, 10, 1,0, 10).
159
7. un tablou unidimensional a cu n(n<100) elemente numere naturale
de cel mult-I cifre. se realizeze un program care fiecare element cu
cel mai apropiat palindrom de acesta. Astfel elementul 341 va deveni 343, iar 146
va deveni 141. n cadrul programului, se vor defini subprograme recursive:
Pal, care o valoare prin parametru x un
palindrom. Parametrul va memora, n final, inversul
x. n Pascal valoarea True sau False, respectiv o
valoare sau n C++.
Seareh, care prin parametrii x t, valori ntregi.
Aceasta cel mare palindrom, mai mic ca x sau cel mai mic palidrom
mai mare ca x, cum valoarea la apel a parametrului teste. - 1 sau 1.
Subprogramul va face apel la Pal.
Exemplu: Pentru n=4 a=(37, 44, 130, 16), se va a=(33,44, 131, 11).
8. un tablou unidimensional a cu n(n<100) elemente numere naturale
de cel putin cifre. se realizeze un program care elementul cu
maxim de din vector cu suma primelor cifre ale sale. n cadrul
programului, se vor defini trei subprograme recursive:
Se, care suma primelor cifre ale unei valori primite
printr-un parametru ntreg.
Ap, care prin parametrii x i, valori ntregi. Aceasta
de al lui x n vectorul a. Valoarea prin
parametrul i n vector.
subprogramul.Max, care prin parametrul i, indicele elementului
curent prin parametrul x, elementul cu maxim de
n vectorul a. Subprogramul Ap.
Exemplu: Pentru n=7 a=(3700, 544, 130, 544, 3700, 544, 130), se va
a=(3700, 9, 130,9,3700,9, 130).
9. un tablou unidimensional a cu n(n<100) elemente numere naturale
de cel mult patru. cifre. se realizeze un program care
elementului minim. n cadrul programului, se vor defini trei subprograme
recursive:
Min, care elementul minim al vectorului a. Parametrul i
n vector.
subprogramul Del, care permite elementului din a al indice este
transmis prin parametrul i. Subprogramul va avea doi parametri
reprezentnd tabloul din care se lungimea acestuia.
se va face prin deplasarea elementului a[i+1] pe i,
Exemplu: Pentm.n=7 1, 130,1,37,1, 130), se va 37, 130,37, 130.
10. Se un vector ce n cifre zecimale(n<lO). se verifice
numerele formate cu cifrele/din vector citite de la dreapta la stnga de la stnga
la dreapta cuburi perfecte.
160
!!!!!!!!
n cadrul programului, se vor defini subprograme recursive:
Nr, care format cu elementele vectorului a.
Parametrul i n vector, iar parametrul t sensul de
parcurgere al tabloului. la apel t=-I, atunci va fi format cu
cifrele vectorului de stnga la dreapta de la dreapta spre stnga, t=l.
Cub, care valori ntregi prin intermediul parametrilor x
i: Aceasta o valoare i astfel nct x se poate scrie ca i'.
n Pascal valoarea True sau False, respectiv o valoare
sau On C++.
Exemplu: n=3 vectorul: (1, 2, 5), se va 125 este cub perfect, 521 nu este
un cub perfect".
11. Se o valoare n de cel mult 9 cifre. se n n
toate modurile posibile ca de numere oglindite.
n cadrul programului, se vor defini subprograme recursive:
care inversul unui transmis parametrul valoare
x. Parametrul y va memora inversul construit succesiv.
subprogramul S, care valori ntregi prin intermediul
parametrilor x i. Acesta toate valorile i cu proprietatea suma
dintre i inversul este cu x.
Exemplu :Pentru n=787, se va 146+641,245+542, 344+443.
12. un de n valori naturale (n::;50) n tabloul
unidimensional a. un program care doi vectori ce vor
elementele lui a care sunt numere perfecte, respectiv pe cele care nu sunt
numere perfecte. Un egal cu suma divizorilor strict mai mici dect el se
perfect.
n cadrul programului, se vor defini subprograme recursive:
Sd, care de divizori ai unei valori ntregi
transmise ca parametru.
subprogram recursiv Make, care doi vectori ce vor
elementele lui a care sunt perfecte, respectiv cele care nu valori
perfecte. Subprogramul va returna vectorii lungimi le acestora
prin intermediul parametrilor. Acesta va apela Sd.
Exemplu: Pentru n=5 a=(10, 6, 21, 28, 496), programul va construi doi vectori
de lungime 3 respectiv 2: (6,28,496) (10, 21).
13. Se cu ajutorul unui de caractere, o expresie ai operanzi se
a fi doar parantezele rotunde. Astfel, o valoare ntre paranteze
rotunde va fi n baza 2. se valorile conversia n
baza 2 a tuturor operanzilor n expresie.
n cadrul programului, se vor defini subprograme recursive:
subprogramul B2, care cu valoarea n urma
conversiei n baza 2 a unui ntreg transmis ca parametru.
161
subprogramul Extrag, care prin intermediul parametrului s,un
de caractere reprezentnd o expresie anterior. Subprogramul
valorile operanzilor n urma conversiei n baza 2. Se va
face apel la B2.
Exemplu: Pentru expresia (7)(8)(13), se va 111,1000, 1101.
14. Se citesc. de la n cuvinte formate din cel mult 50 de litere ale
alfabetului englez o s de caractere o un
program care cuvintele care cele mai multe silabe egale cu s. Nu se
vor folosi date structurate pentru celor n cuvinte. n cadrul programului,
vor fi definite subprograme recursive:
Nr, care de caractere prin parametrii x y.
Aceasta de a lui x n y.
subprogramul Salve, care permite citirea celor n cuvinte celor cu
proprietatea n Subprogramul va avea trei parametri:
parametrul valoare i, care de ordine al cuvntului care va fi
citit, parametrul valoare s,care silaba parametrul
max, ce va memora maxim de al lui sprintre
cuvintele citite.
Exemplu : Pentru n=4, silaba ma cuvintele mama, tamara.. mamaie, inca, se va
mamaie, mama
15. Se citesc de. la n cuvinte formate din cel mult 50 de litere ale
alfabetului englez. se realizeze un program care n ordinea
citirii, cuvintele oglindite, din care lipsesc vocalele. Nu se vor folosi.date
structurate pentru celor n cuvinte. n cadrul programului, vor fi definite
subprograme recursive:
!nv, care un de caractere prin parametrul x
inversul din care lipsesc vocalele.
subprogramul Salve, care permite citirea celor n ordine
a valorilor cerute prin Subprogramulva avea un parametru
valoare i, care de ordine al.cuvntului care va fi-citit-Acesta
va apela !nv.
Exemplu : Pentru n=4 cuvintele. mama, tamara, mamaie, inca, se va cn,
mm, rmt, mm.
16. Se citesc de la n numere de cel mult patru cifre. se realizeze un
program care produsul numerelor care sunt egale cu suma factorialelor
cifrelor componente. Nu se vor folosi date-structurate pentru .celor n
numere.. n cadrul programului, .vor . fi definite trei subprograme
recursive:
Fact, o prin parametrul x valoarea x!
Sum, care un ntreg prin parametrul x
suma factorialelor cifrelor lui x. Aceasta va face apel la Fact.
162
se va
4237
5432
2543
Prod, care permite citirea celor n valori ntregi care
produsul valorilor cerute.
Exemplu: Pentru n=::5 numerele 1,63,2, 145,496, se va 290, deoarece 290
=1*2*145.
17. 0, 2, 1, 3, 2, 4, 3, 5,4, 6.... se realizeze cu program care
permite memorarea primilor n
2
termeni ai ntr-o matrice cu n linii
n coloane(n<10).Termenii vor fi n ordine pe linii de la stnga la dreapta.
In cadrul programului, se vor defini subprograme recursive:
T, care termenul cu de ordine
transmis prin intermediul unui parametru ntreg.
subprogramul recursiv M, care permite memorarea primilor n
2
termeni ai
ntr-o matrice cu n linii n coloane(n<10). Subprogramul
M valori naturale prin parametrii i j, valori care
indicii, .liniei coloanei elementului curent. Matricea este
prin parametrul Q.
Exemplu: Pentru n=4, programul va matricea:
0213
2435,'
4657
6879
18. Fie un tablou bidimensional A(n,m). un program care
elementele de pe liniile care ncep cu un prim. n cadrul programului, vor fi
definite subprograme recursive:
Ok, care o valoare printr-un parametru
un prim. n Pascal. valoarea True sau
False, respectiv o valoare sau n C++.
subprogramul !nv, care doi parametri ntregi i 1. Acesta
elernentelei de pe linia 1prin interschimbarea elementul cu
cel simetric n cadrul liniei.
subprogramul Pl, care parcurge fiecare linie a tabloului liniile
care ncep cu un prim. El va primi, printr-un parametru valoare,
indicele liniei curente.
Exemplu: Pentrun==3, m=4 matricea:
4237
2345
3452
19. Se un tabloubidirnensional cu n linii n coloane (l::;n$;100), avnd
componete de tip ntreg. Cele diagonale ale tabloului mpart tabloul n patru
regiuni n de Secere se determine suma componentelor din
interiorul zone. In cadrul programului, vor fi definite patru
163
se va
SI=4
S2=8
S3=12
S4=16
recursive. Fiecare dintre ele suma elementelor situate ntr-una dintre
cele patru zone. Toate vor primi, prin doi parametri valoare, indicii liniei
elementului curent. n cadrul nici unei nu se vor folosi
repetitive.
Exemplu: Pentru n=5 tabloul:
01 1 10
20103
22033
20403
04440
20. se rearanjeze elementele unei matrice de dimensiune nxm, astfel nct ele
fie ordonate att pe linii ct pe coloane. n cadrul programului, vor fi
definite subprograme recursive:
Subprogramul OrdL, care elementele situate pe o linie al
indice este transmis printr-un parametru valoare. Subprogramul nu
nici o
Subprogramul OrdC, care elementele situate pe o al
indice este transmis printr-un parametru valoare. Subprogramul nu
nici o
Exemplu: n=3, m=4 matricea
3 1 89
4657
2013
se va
0123
1367
4589
21. Se tabloul bidimensional a cu n linii n coloane avnd
componete de tip ntreg. un program care fiecare element
situat sub diagonala cu suma ce apar la descompunerea lui
n factori primi. De exemplu valoarea 360=2
3*32*51
vafi cu
6(3+2+1). In cadrul programului, se vor defini subprograme recursive:
S_e, care suma. din descompunerea n factori
primi a unui primit prin parametrul ntreg x.
subprogramul Diag, care parcurge toate elementele. situate sub diagonala
a lui a. Acestea vor fi nlocuite cu valori cerute n
Subprogramul va avea doi parametri valoare, reprezentnd indicele liniei
al coloanei elementului curent. Nu se vor folosi repetitive.
Exemplu: n=4 matricea se va
123211 213 901 123211213901
124216215 360 124216215.Q
122125 125.la 122125 J.J.
535 400 625 120 535 .Q 1
164
"
22. Se de la o valoare de cel mult 5 cifre. se realizeze
un program care permite memorarea primelor n
2
numere prime mai mici dect k,
ntr-o matrice cu n linii n coloane. Programul va determina cea mai
mare valoare pentru n. Termenii vor fi n ordine pe linii de la stnga
la dreapta. n cadrul programului, se vor defini subprograme
recursive:
T, care o valoare printr-un parametru
un prim. n Pascal valoarea True sau
False, respectiv o valoare sau On C++.
subprogram M, care permite memorarea primelor n
2
numere prime ntr-o
matrice cu n linii n coloane. Subprogramul trei valori
naturale prin parametrii i, j v, valori care indicii liniei
coloanei elementului care va memora v, doar acesta este prim.
Se va, face apel la Ok.
Exemplu: Pentru k=30, programul va determina n=3 va genera matricea:
2 3 5
7 11 13
17 1923
23. un program care toate cuvintele de lungime n formate din
cele caractere ale codului Morse '.', '-'. n cadrul programului, se va defini
subprogramul recursiv Morse care pe cte o linie a
standard, de caractere cerute. Subprogramul va avea un singur parametru
valoare de tip de caractere.
Exemplu:Pentru n=2 se va .- -.
24. Se un tablou unidimensional de lungime n. Asupra acestuia se vor
efectua de care constau n lui unuia
dintre cele subtablouri astfel n este impar, elementul de pe
[n/2] este eliminat. Procesul de se la unui tablou
cu un singur element. se pe o linie n text Out.txt, toate
elementele care se pot la ncheierea procesului de
Datele de intrare se citesc din In.txt n format: Pe prima linie
n, iar pe linie elementele separate prin cte un
Exemplu: Pentru In.txt
7
1234567
Out.txt
1357
165
function caut_binar(var x:integer) :integer;
var st,dr,mij:integer;
begin
st:=l; dr:=nv+1;
while st<dr do begin
mij:=(st+dr) div 2;
if v[mij]>=x then st:=mij+1 else dr:=mij;
end; caut_binar:=st;
end;
begin
assign(input, 'partitie.in');reset(input); read(n);
for i:=l to n do begin
read(x); p:=caut_binar(x);
v[p] :=x;
if p=nv+1 then inc(nv);
end;
assign(output, 'partitie.out'); rewrite(output);
writeln(nv) ;
end.
Probleme de concurs
2.3.1 Probleme rezolvate
1. ***) Se un vector cu componente numere ntregi,
cu valori cuprinse ntre 1 50000. se acest vector n ct mai
strict
Pe prima linie a de intrare partitie. in se valoarea
linie N numere separate prin cte un singur
Prima linie a partitie. out va de strict

Exemplu: partitie. in partitie. ou t
9 3
2 1 3 4 o 7 2 7 10
Solutie:
Se vectorul de la stnga la dreapta, pentru a se construi cu o
parcurgere. Fiecare element este la unuia dintre le
deja formate sau, acest lucru nu este posibil, el este pus separat pentru a
ncepe un nou n n care un element poate fi alipit la mai multe
se alipirea la care se ntr-un ct mai mare.
n concluzie, pentru fiecare element VIi] trebuie se afle, dintre toate le
deja create, cu valoarea cea mai mare, dar strict mai dect VIi]. Pentru
aceasta se valorilor de la capetele ntr-un vector
separat, sortat, asupra se pot efectua binare. De asemenea, .se va
pentru fiecare element din V succesorul n din care
face parte.
1 var n,nv,i,x,p:integer; v:array[0 .. 10000] of integer;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
166
,<
int caut_binar(int x) {
;nt st,dr,mij;
for (st=O,dr=nv;st<dr;){
mij=(st+dr)/2;
if (v[mij]>=x) st=mij+l; else dr=mij;
}
return st;
}
Solutie:
Pentru a rezolva problema trebuie explicitate modulele. Se IXI =X, X:::
Osau -X X< O. n fel se poate scrie IX1-X21 + IY1-Y21 + IZ1-Z21.
Cele 3 module se pot explicita in 8 moduri. Pentru fiecare mod se un alt
167
void main()
int i,x,p;
freopen( "partitie. in", "r", stdin); scanf ("%d", &n);
for (i=O;i<n;i++) {
scanf ("%d", &x) ;
p=paut_binar(x) ;
=x;
if (p==nv) nv++; }
freopen("partitie.out" , "w",stdout);
printf ( "%d\n" ,nv) ;
}
1 #include <stdio.h>
2 int n,v[lOOOO] ,nv;
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2. - ***) B.A. da N:SIO.OOO puncte n cu coordonate numere
ntregi. cere Manhattan dintre cele mai 2 puncte (tot folosind
Manhattan). Reamintim Manhattan dintre 2 puncte n cu
coordonatele (Xl, Yl, Z]) respectiv (X2, Y2, Z2) este:
IXl - x21 + IYl - Y21 + IZl - z21.
Pe prima linie a distanta. in se N, reprezentnd de puncte. Pe
N linii sunt cte 3 numere ntregi separate printr-un
reprezentnd n ordine, coordonatele X, Y respectiv Z ale celor N puncte
(-1.000.000 sX, 1', zs 1.000.000).
distanta. out va o linie cu un singur ntreg, anume
cea mai mare ntre 2 puncte dintre cele N.
Exemplu: distanta. in distanta. out
8 3
o o o
o o 1
o 1 o
100
110
101
011
111
begin
assign(input, 'distanta.in'); reset(input);
readln(n) ;
for i:=l to n do read(x[i] ,y[i],z[i]);
for sx:=-l to 1 do
for sy:=-l to 1 do
for sz:=-l to 1 do
if (sx<>O)and(sy<>O)and(sz<>O) then begin
min:=2000000000; max:=-2000000000;
for j:=l to n do begin
t:=sx*x[j]+sy*x[j]+sz*x[j];
if min>t then min:=t;
if max<t then max:=t;
end;
if rez<max-min then rez:=max-min;
end;
assign(output, 'distanta.out'); rewrite(output);
wri teln (rez) ;
end.
punct, acestei a modulelor. Pentru fiecare dintre aceste 8
celor 8 ale modulelor) nu trebuie dect se
minimul maximul. La se pe care dezvoltare s-a cea
mai mare dimensiunii datelor, se vor folosi compilatoarele
FreePascal sau GCc.
1 var n , rez, .i , j, t, sx, sy, sz,min,max: longint;
2 x,y,z:array[l .. 10000] of longint;
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1 #include <stdio. h>
2 long n , X(10000], Y[10000], Z[10000] ,rez=-2000000000;
3
4 void main () {
5 long i,j,t,sx,sy,sz,min,max;
6 freopen ( "distanta. in" , "r" ,stdin) ;
7 scanf (" %ld" ,&n) ;
8 for (i=O;i<n;i++)
9 scanf("%ld %ld %ld",X+i,Y+i,Z+i);
10 for (sx=-l;sx<=l;sx++)
11 for (sy=-l;sy<=l;sy++)
12 for (sz=-l;sz<=l;sz++)
13 if (sx&&sy&&sz) {
14 min=2000000000, max=-2000000000;
15 for (j=O;j<n;j++) {
16 t=sx*X[j]+sy*Y[j]+sz*Z[j];
17 if (min>t) min=t;
18 if (max<t) max=t;
19 }
20 if (rez<max-min) rez=max-min;
21 }
22 freopen( "distanta. out" ,"w", stdout);
23 printf("%lld\n", rez);
24 }
168
Solutie:
Algoritmul fiecare clasament astfel: se cu elementul A[l]
care tricoul primului clasat: N-A[ 1], selectndu-se acest Se
identificarea ordinii la sosire ignorndu-se numerele de tricou deja selectate. La
finalul probe, se ntr-un vector, n clasament a
concurent, marcndu-se cei care nu au avut o
3. (Maraton - **) N$3.000 sportivi de la 1 la N iau parte la un maraton.
Clasamentul final este codificat sub forma unui vector A de lungime N. Fiecare
element A[i] din vector are interpretare: concurentul clasat pe locul ia
devansat un de A[i] ale numere de pe tricou sunt mai mari
dect al lui. n decursul ultimului an, N sportivi au participat la M$lO
probe de maraton de fiecare au avut pe tricoul de concurs.
Toate clasamentele finale au fost codificate regula
sportivii au terminat fiecare dintre cele M probe de maraton,
care au evoluat din ce n ce mai bine, la fiecare locul
pe care l-au ocupat a fost strict mai mic dect la proba
In text maraton.in, pe prima linie, se numere naturale N M,
printr-un Pe M linii sunt scrise, n ordine
a momentului clasamentele finale (cte un clasament pe o
linie). Numerele scrise pe linie sunt prin cte un
n text maraton.out, pe o singura linie, se vor scrie n ordine
numerele de pe tricou ale cu ascendente. n cadrul
liniilor, numerele vor fi prin cte un nu
de va mesajul NU EXISTA.
Exemplu: "
maraton.in maraton.out
procedure rezolva;
var i,j:integer;
begin
for i:=l to n do begin
j:=n+l; nr:=O;
while (j>l}and(nr<=a[i]}do begin
dec(j); if not sel[j] then inc(nr};
end;
sel [j] : =true;
if p[j]=O then p[j] :=i
elseif (p[j]>i}and(p[j]<>n+l) then p[j] :=i
else p[j] :=n+l;
169
1 4
1 type sir=array[1 .. 3005]of word; sirb=array[l .. 3005]of boolean;
2 var i,n,nr,k,j,m:longint; sel:sirb; p,a:sir;ok:boolean;
3
4
5
6
7
8
9
10
11
12
13
14
15
16 end;
17 end;
5 2
32210
3 3 110
18 procedure citeste_si_rezolva;
19 begin
20 fillchar (a, sizeof (a) ,0) ; fillchar ,O) ;
21 assign (input, 'maraton. in'); reset (input) i: readln(n',m);
22 for k:=l to m do begin
23 fillchar(sel, sizeof (sel) ,false) ;
24 for i:=l to n do read(a[i]);
25 rezolva;
26 end;
27 end;
28 procedure scrie;
29 begin
30 assign(output, 'maraton.out'); rewrite(output); ok:=true;
31 for i:=l to n do
32 if p[i]<>n+l then begin write(i); ok:=faTse; break; end;
33 for. i:=i+l to n do
34 if p[i]<>n+l then write ' ',i);
35 if ok then write( 'NU EXISTA'); writeln;
36 end;
37
38 begin citeste_si_rezolva; scrie; end.
1 #include <stdio. h>
2 #include <string. h>
3 int n,m,p[3005] ,a[3005] ,ok; char sel[3005];
4 void rezolva () {
5 int i, j , nr ;
6 for (i=O;i<n;i++) {
7 for (j=n,nr=O;j>O&&nr<=a[i];)
8 if (!sel[--j]) nr++;
9 sel[j]=l; if (p[j]==-l) p[j]=i;
10 else if (p[j]>i&&p[j]!=n) p[j]=i; elsep[j]=n;
11 }
12 }
13 void citeste_si_rezolva() {
14 int i,k;
15 mernset(a,O,sizeof(a)); mernset(p,-l,sizeof(p));
16 freopen( "maraton. in", "r", stdin); scanf("%d%d",&n, &m);
17 for (k=O;k<m;k++) {
18 mernset(sel,O,sizeof(sel));
19 for (i=O;i<n;i++) scanf("%d",a+i);
20 rezolva();}}
21
22 void scrieI)
23 int i;
24 freopen("maraton.out","w",stdout); ok=l;
25 for (i=O;i<n;i++)
26 if (p[i]!=n) {printf("%d",i+l); ok=O; break;
27 for (i++;i<n;i++)
28 if (p[i] !=n) printf(" %d",i+l);
29 if (ok) printf ("NU EXISTA");
30 putchar('\n'); }
31 void main ( )
32 { citeste_si_rezolva(); scrie(); }
170
!!!!!!!!!
4. (Prime ***) Se dau n::!:.9 numere prime distincte PI, P2, ..., P mai mici sau egale
dect k::!:.1.000.000.000. Se cere se determine cte numere naturale nenule mai
mici sau egale cu k sunt divizibile cel cu unul dintre numerele PI. P2, ..., pn.
Prima linie a de intrare prime.in n. Pe a doua linie sunt
scrise numerele PI. P2, ..., p., separate prin cte un iar pe a treia linie se
k. Se Pi x P2 X .. X Pn:S 2.000.000.000.
n de prime.out se va scrie numerelor naturale nenule mai
mici sau egale cu k, divizibile cu cel cu unul dintre numerele PI, P2, .., pn.
Exemplu: prime. in prime. out
2 10
3 5
23 (http://campion.edu.ro)
Solutie:
Se va folosi principiul includerii excluderii, cu care se poate determina cardinalul
reuniunii a mai multor de numere.
n 11
"
1 nArl
L IArnA)
19<j5n
= Liili
r"".1
'U
l=t"
IA.rn Aj
...
Se vor considera
Ai :;;::: {r>i '" qlq E Nt,])i '* q ::;.
va fi cardinalul reuniunii acestor Pentru
se vor folosi formulele:
l
k J .. l k. J . .: . l J;: J
IAil== - ,IAi A 4
r
l :::::-- ,IAiA AAll:::::. ... ,...
TJi . ... 1)1 '* Pj .: jJi '* jJj *1)1
iar pentru generarea tuturor se vor utiliza numere binare ce vor
reprezenta vectori caracteristici.
1 var n,i,j,nr:integer; k,rez,t:longint;
2 p:array[l. .10] of integer;
3
4 begin
5 assign(input, 'prime.in'); reset (input);
6 read(n);
7 for i:.=l .to n doread(p[i]); read(k);
8 for i:=l to (1 shl n)-l do begin
t:=k;nr:==O;
10 for j:=O'to n-1 do
11 ifei and (1 ish1 jO then begin t:=t div p[j+1]; inc(nr); end;
12 if odd(nr) then inc(rez,t) else dec(rez,t);
13 end;
14 assign(output, 'prime.out'); rewrite(output);
15 writeln(rez);
16 end.
171
freopen ("prime. out" , "w" , stdout) ;
printf("%ld\n",rez};
}
void main(} {
int i,j,nr; long t;
freopen ("prime. in" , "r" r stdin) ;
scanf (" %d" , &n) ;
for (i=O;i<n;i++) scanf("%d",p+i};
scanf ("%ld", &k);
for (i=l;iln};i++){
for (t=k,nr=j=O;j<n;j++)
if (i&(lj}) t/=(long}p[j],nr++;
if (nr%2==1) rez += t;
else rez -= t;
}
orar. out
1 #include <stdio. h>
2 int n , p [ 10]; long k, rez ;
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
5. (Orar - **) Un laborator vizitatori de la firmele interesate de utilizarea
aparaturii proprii doar ore pe zi, ntr-un interval fix de zile. Fiecare
trebuie determine propriul orar pentru utilizarea laboratorului exact ore
pe zi. Aceste ore pot fi n prima a zilei, n a doua sau n a
treia Orarul este fixat, de la nceput, pentru perioada celor N:s44 zile
trebuie respecte
- o ntr-o zi, a treia atunci este ca, n
zi selecteze prima
- prima poate fi numai n ziua a fost
perioada a treia;
Pentru un de zile N dat, un program care
de ntocmire a orarului. de intrare orar.in o
linie pe care se ntreg N, care de zile. de
orar.out va o linie pe care se va afla ntreg care
de de ntocmire a orarului.
Exemplu: orar. in I
4 5
(BOI,2001)
Solutie:
Se va construi o Nr(x), care de
pentru orar pentru x zile. Cum orice orar pe x-I zile poate fi transformat ntr-un
orar pe x zile alegnd perioada a doua, iar orice orar pe x-2 zile poate fi transformat
ntr-un orar pe x zile alegnd perioada a treia apoi prima, Nr(x) va ntoarce Nrix-
l)+Nr(x-2). Procedura se cnd se ajunge la unul din cazurile de
x=O sau x=l. Pentru a evita un mare de apeluri al proceduri cu
parametrii de mai multe ori (fiind total ineficient), se va folosi o
memoizare, care n stocarea rezultatului ntr-un vector de fiecare data cnd
se procedura cu parametri, iar cnd procedura este cu
parametrii care au mai fost deja, se preia rezultatul din vector, evitnd astfel calcule
inutile. O la apeluri recursive calcularea rezultatelor din vector
ntr-o ordine conduce la o rezolvare folosind metoda
dinamice.
exit; end;
function Nr(x:integer) :longint;
begin
if mem[x] <>-1 then begin Nr:=mem[x];
if (x=O)or(x=l) thenmem[x] :=1
else mem[x] :=Nr(x-1)+Nr(x-2);
Nr: =mem[x] ;
end;
1 var n,i:integer; mem:array[O .. 44] of longint;
2
3
4
5
6
7
8
9
10
11 begin \
12 assign',(input,' orar. in,') ; reset (input); readln (n) ;
13 for i:=O to n do mem[i] :=-1;
14, assign(output, 'orar.out'); rewrite(output);
15 writeln(Nr(n));
16 end.,.
#include <stdio.h>
int n; long mem[45];
long Nr(int x) {
if (mem[x] !=-1) return mem[x] ;
if (x==ollx==l) mem[x]=l;
else mem[x]=Nr(x-1)+Nr(x-2);
return mem[x] ;
}
1
2
3
4
5
6
7
8
9
10 void main ()
11 int i;
12 freopen (" orar. in" , "r" ,stdin); scanf ( "%d" ,&n) ;
13 for (i=O;i<=n;i++) mem[i]=-l;
14 freopen( "orar.out", "w", stdout);
15 printf("%lld\n", Nr(n)); }
6. (00 - ***) Fermierul Ion are o de unde cresc N:::;10.000
Ferma a fost n N sectoare, numerotate de la 1 la N, astfel nct
oricare sectoare avnd numere consecutive sunt adiacente (se unul
altul). n plus, primul ultimul sector sunt adiacente. n fiecare sector se cte
o iar aceasta depune un anumit de n fiecare zi. ce
depun fermierul Ion le adune, pentru a le mnca. Deoarece
fermierul este foarte lacom, de fiecare el alege sectoare adiacente din
care simultan. Din din cauza sale, din
sectoarele vecine cu cele alese se sperie devin violente, motiv pentru care
fermierul nu mai poate aduna din aceste sectoare.
maxim de pe care le poate aduna fermierul Ion, n urma strategiei sale
lacome.
173
!!!!!!!!!!!!!!
de intrare 00. pe prima .linie, desectoare n care este
ferma implicit, de Pe linie se
numere ntregi din intervalul [0,100], reprezentnd de depuse de
fiecare n ordinea sectoarelor n care se acestea.
n oo.out, maxim de pe care le poate aduna fermierul
Ion.
Exemplu:
oo.in oO.out
10 20
3 4 o 1 o 6 7 121
("Stelele informaticii". 2003,
Solutie:
Se construiesc trei tablouri unidimensionale (conceptual; practic, seva unul
singur):
Al - elementul de pe i maxim de adunate. n
sectorul i, se din primele sectoare, luate
Az - elementul de pe i adunate n
sectorul i, se din sectorul al doilea, cu cele.din al treilea
A3 - elementul de pe i maxim de adunate n
sectorul i, se din primul ultimul sector, luate
Evident, n primul caz nu se pot lua din ultimul sector etc..Valorile dinaceste
tablouri se pot calcula pe baza unor simple, ceea ce, la un
algoritm liniar. n final, se maximul dintre. aceste valori, determinate,
1 var n,i,j,k:integeri r-ez r LonqLnt :
2 oo:array[O .. 9999] of integeri a:array[O .. 9999] of longiriti
3
4 function max(a, b: longint) : Lonqi.n t :
5 begin
6 if a>b then max:=a
7 else max: =b
8 endi
9
10 begin
11 assign(input, 'oo.in') ireset(input)i read(n)i
12 for i:=O to n-1 doread(oo[i])
13 ifn=2then rez:=oo[O]+oo[l]
14 else
15 for k:=O to 1 do begin
16 a[k]: a[(k+1) mod n] : Oi
17 a[ (k+2) mod n] := oo[(k+l) mod n] + oo[ (k+2l mod n] i
18 i:=(k+3) mod ni
19 while A<>k
20 ali] :=rnax:(a[ (i-l+n) m::d n], a[ (i-3+n) m::d n]+oo[ (i-1+n) m::d n]+oo[i]) i
21 :=(i+1) mod ni endi
22 rez:=ma:x:(rez, a[(k-1+n) mod n llr
23 endi
24 assign(output, 'oo.out')irewrite(output);
25 writeln(rez); end.
174
!!!!!!!!!!!!
void main() {
int i,j,k;
freopen("oo.in", "r" ,stdin);
scanf("%d", &n);
for (i=O;i<n;i++) scanf("%d",oo+i);
if (n==2) rez = 00[0]+00[1];
else
for (k=O; k<2; k=(k+1)%n)
A[k] = O;
A[ (k+1)%n] = O;
A[(k+2)%n] = 00[(k+1)%n] + oo[(k+2)%n];
for (i=(k+3)%n; i!=k; i=(i+1)%n)
A[i] = max(A[(i-1+n)%n], A[(i-3+n)%n]+00[(i-1+n)%n]+00[i]);
= max(rez, A[(k-1+n)%n]) i}
freopen( "oo.out", "w", stdout) i printf ("%ld\n", rez) i
} .
1 #include <stdio. h>
2 int n,00[10000] ;long A[10000] ,reZi
3 long max(long a, long b) { return a > b ? a
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bi }
7. - ***) Ion s-a decis un nou pentru
oile sale. Terenul pe care Ion vrea este de
parcelat n n*m parcele este denivelat. Despre fiecare
se la nivelul normal sau este trebuie
o forma laturile paralele cu laturile terenului este
de patru n cele patru Cei patru pot fi n
numai n parcele nivelate. Pentru ar fi foarte important cte
posibile pentru dar el e de oi, cere
ajutorul vostru pentru a dreptunghiuri.
de intrare ciobanas.in pe prima linie numere ntregi n:::;250
m:::;2.000 separate printr-un singur care dimensiunile terenului.
Fiecare dintre nlinii cte m numere, separate prin care
pot avea valorile Opentru teren denivelat sau 1 pentru nivel normal.
de ciobanas.out trebuie o linie pe care se va afla
un singur reprezentnd de de amplasare.
Exemplu: ciobanas. in ciobanas. out
33
5
011
111
111
Solutie:
Pentru a determina dreptunghiurilor ce au in vrfuri parcele nivelate se vor
considera toate perechile de linii; pentru fiecare pereche se va determina
coloanelor ce valoarea l n ambele linii - pentru c astfel de coloane se vor
forma c*(c-l)l2 dreptunghiuri. Pentru a viteza de se va
matricea in numere de cte 8 astfel fiecare rnd in de 8;
cnd se iau rnduri va trebui aplicata AND pe rndurilor apoi
de 1.
175
1 var n,m,i,j,k:integer; nr:array[0 .. 255] of integer;
2 a:array[O .. 250,0 .. 250] of byte; rez,t:double;
3
4 procedure setbi t (i, j : integer) ;
5 begin A[i ,j div 8] : =A[i ,j div 8] or 1 shl (j mod 8); end;
6
7 begin
8 for i: =0 to 255 do begin
9 j: =i;
10 while j>O do begin
11 if j mod 2=1 then inc(nr[i]); j:=j div 2;
12 end;
13 end;
14 assign(input, 'ciobanas.in');reset(input); read(n,m);
15 for i:=O to n-1 do begin
16 for j:=O to m-1 do begin
17 read(k);
18 if k>O then setbit(i,j);
19 end;
20 for j:=O to i-1 do begin
21 t:=O;
22 for k:=(m div 8)+1 downto O do
23 t:=t+nr[a[i,k] and a[j,k]];
24 rez:=rez+t*(t-l)/2;
25 end;
26 end;
27 assign(output, 'ciobanas.out'); rewrite(output);
28 writeln(rez:O:O);
29 end.
1 #include <stdio.h>
2 #include <stdlib.h>
3 int n,m,nr[256]; unsigned char far A[252] [252]; double rez=O,t;
4
5 void set_bit (int i, int j) {A[i] [j /8] 1= 1(j%8); }
6
7 void main () {
8 int i, j, k;
9 for (i=0;i<256;i++)
10 for (j=i;j>0;j/=2) nr[i]+=j%2;
11 freopen("ciobanas.in","r",stdin);
12 scanf("%d %d",&n,&m);
13 for(i=O;i<n;i++) {
14 for(j=O;j<m;j++) {
15 scanf("%d",&k);
16 if (k) set_bit(i,j);}
17 for(j=O;j<i;j++) {
18 for(t=O, k=(m/8)+1;k>=0;k--)
19 t+=(double) nr[A[i] [k]&A[j] [k]];
20 rez+=t*(t-1)/2;
21 }}
22 freopen("ciobanas.out", "w",stdout);
23 printf("%.Olf\n",rez);
24 }
176
8. (Fotbal - ****) Ion se oile s-a gndit
diversifice EI a nceput un grup de oi fotbal vrea
aceste oi n echipe organizeze un meci ntre ele, dar pentru ca
meciul fie ct mai interesant el a impus ca echipele valori ct
mai apropiate posibil (deoarece meciul de fotbal e ntre oi, nu trebuie ca
de oi dintr-o fie egal cu de oi din dar fiecare oaie
care fotbal trebuie n una dintre echipe). vrea cte
astfel de ale oilor n echipe astfel nct de valoare
dintre echipe fie care este acea valoare.
de intrare fotbal.in pe prima linie, n:S;24 al oilor care
joace fotbal, iar pe a doua linie n numere ntregi, separate ntre ele prin
care valorile fotbalistice pentru fiecare oaie. Valoarea
a unei oi este un ntreg cuprins ntre 1 1000.
de. fotbal.out trebuie o linie pe care se vor afla
numere ntregi separate ntre ele printr-un singur Primul
care se poate ntre valorile celor echipe,
iar cel de-al doilea de n echipe ale oilor
astfel nct dintre valorile celor echipe fie
Exemplu: fotbal. in fotbal. out
4
1 2
1 2 4 6
!!!!!!!!!
177
function caut_binar{x:integer) :integer;
var st,dr,mij:integer;
begin
st:=l;dr:=nv+l;
while st<dr do begin
mij:={st+dr+l) div 2;
if v[mij]>x then dr:=mij-l else st:=mij;
end; caut_binar:=st;
end;
Solutie:
Se vor lua n considerare toate care se pot forma folosind primele
[nI2] oi se vor sorta n de valoarea a oilor care fac parte
dintr-o n continuare, se vor determina toate formate din
ultimele n - [n 1 2] oi. Pentru fiecare astfel de A, se va n lista
primelor (folosind acea B care are
valoarea cea mai de SI2-x, unde S este valoarea a
tuturor oilor, iar x este valoarea a oilor din A. Echipa
va fi prin reuniunea A B. valoarea
a echipei este mai de S/2 dect cea mai
anterior, atunci avem acum o o posibilitate
de a o este cu cea atunci se va

1 var n,s,nv,d,nr,i,j,p,t,st:integer;
2 a:array[l .. 24] of integer; v:array[l .. 4096] of integer;
3
4
5
6
7
8
9
10
11
12
abs Cint x) { x<O?-x:x; }
#include <stdiO.h>
n,a. [24] ,S, V[4096] ,nv,D=32000 ,Nr=O;
irit ca.ut_binar(irit x) {
int'st;dr,mij;
for! (st=O,dr=nv-l;st<dr;)
mij;::(st+dr+l)!2;
if (V[mij]>x) dr=mij-l; else st=mij;
}
12 return sti
13
14
15 void mai.n ()
16 int i,j,s,p,t;
17 freopen("fotbal.in", "r", stdin);
18 scanf("%d",&n);
19 for (i=O;i<n;i++) scanf("%d",a+i), S+=a[i];
20 for (i=0;i1(n!2 ;i++).{
21 for (s=j=0;j<n!2;j++)
22 if (i&(lj s+=a[j];
23 V[nv++]=s;}
24 for (i=O;i<nv;i++)
25 for (j=i+l;j<nv;j++)
26 if (V[i]>V[j]) t=V[i] ,V[i]=V[j] ,V[j]=t;
begin
a s s LqnLi.nput , .in.') ; reset (input) ; d: =32000;read(n) ;
for i:=l to n do begin read(a[i]); inc(st,a[i]); end;
16 for i:=O to 1 shl (n div 2)'-1 do begin
17 s:=O;
18 for j:,;,O to.n div 2-1 do
19 if i and{lshl jO then inc(s,a[j+l]);
2D inc(nv); v[nv] :=s;
21 end;
22 for. i:;::l to n do
23 for j:=i+l to n do
24 if v[i]>v[j] then begin
25 t: =v[i] ;v[i] : =v[j] ;v [j] :=t;
'26 end;
27 for i:::O to (1 shl (n-ndiv 2 ))-1 do begin
28 s:=O;
29 for j ;",0 .to n:-ndi'l/" 2-1 d()
30 if i .and (1 shl jO then Lnc t s i a In div 2+1+j]);
31 p:=caut_binar(st div 2-s);
32 t:=abs(2*s+2*v[p]-st);
33 ifd>t.then begin d:=t; Nr:=l; end
34 else
35 if d=t theri inc(nr);
36 end;
37 assign(output, 'fotbal.out') i rewrite(output);
38 writeln(d,' ',nr) i
39 end.
178
27 __ n/2));i++)
28 for (s=j=0;j<n-,n/2;j++)
29 if(i&(lj)) s+=a[n!2+j];

31 t=abs(2*s+2*V[p]-S);
32 if (D>t) D=t,Nr=l; else if (D==t) Nr++; }
33 freopen ( "fotbal. out" , "w" ,stdout) ;
34 printf("%d %d\n" ,D,Nr);
35 }
9. - **) Se o matrice cu linii coloane, ale
elemente pot avea fie valoarea 0, fie valoarea 1. O este o de elemente
care au valoarea O. elemente nvecinate (pe sau care au
ambele valoarea O, vor face parte din O o. care nu
elemente aflate pe prima linie, pe ultima linie, pe prima sau pe
ultima a matricei. n elementele din matricei trebuie scrise numere.
Toate elementele din trebuie valoare. Va trebuie
cel mai mic care poate reprezenta suma elementelor din oricare
dintre
de intrarengaurUn pe prima linie naturale m n
separate printr-un care dimensiunile matricei -. Pe fiecare dintre
m linii se un de n numere care pot fi Osau 1 care nu sunt
separate prin Aceste numere elementele matricei.
de gauri.out va cel mai mic care poate reprezenta
suma elementelor din oricare dintre matricei. Va exista ntotdeauna cel
o
Exemplu: gauri.in gauri. out
10aO 6
1110010101
1010111111
1010110001
1111110011
1000010111
1011111111
1011111111
1000000000
1111111111
Solutie:
Problema poate fi foarte u rezo1 prin folosirea unui simplu algoritm recursiv
de umplere. Cu ajutorul .acestuia.ise. vor putea determina toate zonele.
determinarea zonelor, se vor elimina cele care nu sunt cel un
element care se pe prima linie, prima ultima linie sau ultima
alegem cea mai mare Se pot eticheta elementele care
zonele folosind numere ntregi distincte. identificarea unei zone, se va
de elemente care o (dimensiunea sa) ntr-un vector. Se va
parcurge apoi prima linie, prima ultima linie ultima) se vor
179
int cmmdc{int a,int b) {
if (b==O) return a;
elae return cmmdc{b,a%b);
var n,m,t,i,j,rez:integer;
u:array[1. .100,1. .100] of integer; nr:array[1. .10000] of integer;
a:array[l .. 100] of string[100]; ok:array[O .. 10000] of boolean;
determina toate etichetele care apar. Pentru fiecare se va
"elimina" zona prin setarea dimensiunii sale la O. n final, se va
determina cel mai mic multiplu comun al care dimensiunile
zonelor.
void fill{int x,int y,int t) {
if (u[x] [y]) return;
u[x] [y]=t; nr[t]++;
if (x+1<n&&a[x+1] [y]=='O') fill{x+1,y,t);
if (x-1>=0&&a[x-1] [y]=='O') fill{x-1,y,t);
if (y+1<m&&a[x] [y+1]=='0') fill{x,y+1,t);
if (y-1>=0&&a [x] [y-1] ==' O') fill (x, y-1 ,t) ;
}
procedure fill{x,y,t:integer);
begin
if u[x,y]<>O then exit;
u[x,y] :=tj inc{nr[t]);
if (x+1<=n)and{a[x+1,y]='O') then fill{x+1,y,t);
if (x-1>0)and{a[x-1,y]='0') then fill{x-1,y,t);
if (y+1<=m)and{a[x,y+1]='0') then fill{x,y+1,t)j
if (y-1>0)and{a[x,y-1]='0') then fill{x,y-1,t);
end;
1 #include <stdio.h>
2 int n,m,t,rez=1,u[100] [100],nr[10000]; char a[102] [102],ok[10000];
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 function cmmdc{a,b:integer) :integer;
16 begin if b=O then cmmdc:=a else cmmdc:=cmmdc{b,a mod b) end;
17 begin
18 assign{input, 'gauri-in' l; reset{input);
19 readln{n,m);
20 for i:=l to n do readln{a[i]);
21 for i:=l to n do
22 for j:=l to m do
23 if (u[i,j]=O)and{a[i,j]='O') then begin inc{t); fill{i,j,t) j
24 end;
25 for i:=l to n do begin ok[u[i,l]]:=true; ok[u[i,m]]:=truej endj
26 for i:=l to m do begin ok[u[l,i]] :=true; ok[u[n,i]] :=truej end;
27 rez:=l;
28 for i:=l to t do
29 if not ok[i] then rez:=rez*nr[i] div cmmdc{rez,nr[i]);
30 assign{output, 'gauri.out');rewrite{output)j
31 writeln{rez); end.
180
!!!!!!!!!
procedure gen(x:longint);
var i:longint;
begin
for i:=O to n-1 do bei] :=a[i] xor a[(i+x) mod n];
for i:=O to n-1 do ari] :=b[i];
end;
17 void main() {
18 int i,j;
19 freopen ( "gauri. in" , "r" ,stdin) ;
20 seanf ( " %d %d\n", &n, &m) ;
21 for (i=O;i<n;i++) fgets(a[i],m+2,stdin);
22 for (i=O;i<n;i++)
23 for (j=O;j<m;j++)
24 if (lu[i][j]&&a[i][j]=='O') fill(i,j,++t);
25 for (i=O;i<n;i++) ok[u[i] [O]]=ok[u[i] [m-1]]=1;
26 for (i=O;i<m;i++) ok[u[O] [il ]=ok[u[n-1] [il ]=1;
27 for (i=l;i<=t;i++) if (!ok[i]) rez=rez*nr[i]/emmde(rez,nr[i]);
28 freopen( "gauri .out", "w", stdout);
29 printf("%d\n",rez);
30 }
10. ***) ntr-un castel sunt N::;10.000 numerotate de la 1 la N.
Fiecare poate fi ori La fiecare lampa cu i
starea lampa cu i+l este cu N care
starea lampa cu 1 este Dndu-se starea a
se determine starea M::;1.000.000.000 secunde.
de intrare lampi.in pe prima linie, numerele M. N
linii starea a lor, Osemnificnd lampa este
iar 1 este
de lampi.out va N linii reprezentnd starea M
secunde.
Exemplu: lampi. in lampi. out
31
0
O 1
O 1
1
Solutie:
Se cu A[i, 1] starea i la timpul T. Se presupune pentru k este
A[i, T+2
k
] =A[i, TJ XOR A[i + 2\ 1] (se numerele sunt
n cerc, se iau resturile indicilor la N) se pentru k+1.
A[i, T + 2
k
+
1
] =A[i, T+ 2
k
+ 2
k
] = A[i,T+ 2] XORA[i + 2\ T+ 2
k
] =
(A[i,TJ XORA[i + 2\ TJ) XOR (A[i + 2\ TJ XORA[i + 2
k
+I, TJ ) =
A[i,TJ XOR A[i + 2
k
+
1
,TJ
pentru a afla starea M secunde se fac repetat salturi cu puteri ale lui 2,
ct mai mari.
1 var n,m,i,p:longint; a,b:array[O .. 9999] of byte;
2
3
4
5
6
7
8
181
!!!!!!!!
9 begin
10 assign(input, 'lampi.in'); reset(input); readln(n,m);
11 for i:=O to n-l do read(a[i]);
12 while m>O do begin
13 p:=l; while p<=m do p:=p*2; p:=p div 2;
14 gen(p); m:=m-p;
15 end;
16 assign(output, 'lampi.out'); rewrite(output);
17 for i:=O to n-1 do writeln(a[i]);
18 end.
1 #include <stdio.h>
2 long n,m; char a[10000],b[10000];
3 void gen(long x ) {
4 long i;
for (i=O;i<n;i++) b[i]=a[i]fta[(i+x)%n];
for a[i]=b[i];
}
v"id .. rnain ( )
1 longi,p;
11 freopen(" lampi. in", "r", stdin); scanf ("%ld Ud", &n, &m) ;
12' for (i=O;i<n;i++) scanf("%d",a+i);
13 while ,(m>O) {
14 for (p=1;p<=m;p*=2) ;p/=2;
15 gen(p) m-=p
16 }
17 freopen (" lampi. out" , "w" ,stdout) ;
18 for (i=O;i<n;i++) printf("%d\n",a[i]);
19 }
11. - **) Gheorghe a dat peste o de la care
are nevoie de un pic de ajutor! Dndu-se un de N=SS.OOO numere naturale,
lungimea a unei care un strict iar
acest toate numere din o nu o
astfel.de va fi-l.
Pe prima linie a de intrare se N, lungimea Pe a doua linie
se Nnumere ntregi, propriu zis. Elementele sunt numere ntregi
din intervalul [0,2.000.000.000].
Pe prima linie a de se cerut.
Exemplu: secv.in secv.out
8 7
213213 5
(http://infoarena.devnet.ro)
Solutie:
trebuie toate elementele din original n ordine
primul pas este de a forma acest C. Avnd acest se parcurge
vectorul pentru a de start a noii subsecvente. ce s-a o
de start s,se C avnd ca de start
s. Din toate aceste se alege pe aceea cu lungimea
182
!!!!!!!!!!
yarIl,ffi/rez, i ,j, k,x: longint;
V" t,(c:arraY[l ..5000] of longint;
beg-iri
assign(input, 'secv.in' );reset (Lnput j:
readln(n); rei:=lOOOOOOOOO;
for i tondo,beg-in read(v[i]); tril :=v[i]; end;
for i:=ito n do
for j:=i+ ton do
if t[i]>t[j] then beg-in x:=t[:L] ;t[i] :=t[j] ;t[j] :=x; end;
10 c I L] :=t[i] ;m:=i;
11 for i :.::2,.to. n do
12 if t[.i] then beg-in inc (m) ;c[m] : =t [il ; end;
13 for i:=n downto ido bag-in
14 if v[i] [m]t:haribegin
15 k:=i;
16 for j:=m-i downto 1 do beg-in
17 while (k>O)and(v[k]<>c[j]) do dec(k);
18 if\ (k<=O), then break; end;
19 if (k>O)and(rez>i-k+i) then rez:=i-k+i;
20 end;
21 end;
22 assign(output,'secv.out'}; rewrite(output);
23 if rez=lOOOOOOOOO thenwriteln('-i} else.writeln(rez};
24 end.
#include <stdio.h>
longn,m;v[5000L t [5000 L c [5000] ,rez=lOOOOOOOOO;
void main(}
long- i,j, k , x:
f r-eoperi " secv. in" , "r" ,stdin) ;
l;;canf (;"%ld"i &n)<;
. for (i=O;i<n;++) { sca.nf("%ld",v+i}; t[i]=v[i]; }
for (i=O;i<n; i++}
9 for (j=i+i;j<n;j++)
10 if (t[i]>t[j]) x=t[i],t[i]=t[j],t[j]=x;
11 c[O]=t[O];m=l;
12 for (i=i;i<n;i++)
13 if (t[i] !=t[i-i]) c[m++]=t[i];
14 for (i=n-i;i>=O;i--) {
15 if (v[i] ==c [m-i]) {
16 for(k=i,j=m-2;j>=0;j--} {
17 while(k>=O && v[k] !=c[j]) k--;
18 if (k<O) break; }
19 if (j==-i && rez>i-k+i) rez=i-k+i;
20 }}
21 freopen (" secv.ollt ", ":,,", stdout) ;
22 printf("%ld\n",rez==lOOOOOOOOO?-l:rez};
23 }
12. (Farfurii. ***) n fiecare zi, este obligat de Eugenia spele farfuriile
tacmurile fiecare ce le el trebuie le aranjeze pe
rafturi, farfuriile pe primul tacmurile pe al doilea... dar nu oricum! El are
N::;IO.OOO farfurii de distincte, cuprinse ntre 1 N K::;N*(N-l )/2
183
farfurii. out
1 2 5 7 643
(http://infoarena.devnet.ro)
farfurii. in
tacmuri identice. Pentru fiecare pereche de farfurii n raft astfel nct
farfuria de mai mare, dintre cele apare naintea farfuriei de
mai pune un tacm pe rndul al doilea.
pe toate farfuriile pe primul raft astfel nct toate
tacmurile pe al doilea raft. Dintre toate le posibile, pe aceea
minim din punct de vedere al O (A},A
2
. A
N
) este
mai din punct de vedere lexicografic dect o (B
1,B2
...B
N
)
o pozitie p astfel incat Ap<Bpsi A
1=B1,A2=B2
, . ,Ap-1=Bp- 1
Pe prima linie din de intrare farfurii.in se numerele naturale N K.
Pe prima linie din de farfurii.out se vor N numere distincte ntre
1 N reprezentnd farfuriilor, n ordinea n care au fost pe
raft.
Exemplu:
7 8
Solutie:
O rezolvare se pe
"O permutare de lungime i are cel mult i*(i-l)12 inversiuni cnd numerele sunt n
ordine
Astfel, K e de forma M*(M-l)12 permutarea minim cu K
inversiuni va fi 1, 2, 3, ... N-M, N, N-l, N-2, ... N-M+l. Cele K inversiuni apar n
ultimele M elemente. n permutare se un element N-x imediat
naintea lui N de inversiuni scade cu x. Astfel, K>M*(M-l)12 se
permutarea: 1, 2, 3, ... N-M-l, N, N-l, N-2, ... N-M (care are
(M+l)*MI2 inversiuni) se elementul N-((M+l)*MI2-K) imediat naintea lui
N, astfel se scade de inversiuni la K. Este evident permutarea astfel
este minim
1 var n,k,i,m,p:longint;
2 begin
3 assign(input, 'farfurii.in'); reset(input);
4 readln (n, k) ;
5 assign(output, , farfuriLout');
6 rewrite (output) ;
7 p:=l;
8 while p-eri do p:=p*2;
9 m:=O;
10 while p>O do begin
11 if (m+p<=n)and((m+p)*(m+p-1)<=2*k) then m:=m+p;
12 p:=p div 2;
13 end;
14 k:=k-m*(m-1) div 2;
15 if k=O then begin
J6 for i:=l to n-m do write(i,' ');
17 for i:=n downto n-m+1 do write(i,' ');
18 writeln;
19 end
184
!!!!!!!!!
20 else begin
21 k:=m-ki inc{m)i
22 for i:=l to n-m do write{i,' 'li
23 write{n-k, , 'li
24 for i:=n downto n-k+1 do write{i,' 'li
25 for i:=n-k-1 downto n-m+1 do write{i,' 'li
26 writelni
27 end
28 end.
1 #include <stdio. h>
2 long n i k ,
3 void main () {
4 long i,m,pi
5 freopen (" farfurii. in" , "r" ,stdin) i
6 freopen{"farfurii.out","w" ,stdout) i
7 scanf{"%ld %ld",&n,&k)i
8 for \!p=liP<niP*=2) i
9 for (m=OiP>OiP/=2)
10 if (m+p<=n && (m+p)* (m+p-1)<=2*k) m+=Pi
11 k -= m*{m-1)/2i
12 if (!k) {
13 for (1=lii<=n-mii++) printf{"%ld ",i) i
14 for (i=nii>n-mii--) printf{"%ld ",i) i
15 putchar{'\n') i }
16 else {
17 k=m-ki m++i
18 for (i=lii<=n-mii++) printf{"%ld ",i) i
19 printf{"%ld ",n-k)i
20 for (i=nii>n-kii--) printf{"%ld ",i)i
21 for (i=n-k-1ii>n-mii--) printf{"%ld ",i) i
22 putchar { , vn ' )i
23 }
24 }
13. (Perechi **) Se un ntreg strict pozitiv N5.2
31
Trebuie
cte perechi de numere ntregi strict pozitive au cel mai mic multiplu
comun egal cu N. Perechile (a,b) (b,a) se identice.
n de intrare perechi.in se afla N.
n de perechi.out determinat.
Exemplu: perechi. in perechi. ou t
12 8
(http://infoarena.devnet.ro)
Solutie:
Se va factoriza N; din celui mai mare multiplu comun a
numere, se iau toate numerele prime din factorizare la puterea cea mai mare dintre
cele la care apar. Astfel, pentru fiecare prin din N, acesta apare la
exponentul e se exponentul primului este e, iar al
celuilalt <e, primul exponentul <e al doilea e, ca
ambii sunt e; astfel se rezultatul cu 2*e+1. astfel se
perechile (a,b) (b,a), rezultatul total se cu o unitate se mparte la 2.
185
!!!!!!!!
1 var n,i,j,rez:longint;
2 begin
3 assign(input, 'perechi-in'); reset(input);
4 read(n);
5 i :=2;
6 rez:=l;
7 while i*i<=n do begin
8 j:=O; while n mod i=O do begin n:=n div i; inc(j); end;
9 if j>O then rez:=rez* (2*j+1);
10 inc (i) ;
11 end;
12 if n>l then rez:=rez*3;
13 assign(output, 'perechi.out'); rewrite(output);
14 writeln((rez+1) div 2);
15 end.
1 #include <stdio.h>
2 long n , rez=l;
3 void main () {
4 long i, j;
5 freopen ("perechi. in" , "r" ,stdin) ;
6 scanf("%d", &n);
7 for (i=2;i*i<=n;i++) {
8 for (j=O;n%i==O;n/=i,j++);
9 if (j>O) rez*=(2*j+1);
10 }
11 if (n>l) rez*=3;
12 freopen ("perechi. out" , "w" ,stdout) ;
13 printf("%ld\n",(rez+1)/2);
14 }
14. (Flip - ***) Gigel a descoperit un nou joc pe care l-a numit "Flip".Acesta se
joaca pe o de dimensiuni N*M (l::;N;M::;16) care
numere ntregi. Fiecare linie fiecare are un comutator care
starea tuturor elementelor de pe acea linie c;u71 ..$coPlll
jocului .. este ca, pentru a tablei. de joc, ..se.
liniilor coloanelor astfel nct se o cusuma
mare.
Prima linie a numerentregi cte
un care dimensiunea tablei. N linii cte.. M
numere ntregi separate prin cte un care descriu tablei de joc.
Tabladejoc contine numere intregi din intervalul [-1.000.000,1.000.000].
Prima linie a jlip.out un care va reprezenta suma
pe care Gigel o poate comutnd liniile coloanele tablei de joc.
Exemplu: flip. in flip, .out
5 3 28
4 -2 2
3 -1 5
2 O -3
4 1 -3
5 -3 2
186
Solutie:
n a genera de comutatoare de pe prima linie a tabloului.
n acest mod, pe fiecare linie se va alege se sau nu linia, n de
modul n care se mai mare. Dintre toate aceste variante de se
va aceea cu suma
1 var n,m,i,j,k,s,t,smax:longint;
2 a:array[1. .16,1. .16] of longint;
3 begin
4 assign (input, 'flip. in') ; reset (input); readln (n,m) ;
5 for i: =1 to n do
6 for j:=1 to m do read(a[i,j]);
7 for i:=O to (1 shl m)-1 do begin
8 s :=0;
9 for k: =1 to n do begin
10 t:"'-O;
11 for j:=1 to m do
12 if i and(1 shl (j-1))>0 then inc(t,-a[k,j)) else inc(t,a[k,j));
13 if t<-t then inc(s,-t) else inc(s,t);
14 end;
15 if smax<sthen smax:=s;
16 end;
17 assign(output, 'flip.out'); rewrite(output);
18 writeln(smax);
19 end.
1 #include <stdio.h>
2 long n,m,a[16] [16] ,smax;
3 void main () {
4 long i, j , k , s , t;
5 freopen("flip.in","r",stdin);
6 scanf ( "%lld %lld", &n, &m) ;
7 for (i=O;i<n;i++)
8 for (j=O;j<m;j++) scanf("%lld",a[i]+j);
9 for (i=O;iIm) ;i++) {
10 s=O;
11 for (k=O;k<n;k++) {
12 for (t=j=O;j<m;j++)
13 if (i&(Ij)) t+=-a[k] [j]; else t+=a[k] [j];
14 s+=t<-t? -t : t;
15 }
16 if (smax<s) smax=s;
17 }
18 freopen (" flip. out" , "w" ,stdout); printf (" %lld\n" ,smax) ;
19 }
15. (Numere Prime ***) Se un natural N::::;100.000. se genereze toate
numerele prime mai mici sau egale cu N.
Prima linie a nrprime. in ntreg N.
Prima linie a nrprime.out va numerele prime mai mici sau egale
cu N, cte unul pe o linie.
187
Exemplu:
10
nrprime.in
2
3
5
7
nrprime. out
Solutie:
O este folosirea ciurului lui Eratostene. n continuare se va prezenta
o mai dect ciurul lui Eratostene. Se va construi o
care va determina pentru un n dat, un vector Ali] care va fi On
caz i este prim sau cel mai mare factor prim al lui i, n caz contrar. Aceasta se va
apela recursiv pentru nl2 va determina folosind rezultatele anterioare vectorul A.
dimensiunii datelor se vor folosi compilatoarele FreePascal sau GCC.
1 var n,i:integer; a,urm:array[0 .. 100000] of integer;
2
3 procedure gen{n:integer);
4 var i, j : integer;
5 begin
6 if n<=l then exit;
7 for i:=O to n do urm[i] :=0;
8 if n=2 then begin urm[O] :=2; urm[2] :=-1; exit; end;
9 if n=3 then begin urm[O] :=2;urm[2] :=3;urm[3] :=-1; exit; end;
10 gen(n div 2);
11 a[l] :=1;
12 for i:=2 to n do begin
13 j:=a[i];
14 while (j<>-l)and{i*j<=n) do begin
15 a[i*j]:=j;
16 j:=urm[j];
17 end;
18 end;
19 j:=O;
20 for i:=l to n do
21 if a[i]=O then begin urm[j] :=i; j:=i; end;
22 urm[j] :=-1;
23 end;
24
25 begin
26 assign{input, 'nrprime.in'); reset(input);
27 read{n); gen{n);
28 i : =urm[ O] ;
29 assign{output, 'nrprime.out'); rewrite(output);
30 while i<>-l do begin
31 writeln(i); i:=urm[i];
32 end;
33 end.
1 #include <stdio. h>
2 int n, urm[100001], a[lOOOOl];
3 void gen (int n) {
4 int i, j;
.5 if (n<=l) return;
188
!!!!!!!
for (i=O,i<=n,i++) urm[i]=O,
if (n==2) { urm[O]=2, urm[2]=-l, return, }
if (n==3) { urm[O]=2; urm[2]=3; urm[3]=-1; return; }
gen(n/2),
for (a[1]=1,i=2;i<=n,i++) {
j=a[i] ;
while (j!=-l&&i*j<=n) {a[i*j]=j; j=urm[j]; }
}
for (j=O,i=l,i<=n;i++)
if (!a[i]) urm[j] =i, j=i;
urm[j ] =-1; }
6
7
8
9
10
11
12
13
14
15
16
17
18 void main() {
19 int i,
20 freopen("nrprime.in", "r" ,stdin), scanf("%d" ,&n);
21 gen(n),
22 freopen ("nrprime. out" , "w" ,stdout) ,
23 for (i=urm[O],i!=-1;i=urm[i])
24 printf ("%d\n", i) ,
25 }
2.3.2 Probleme propuse
1. (Cuvinte ****) Doi prieteni, Marius Andrei, s-au gndit la un joc. Marius
scrie, pe o foaie, un de N5200 numere. Sub fiecare el scrie cte o
sub primul litera A, sub al doilea litera B, tot n ordine
Marius Andrei folosesc un alfabet cu cteva mii de litere, cunoscut
numai de ei care ncepe cu literele de la A la Z. Literele sunt deci folosite ca
indici pentru numerele din Andrei apoi toate "cuvintele" posibile care
un cuvnt un de litere, ordonat
lexicografic; numerele din literelor dintr-un cuvnt scrise n
ordinea de acestea, sunt n ordine strict De exemplu, pentru 2
1 3 5 4,scriinddedesubt literele ABCDE, cteva dintre cuvintele valide sunt AC,
ACD, ACE, AD, BEetc., dar AB, ED sau BDE nu sunt cuvinte valide. Apoi,
Andrei alege dintre aceste cuvinte, pe cele de lungime le scrie n ordine
Pentru exemplul de mai sus, acestea sunt ACD, ACE, BCD BCE.
Dintre aceste cuvinte de lungime el i-l spune lui Marius pe al K-lea
(K:52.000.000.000) n ordine Andrei spune corect repede)
cuvntul acesta, el jocul l pierde n caz contrar. Andrei
ntotdeauna era foarte mndru de el, ntr-o zi, cnd Marius i-a scris un
de 67 de numere... I-ar fi fost cam greu lui Andrei tot ce de obicei,
s-a gndit scrie un program care dea direct rezultatul. un
program care cuvntul cerut l pe Andrei jocul.
de intrare cuvinte. in pe prima linie, numere N K, separate
printr-un reprezentnd de numere din respectiv de
ordine al cuvntului cerut. Pe a doua linie se N numere ntregi separate prin
cte un numerele scrise de Marius pe foaie. Numerele din sunt ntregi,
cuprinse ntre O 10000 inclusiv.
189
!!!!!!!
n cuvinte. out se va scrie cuvntul cerut.' Deoarece nu se cunosc literele
care Z n alfabetul celor doi, n locul literelor cuvntului se vor scrie
numerele de ordine ale acestora n alfabet, separate prin cte un Astfel; de
exemplu, cuvntul ACZ ar fi scris ca 1 3 26. Deci, n se vor scrie, separate
printr-un numere ntregi care numerele de ordine n. ale
literelor celui mai lung cuvnt cu de ordine K, format regulile din

Exemplu: cuvinte.in cuvinte. out
5 3 234
21354
("Stelele informaticii" 2003,
2. (Aliniere - ***) Un grup de n elfi stau nlinie n
lor. Acesta nu e de ceea ce. vede; nu sunt
n ordinea cere ctorva din rnd, astfel
ca cei schimba locurile, doar apropiindu-se unul de altul (pentru a
nu mari ntre ei), formeze un n care fiecare vede
privind de-a lungul cel una din (stnga sau dreapta). Un
vede. o-extremitate ntre el respectiv nu un alt
cu mai mare sau cu a lui. trebuie determinat
minim de care trebuie astfel nct
respecte de
Prima linie a de intrare aliniere. in din
din- este cuprins ntre 2 1000.: /Fiecare dintre
n. linii va unui Aceste linii vor
respecta a sunt
numere reale, cucel mult 5 zecimale, cuprinse ntre 1 10.
de aliniere. out trebuie pe prima linie,
care trebuie Pe fiecare dintre k linii se
va afla de ordine al unui care Aceste
numere vor fi scrise n ordine mai multe va putea fi
oricare dintre ele.
Exemplu: aliniere: in aliniere. out
8 4
1. 86
1. 86
1.30621 7
2 8
1.4
1
1. 97
2.2
3. (Munte- ***) Un are aspect de munte. o k; astfel nct
CI :::; C2':::; ... :::; Ck Ck?.ck+I ?: ... ?: cmundecI, ... ,C
n
sunt cifrele
se un se determine minim.de cifre care. trebuie eliminate astfel
nct aspect de munte.
190
munte. out
de intrare munte.in. o linie, pe care se dat.
va cel mult 5000 de cifre. Cifrele sunt nenule.
de munte.out va o linie, pe care seva. afla
minim al cifrelor care trebuie eliminate.
Exemplu: munte.in
248793
4. -****) Lui i plac la nebunie jocurile de dar, are
doar 4 ani, pierde de fiecare cnd cu prietenii mai mari.
aranjarea n e o pentru el. Cnd o la
trebuie aranjeze pe grupe astfel nct din
culoare, iar apoi trebuie ordoneze din fiecare
valoare, astfel nct cartea cu cea mai valoare fie ct.mai la
stnga. ce-i mai trebuie permanent toate

aranjeze ct mai rapid posibil,


minim de O mutare n plasarea unei pe o un
program care determine minim de.
aranjeze din
de intrare carti.in pe prima linie, numere natunl.le.C:::;6
(reprezentnd de culori din jocul de N:::;l.OOO (reprezentnd
de de culoare), separate printr-un Fiecare dintre
C*N linii o pereche de numere naturale x y, separate printr-
un reprezentnd culoarea (x). .valoarea (y) pe care le-atras
n ordinea extragerii. Oricare extrase de sunt distincte.
de carti.out o linie, pe care se minim de
pe care trebuie le pentru a aranja toate
Exemplu: carti.in carti. out
32
2
3 2
2 2
1 1
3 1
2 1
1 2
(http://campion.edu.ro)
5. (Grupuri - **) Se N numerentregieare trebuie repartizate n p
grupuri. Grupurile sunt identificate prin numere naturale cuprinse ntre 1 p.
Repartizarea n grupuri trebuie se realizeze.. astfel. nct suma numerelor din
oricare grup i fie cu total de numere care fac parte din
grupurile identificate prin numere cuprinse ntre i p.
Prima linie a de intrare grupuri.in N:::;1.000 al valorilor
care trebuie repartizate n grupuri. Cea de-a doua linie va cele N numere
(cuprinse ntre 1 1.000), separate prin cte un
191
!!!!!!!!!!!
de grupuri. out trebuie un de linii egal cu
grupurilor. Prima linie corespunde primului grup, a doua linie celui de-al doilea
grup etc. Linia unui grup va numerele care fac. parte..din
grupul respectiv, separate prin cte un grupurilor nu este cunoscut;
el va trebui determinat de program. Fiecare grup va cel un
mai multe va fi doar una dintre ele;
va exista ntotdeauna cel o
Exemplu: grupuri. in grupuri. out
6
2 4
4 10 3 9 2 3 3 9
10
3
6. (Cifre - ***) Se un natural k cifre distincte ntre care se
cu cifra O. se determine un multiplu al lui n care numai
cifrele date, fiecare dintre' ele fiind cel o n acest multiplu.
Prima linie a de intrare cifre.in valoarea Cea de-a doua
linie a cifrele, neseparate prin de cifre. out va
o linie pe care se va afla multiplul determinat.
Exemplu: cifre. out cifre. out
11 1210
012
192
!!!!!!!!!!
7. (Divizori ****) Pentru un dat, determine cel mai mic
natural care are exact n divizori. de intrare de intrare divizori.in pe
prima linie, n al divizorilor pe care trebuie i
de divizari. out trebuie o linie, pe care se va afla
cel mai mic natural care are exact n divizori.
8. (Sume - ***) Pe o se 00 pe fiecare dintre este
scris un natural cuprins ntre O 1.000. De pe pot fi alese oricte
alegere se suma numerelor de pe alese. Va
trebui sumelor distincte care pot fi prin astfel de
alegeri.
Prima linie a de intrare sume.in n al Cea
de-a doua linie a cele n numere scrise pe separate prin

de sume. out va sumelor distincte care pot fi

Exemplu: sume. in sume. ou t
5 11
01234
divizori. out
divizori.in Exemplu:
6
9. (Puteri - *) Elfilor le place de multe ori un cu el
Este ceea ce noi numim acum ridicare la putere. Ei pornesc de obicei de la un
mic se ct de mare poate ajunge prin
succesive.
de intrare puteri.in linii. Pe prima linie se un
aS;I.OOO, iar pe cea de-a doua se un nS;I.OOO.
de puteri. out trebuie o linie pe care se va afla
prin a cu el de un anumit (n) de
ori (este ceea ce noi numim a").
Exemplu: puteri. in puteri.out
3 282429536481
24
10. (Puncte - ***) Se nS;IO.OOO puncte n plan. se determine
de a alege trei dintre aceste puncte, astfel nct aria triunghiului
determinat deacestea fie un ntreg.
de intrare puncte.in pe prima linie, n al punctelor din
plan. Fiecare dintre n linii va cte numere, separate prin
reprezentnd coordonatele unui punct. Coordonatele punctelor sunt numere
ntregi cuprinse'ntre O 1000. Aria triunghiului determinat de trei puncte coliniare
este a fi O.
de puncte. out va o linie pe care se va afla
de a alege trei dintre puncte, astfel nct aria triunghiului determinat
de acestea fie un ntreg.
Exemplu: puncte. in puncte.out
4 4
o o
o 2
2 2
2 o
11. (Laser - **) n anul 2457, n provincia Etram de pe planeta Marte au avut mai
multe explozii nucleare. Locuitorii planetei o tehnologie cu ajutorul pot
mpiedica particulelor radioactive care sunt capabile toate
formele de de pe Tehnologia lor se pe unde de tip
LASER care, transmise din punct pe diferite, distrug toate
particulele radioactive care se ntre ele sau le Locuitorii planetei
au ales un loc la marginea provinciei, unde au instalat un dispozitiv bazat pe
tehnologia anterior. Dispozitivul este montat n punctul de coordonate
(O, O). faptului locuitorii planetei doresc ca cele raze fie ct mai
apropiate posibil astfel nct nu existe pericolul particulelor
radioactive pe planeta, unghiul minim pe care undele
LASER l pot forma.
de intrare laser. in nS;10.000 al punctelor n care au avut
loc explozii nucleare. Pe fiecare dintre n linii se cte numere,
separate printr-un singur care coordonatele punctelor n care au
193
13. - ***) Se o de patru
puncte necoplanare din alte N::; 100.000 puncte din determine
cte dintre aceste N puncte se n interiorul piramidei. Un punct este considerat
a fi n interiorul piramidei chiar se. pe una dintre cele patru pe una
dintre cele muchii sau este unul dintre cele patru vrfuri ale piramidei.
Primele patru linii ale de intrare. piramida.in cte trei numere
ntregi reprezentnd coordonatele vrfurilor piramidei. linie
N al celorlalte puncte. Fiecare dintre N va cte trei
194
laser. out
36.87
12. (Mine de aur.- **) Elmer.Fud Pig sunt prieteni de foarte mult timp
au decis aur. Ei au sape mai multe, mine,
din care pot extrage aur n foarte. mari s-au. se asocieze
intre n afaceri cu aur. La un moment dat, cnd treburile mergeau bine, .. ei s-au
certat au decis minele afacerile n A fost
afacerile, dar mine lor a devenit o deparecy. doresc
gard liniar de fiecare parte a gardului se un
egal de mine. Elmer Porky la ajutorul vostru pentru. a lespu
l1y.unde

gardul.
de intrare aur. in pe. prima linie un singur n::;30.000, care
de mine care trebuie dintre cei doi. Fiecare a
i-a linie dintre 2*n linii cte 2 numere, separate ntre ele printr-
un singur care coordonatele unei mine. Coordonatele mine lor
sunt numere ntregi cuprinse ntre 1 1000.
de aur. out trebuie pe o linie, trei numere a, b c
separate ntre ele prin care dreptei de
a*x+b*y+c =O, care are de o parte sau pe ea n mine de parte sau pe ea
celelalte n mine. a, b c vor fi cu 8 zecimale exacte.
Exemplu: aur. in aur. out
2 3.00000000 -2.00000000 -3.00000000
1 2
2 2
3 1
3 2
avut loc explozii nucleare relative la locul n care a fost montat dispozitivul.
Coordonatele punctelor sunt numere ntregi cuprinse ntre 1000.
de laser. out trebuie o linie,pe care se va afla un
singur care valoarea unghiului minim care poate fi format de cele
raze laser ale dispozitivului. Unghiul va fi scris n grade, cu zecimale
exacte. Se unei
Exemplu: laser. in
4
2 1
1 1
2 4
4 3
195
perechi.out
piramida. out
7
1 4
2 3
5 6
7 8
9 10
11 14
12 13
1
14. (Jlerefhi - **): un natural, nS;2.500 trebuie formate ct
mai lTIulte din care trebuie parte l1umere cuprinse ntre 1 2n,
astfel nct numere din oricare dintre perechi fie
prin;. poate parte din cel rnult.o pereche.
perechi.in. o liniepe care se valoarea n.
Prima, linie perechi.out va k al perechilor
k linii va cte numere cuprinse
ntrel celor numere este prim.
Perechile pot fi scrise n orice ordine.
Exemplu: perechi. in
7
rlumerentregi reprezentnd coordonatele unui-punct. Coordonatele punctelor sunt
numere cuprinse ntre O 255.
de piramida.out o linie pe care se va afla
punctelor din interiorul piramidei.
Exemplu: piramida. in
O 00
O O 10,0
O 100 O
100 O O
2
100 100 100
11 1
n cerc de la
lIann :90piii joc: jocul ncepe de la primul
copil (cel al ordine estel); la fiecare al i-Iea pas al jocului se
i copii este eliminat copilul la care: se ajunge; la
pasul ncepe de .la copilul care cel eliminat.
este suficient de mare, la primul pas este eliminat al
doilea .copil, pas al patrulea, la al treilea pas al apoi la al
patrulea pas al unsprezecelea mai departe. Va trebui ordinea n
Cart vor.fi
d
t
pe prima linie un ntreg n, care
de copii:
de or1ine.out trebuie o linie pecare se vor afla n
numere distincte cuprinse ntre1 . n care numerele de ordine ale
copiilor n au fost
Exemplu: ordine. in I ordine. ou t
6 2 4 1 3 5 6
cifre. out
16. (Labirint - ***) Din nefericire un elf s-a pierdut n labirintul
minotaurilor. Labirintul poate fi privit ca un caroiaj ale celule pot fi libere sau
ocupate de ziduri. Elful se poate deplasa pe sau pe doar n
celulele libere. Spre bucuria lui, a descoperit nu a pierdut harta .labirintului pe
care o primise de la minotauri.
de intrare labirint. in pe prima linie, dimensiunile m, n:::;200 ale
labirintului. m linii vor descrie celulele labirintului. Pe fiecare astfel
de linie se vor afla cte n caractere. O va fi prin caracterul
"L", iar una prin caracterul "O". Ultima linie a va
a elfului.
de labirint. out trebuie pe prima linie, lungimea a
unui drum care l va duce pe elf la marginea labirintului. Cea de-a doua linie va
o descriere a drumului. Fiecare a elfului va fi printr-o
O de pe a i-a linie a labirintului pe cea de-a (i-1)-a linie a acestuia va
fi prin "N". O de pe a i-a linie a labirintului pe cea de-a (i+ l)-a
linie a acestuia va fi prin "S". O de pe a i-a a labirintului
pe cea de-a (i-1)-a a acestuia va fi prin "V". O de pe a
i-a a labirintului pe cea de-a (i+l)-a a acestuia va fi prin
"E". Se elful a din labirint pe
prima linie, pe prima pe ultima linie sau pe ultima Se
faptul va exista ntotdeauna cel o
Exemplu: labirint. in labirint. out
45
4
OLLOL SVVS
OLOLO
OLLLO
OLOOO
2 4
17. (Cifre - *****) Eugenia i pune adesea dificile lui nu pentru
nu dar vrea ct de perspicace este Uneori
ei sunt foarte grele, chiar pentru atunci acesta
cere ajutorul vostru! Eugenia i-a pus ntrebare lui
"eu gndesc la un ntreg din intervalul [A ... B] (0$4:::;B<1.000.000.000),
care este probabilitatea ca la care gndesc cel K cifre
de valoare C"? pe ct mai repede la ntrebare.
Pe prima linie din de intrare cifre. in se numerele ntregi A, B, C K
(n ordinea aceasta)
Pe prima linie din de cifre. out se va scrie probabilitatea, un
real cu patru zecimale, ca din intervalul [A ...B] la care se
Eugenia cel K cifre de valoare C.
Exemplu: ci fre. in I
1 13 1 1 0.3846
(http://infoarena.devnet.ro)
196
!!!!!!!!!!!!
Vor fi descrise, n imagini, trecerile de la o de ordin x la o
de ordin x+1:
u
c Cl
u u U--U u
Ordin 2 ->Ordin 3
Ordin 1 -> Ordin 2
19. (Fractal - **) Hilbert a o care poate trece prin fiecare punct al
se pe o Numim de tip
Hilbert de ordinul K, curba reguli, ce trece prin fiecare
nod al unei grile de 2
K*2K
noduri trece prin noduri vecine ale grilei. Curba
Hilbert deordinlll 1este o
18. (Triang ***) Andreea a la ce este un triunghi echilateral.
de aceste figuri geometrice, ea n plan puncte cu
coordonate numere reale. Ea nu seama cte triunghi uri echilaterale a
desenat, cere ajutorul vostru!
Pe prima linie a triang.in se N. Pe N linii se vor afla
coordonatele celor N puncte sub forma x y (-10.000 x, y 10.000)
Pe prima linie a triang.out se va scrie de triunghiuri echilaterale
desenate de Andreea. Nu vor exista puncte cu coordonate identice, iar orice
punct poate fi folosit pentru formarea mai multor triunghiuri echilaterale. Pentru
testarea a doua numere reale se folosirea unei precizii de 10.
3
Exemplu: triang. in triang. ou t
3 1
O O
4 O
2 3.46410Hi (http://infoarena.devnet.ro)
Ordin 3 -> Ordin 4
197
frac. out
fractal.out
15
13
fractal.in
(http://infoarena.devnet.ro)
21. (Compania - ***) ntr-o companie cu N oameni,fiecare este fie
fie angajat. Fiecare cu fiecare angajat din departamentul
(dar nu cu Gradul de al unui departament este egal cu
de distincte de tip - angajat, care au loc. ntregii companii
este suma gradelor de al departament. Se
companiei este E ::; 2.000, trebuie se determine minim de-
dintre care fie un minim de. pentru a se De
asemenea, trebuie se determine structura companiei, specificnd de
departamente, pentru fiecare departament de dintre
sunt
Prima linie a comp.in ntreg E.
Prima linie a comp.out: va rmrum de oameni din
companie, minim de de departamente din companie. Pe
linii se vor cte numere naturale de
oameni din acel departament sunt
198
(http://infoarena.devnet.ro)
20. (Frac ': *****) marepasionatde zi
scrie pe o de hrtie, n ordine. toate ireductibilecu
numitorul N. Observnd la timp sunt o infi
llitate
de astfel de. nus.e
mai afle doar a P-a din la care se
determine celei de a P-a din construit regulile de mai
sus. Prima linie a frac. in numere ntregi N.$12.000.000.000
p.$10
14
, separate prin cte un avnd n
Prima linie a frac. out un natural care
celei de a P-a din ireductibile cu numitorul N. Se
rezultatul nu 2
61
.
Exemplu: frac. in I
12 5 13
241
'.
i;,]l{55:;&5


Se dau ca date de intrare din fractal.innumerele K.$15, Y 0.$x,Y.$2
K
) ,
unde K este ordinul unei curbe, iar x y sunt coordonate ntregi n :Hnui
de. dimensiune 2
K*2K
Se cere
l1
de fractal, out

se ajunge. la coordonatele (xy), punctele din parcursyjn
ordinea de curba Hilbert de ordin K. Coltul din stnga sus are coordonatele
0,1).
Exemplu:
323
Ordin 4 ->Ordin 5
Ei.
(http://infoarena.devnet.ro)
22. - ***) Un copil are N:::;IOO de fiecare avnd ca
un cuprins ntre 1 N, iar au distincte. Zi de zi, copilul
cei N linie, placul De. curnd, are o obsesie,
anume aranjeze cei N astfel nct existe K monotone n
aranjatnent. consecutive
n aranjament, iar soldat, mai primului din este
mai mare dect soldatului aflat n stnga lui, fiind cea
cu fi n unsoldat astfel nct
se ordinea. a Spre exemplu, pentru N=5
aranjamentul (:35 12 4) este format din monotone (3 5) (1 2 4).
K datcte aranjamente posibile poate face copilul.
reprima linie a se numerele naturale N K.
Pe fiecare linie ;a de soldati. out se va scrie un singur
reprezentnd total' de aranjamente posibile.
Exemplu: comp. in
7
Exemplu: soldati. in
3 2
732
2 1
5 2
comp.out
soldati. out
23. (Lex - ***) 11 obiecte, numerotate dela 1 la 11:::;30. Din cele 11
obiecte se pot formaZ">! distincte nevide,
lexicografic, un de ordine de la I la2/l-1.
De exemplu, pentriin=3 n ordine sunt:
{l}, {1,2}, {l,2;3}, {1,3}, {2}, {2,3}, {3}
n multe este implementarea a
fiind o se determine ei de ordine; dat
fiind un de ordine, determine un
program care implementeze cele
de pe prima linie pe a linie
un reprezentnd de ce trebuie executate;
n pe prima linie dintre cele
(l 2); tipul 1, atun9i pe cea de
a doua linie s9:iS, de. elemente urmat de
spatii; tipul este 2,peceade a doua linie
va "" natural 1 2
U_l).
cte Ulla pentru fiecare din
de intrare. Pe fiecare linie va fi scris rezultatul unei n ordinea n
n, intrare. este 1, n de
va fi de ordine al specipcate n
;este/de 2, de vor fi elementele cu
de ordine specificat, separate prin spatii, n ordine
199
Exemplu:
3
3
2
3
1
223
2
7
lex. in
123
6
3
lex.out
(http://campion.edu.ro)
24. (Windows - **)Vasile un sistem de operare care deschide pe ecran
numeroase ferestre. Ecranuleste n elementare (care au aria lxl)
formnd un caroiaj n care liniile sunt numerotate de la 1 de sus n jos, iar
coloanele sunt numerotate de la 1 de la stngala dreapta. Astfel, fiecare
elementar de pe ecran poate fi identifisat liniei
coloanei pe care se Fiecare fereastra esteun dreptunghi format din unul sau
mai multe elementare. O fereastra. nou poate se
sau total) peste alte ferestre, deschise n prealabil. Putem nchide o
un clic .n elementar ce constituie din dreapta sus al
ferestrei acesta este vizibil). un program care determine
minim de click-uri necesare pentru a nchide prima fereastra pe care am deschis-o.
de intrare windows. in pe prima linie, un natural
reprezentnd de ferestre deschise pe ecran. Fiecare dintre N
linii 4 numere naturale separate prin cte un R1 S1 R2 cu
"am deschis o fereastra care are coltul din stnga sus pe linia R1
coloana S1 din dreapta jos pe linia R2 coloana S2".
Ferestrele se deschid n ordinea n care apar n de intrare.
windows. out o linie, pe care se
minim de click-uri necesare pentru a nchide prima
Exemplu: windows. in windows. out
3 3
4 163
2 2 5 5
143 6
25. (Fotbal - ***) La "Vreau sa fiu mare!" tineri
n urma testelor efectuate, pentru fiecare s-au stabilit trei
calificative reprezentnd valoareaacestuia pe posturile de
atacant. Antrenorul selecteze 10 de cmp din cei N (portarul va
fi ales separat). Adept al sistemului de joc 4-4-2, antrenorul are nevoie de A
4 2 Evident, se realizarea unei echipe
.competitive. Valoarea unei echipe consta n suma calificativelor pe
posturile pe care Se pune problema unei echipe ct mai
performante.
Pe prima linie a fotbal. in se N, reprezentnd de Pe
N linii se cte trei valori ntregi din intervalul [1, 10], separate prin
reprezentnd calificativele pe posturile de
200
!!!!!!!!!!!!
atacant. n fotbal. out se va valoarea celei mai competitive echipe ce se
poate forma folosind
Exemplu:
15
183
779
357
10 9 8
359
462
398
644
723
10 4 9
5 10 6
982
456
8 2 1
493
fotbal. in
91
fotbal. out
colin.out
4
2
3
5
7
26. (Coliniaritate - ***) Se puncte n plan. se determine
de cardinal maxim cu proprietatea toate punctele pe care aceasta le
sunt colniare,
N, reprezentnd de puncte, se pe prima linie a
colin.in. Pe Nlinii se cte numere ntregi, reprezentnd
coordonatele punctelor, valori din intervalul [-10000, 10000].
Pe prima linie a colin.out se va cardinalul n
continuare se vor cte unul pe linie, numerele de ordine ale punctelor
sortate
Exemplu: colin.in
7
10 20
o o
44 90
20 30
22 45
11 20
66 135
27. -***) Pe un panou dreptunghiular sunt dispuse N*M
Asociat panoului cu becuri, un panou de comutatoare pentru
aprinderea/stingerea becurilor. sistemul de al comutatoarelor
este bizar. Astfel, prin unui comutator se va schimba nu numai
starea beculuiasociat acestuia, ci starea becurilor vecine pe linie
Pe panou becuri aprinse sau stinse. Pornind de la o se cere
se determine minim de de comutatoare care va realiza
stingerea tuturor becurilor.
Pe prima linie a beculete.in se N M (1<N, Pe N
linii ale se neseparateprin cte M valori din {O, 1}
reprezentnd starea becurilor: l-aprins, O-stins.
201
n beculete.out se va minim .de de comutatoare.
nu n se va mesajul "NU EXISTA".
Exemplu: beculete. in beculete. out
444
0111
1100
0101
1110
28. (Divizori - **) Vom considera un natural N. n A vom
divizorii lui N. Se cere se permute elementele A, astfel nct, pentru
oricare elemente consecutive A[i] A[i+1] avem fie A[i]=A[i+1]*p, fie
A[i+l]=A[i]*p, unde p este un prim oarecare. Valoarea p poate diferi de la
o pereche de elemente la alta.
Pe prima linie a divizari. in se N (2::;N::;2.000.000.000).
Pe prima linie a divizari. out se va lungimea A. Pe a doua linie
a se vor elementele lui A. n cazul mai multor se
poate oricare dintre ele.
Exemplu: divizari. in divizari. out
12 6
1 2 4 12 6 3
29-. (Vecini - ****) nDrumul Taberei un bloc foarte ciudat. n primul an
cnd a fost construit presupunem anul 1) avea un singur etaj, care, n
fiecare an, se un nou etaj, astfel nct.n anul X va avea X etaje. Dar
acesta nu este singurul lucru ciudat. ci. modul n care este ocupat fiecare etaj este
foarte ciudat. La etajul 1 (primul etaj ncepnd de jos) tot. timpul
administratorul, deci este ocupat. De asemenea ultimul etaj, fiind nou, este tot
timpul ocupat. Restul etajelor, sunt ocupate (sau libere) regulile:
- anul trecut, etajul curent etajul de dedesubt au fost ocupate, atunci etajul
va fi liber anul acesta;
- anul trecut, etajul curent etajul de dedesubt au fost libere, atunci etajul va
fi liber anul acesta;
- anul trecut, etajul curent a fost ocupat, iar cel de dedesubt a fost liber, atunci
etajul curent va fi ocupat;
- anul trecut, etajul curent a fost.liber, iar cel.de dedesubt a fost ocupat, atunci
etajul curent va fi ocupat.
un program care etajelor N::;lOO.OOO ani de la
de. intrare vecini. in un singur. natural N, care
de ani. n vecini. out se vor scrie N numere separate ntre
ele printr-un Numerele starea etaj, ncepnd cu etajul 1.
Reprezentarea este Opentru liber l pentru ocupat.
vecini. in 11 O O O 1 vecini. out
("Stelele informaticii" 2003,
202
!!!!!!!!!!!!

de caractere
Sectiunea 1.1.1
,
1. c) d) 8. d) 15. b) 22. d)
2. a) b) 9. d) 16. b) 23. c)
3. a) 10. b) 17. c) 24, a)
4. b) 11. d) 18. c) 25. c)
5. a) c) 12. a) b) e) 19. c) 26. c)
6. c) 13. a) 20. a) 27. b)
7. d) 14. a) 21. b) 28. c)
Sectiunea 1.1.3
2.
1 var s: str'ing;
2 x: char;
3 begin
4 readln(s); x:=s[l];
5 while pos(x,sO do
6 delete(s,pos(x,s),l);
7 writeln (s);
8 end.
3.
1 var s: string;
2 begin
3 readln(s);
4 while length(sl do begin
5 delete(s,l,l);
6 delete(s,length(s),l);
7 writeln(s);
8 end;
9 end.
7.
1 vax.. x,ml,m2: string;
2 n,i:integer;
3 begin
4 readln(n);readln(ml);readln(m2);
5 if m2<ml then begin
6
7 end;
8 for i:=3 to n do begin
9 readln (x) ;
#include <string.h>
#include <iostream.h>
char s[256],x; int p;
void main() {
cins; x=s[O];
while ((p=strchr(s,x)-s=O)
strcpy(s+p,s+p+l) ;
coutsendl;}
#include <string.h>
#include <iostream.h>
char s[256];
void main() {
cins;
while (strlen(sl)
strcpy(s,s+l) ;
s[strlen(s)-l]=O;
coutsendl; } }
#include <iostream.h>
#include <string.h>
char x[256] ,ml[256],m2[256];
int n,i;
void main() {
cinn;cinml;cinm2;
if (strcmp(ml,m2O) {
strcpy(x,m2);strcpy(m2,ml);
strcpy(ml,x); }
203
10 if x<m1 then begin
11 m2:=m1;m1:=x; end
12 else if x<m2 then
13 m2:=x;
14 end;
15 writeln(m1+m2);
16 end.
10.
1 var s,x,y,sl,s2:string;
2 n,i:integer;
3 begin
4 readln (xi : readln (y) ;
5 i:=length(x)+l; sl:=' ';
6 s:='aeiouAEIOU';
7 repeat
8 dec (i) ;
9 sl:=x[i)+sl;
10 until (i=l)or(pos(x[i) ,sO);
11 i:=length(y)+1;s2:=";
12 repeat
13 dec (i) ;
14 s2:=y[i)+s2;
15 until (i=l)or(pos(y[i),sO);
16 writeln(sl=s2);
17 end.
11.
1 var s: string;
2 i,j,er,cifra:integer;
3 begin
4 readln (s) ;
5 for i:=l to length(s) do
6 begin
7 if s [i) in l ' O' ' 9 ') then
8 val(s[i),cifra,er)
9 else
10 for j:=l to cifra do
11 write(s[i);
12 end;
13 end.
14.
1 var s,c,sl,s2:string; x:byte;
2 begin
3 readln(s);c:=' ';
4 readln(sl);readln(s2);
5 while(pos(sl,sO)do begin
6 x:=pos(sl,s);
7 c:=c+copy(s,1,x-1)+s2;
8 delete(s,l,x+length(sl)-l);
9 end;
10 writeln(c+s) ;
11 end.
204
for (i=3;i<=n;i++) {
cinx;
if (strcmp(x,m1)<0) {
strcpy(m2,m1); strcpy(m1,x);}
else if (strcmp(x,m2)<0)
strcpy (m2, x) ; }
coutstrcat(m1,m2)endl;}
#include <iostream.h>
#include <string.h>
char s[256],x[256] ,y[256],
sl[256],s2[256]; int i,n;
void main() {
cinx;ciny; i=strlen(x);
strcpy(s, "aeiouAEIOU");
00 { if (strlen(sl
memmove(sl+l,sl,strlen(sl)-l);
sl[O]=x[--i];
} While(i>O&&lstr chr(s,x[i];
i=strlen (y) ;
00 { if (strlen(s2
memmove(s2+1,s2,strlen(s2}-1);
s2 [O] =y[ --il ;
} while(i>O&&lstrchr(s,y[i])};
cout!strcmp(sl,s2)endl; }
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char s[256]; int i,j,cifra;
void main() {
gets(s);
for (i=O;i<strlen(s) ;i++)
if (isdigit(s[i]
cifra=s[i]-'O' ;
else
for (j=O;j<cifra;j++)
printf("%c",s[i]) ;
#include <stdio.h>
#include <string.h>
char s[256] ,c[256] ,sl[256],
s2[256]; int p;
voidmain() {
gets(s) ;gets(sl};gets(s2);
while p=strstr (s , sl) -s} >=0) {
strncat(c,s,p) ;
strcpy(s+p,s+p+strlen(sl;
strcpy(s,s+p);strcat(c,s2);}
puts(strcat(c,s; }
16.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
20.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
22.
1
2
3
4
5
6
7
8
9
28.
1
2
3
4
5
6
var s:string;
i:byte; ok:boolean;
begin
readln(s);
for i:=l to length(s)do
if ((upcase(s[i]='A')and
(upcase(s[i])<='Z'))then
begin
write(s[i]); ok:=true;
end
else
if ok then begin
writeln;ok:=false;
end;
end.
var s,cuv,t:string;
i:byte;
begin
readln(s) ;t:=' '; cuv:=";
for i:=l to length(s)do
if ((upoase(s[i]='A')and
(upcase(s[i])<='Z'))then
cuv:=s[i]+cuv
else
begin
t:=t+cuv+s[i];
CUV:=I 1;
end;
writeln(t);
end.
var s:string; x:real;
er,i:integer;
begin
readln(s); val(s,x,er);
x:=length(s)-3;
if (er=O)and(pos('.' ,s)=x)
then write( 'Da')
else write( 'Nu');
end.
var s,c,t:string;f,g:text;
sm,i,x,er:integer;
begin
assign(f, 'virus.txt');reset(f);
assign(g, 'sum.txt');rewrite(g);
C:=I 1;
#include <stdio.h>
#include <string.h>
char s[256]; int i,ok;
void main() {
gets(s);
for (i=O;s[i];i++)
if (( s [i] >=' a' &&s [i] <= ' z ' ) II
(s [i] >=' A' &&s [i] <=' Z' ) )
{ putchar(s[i]); ok=l; }
else
if (ok) {
putchar('\n'); ok=O;
#include <stdio.h>
#include <string.h>
char s[256] ,cuv[256],t[256];
int i;
void main() { gets(s);
for (i=O;i<=strlen(s) ;i++)
if (( s [i] >=' a i &&s [i] <= ' z ' ) II
(s[i]>='A'&&s[i]<='Z')) {
if(strlen(cuv) )
memmove(cuv+l,cuv,strlen(cuv));
cuv[O] =s [i]; }
else {
strcat(t,cuv) ;
t[strlen(t)]=s[i];
memset(cuv,O,sizeof(cuv));
puts (t);
}
#include <string.h>
#include <stdio.h>
char s[256]; long x,y;
void main() {
gets (s) ;
if (sscanf (s , "%d.%d" .tcc, &y) ==2&&
(y>=100&&y<1000)) printf ( "Da \n" ) ;
else printf ("Nu\n") ;
#include <stdio.h>
#include <string.h>
char s[256] ;FILE *f,*g;
int sm,i,c;
void main() {
f=fopen("virus.txt" , "r") ;
205
7 while not eof(f)do begin
8 readln(f,s); sm:=O;
9 for i:=l to length(s)do
10 if (s[i]>='O')and(s[i]<='9')
11 then c:=c+s[i]
12 else begin
13 val(c,x,er);
14 sm:=sm+x;c:=' ';
15 end;
16 val(c,x,er) ;c:=";
17 writeln (g, sm+x) ;
18 end;
19 close(g); close(f);
20 end.
29.
1 var s,c,t:string;
2 i,p:integer;
3 begin
4 readln (s); readln (p) ; c : =' , ;
5 for i:=l to length(s)do
6 if (upcase(s[i]='A')and
7 (upcase(s[i])<='Z')
8 then c:=c+s[i]
9 else begin
10 if length(c)<>p then
11 t: =t+c;
12 t: =t+s [i]; c: =' , ;
13 end;
14 writeln(t);
15 end.
16
30.
1 var s,c,y:string;
2 i,n,p:integer;
3 begin
4 readln(s); readln(p);
5 n:=length(s); c:=' ';
6 for i:=l to n-p+l do begin
7 y:=s; delete(y,i,p);
8 if pos(y,c)=O then
9 c:=c+y+' ';
10 end;
11 writeln(c);
12 end.
33.
1 var s,c,y:string;
2 i,n,p,m:integer;
3 begin
4 readln(s); n:=length(s);
5 p:=l;
6 while p*(p+l)<=2*n do inc(p);
7 dec(p); m:=n-p*(p+l)div 2;
206
g=fopen (" sum. txt" , "w") ;
while (fscanf(f,"%s\n",s)==l){
sm=O;
for(i=O;i<=strlen(s);i++)
if(s[i]>='O'&&s[i]<='9')
c=c*10+s[i]-'O';
else { sm+=c; c=O; }
fprintf (g, "%d\n" , sm) ;
}
fclose(f) ;fclose(g);
}
#include <string.h>
#include <stdio.h>
char s [2 56] , c [2 56] , t [ 256] ;
int i,p;
void main() {
gets(s); scanf("%d",&p);
for (i=O;i<=strlen(s);i++)
if ((s[i]>='a'&&s[i]<='z') II
(s[i]>='A'&&s[i]<='Z'

else {
if (strlen(c) !=p) strcat(t,c);
t[strlen(t)]=s[i];
memset(c,O,sizeof(c);}
puts (t) ;
}
#include <iostream.h>
#include <string.h>
char s[256],c[256],y[256];int i,n,p;
void main() {
cinsp; n=stilen(s);
for(i=O;i<=n-p;i++) {
memset(y,O,sizeof(y ;
strncpy(y,s,i);
strncat(y,s+i+p,n-i-p) ;

strcat(c,strcat(y," ";
coutcendl; }
#include <iostream.h>
#include <string.h>
char s[256],c[256]; int i,n,p,m;
void main() {
cins; n=strlen(s);
for(p=1;p*(p+l)<=2*n;p++); p--;
m=n-p*(p+l)/2;
8 writeln(copy(s,l,m));
9 delete (s , l,m) ;
10 whiles<>" do begin
11 writeln(copy(s,l,p));
12 delete(s,l,p);
13 dec (p) ;
14 end;
15 end.
34.
1 var a,b,c:string;
2 i,n,p,m:integer;
3 begin
4 readln (n); a: = ' a '; b: = ' b ' ;
5 for i:=3 to n do begin
6 if odd(i)then c:=b+a
7 else c:=a+b;
8 a:=b;
9 b:=c)
10 end;'
11 wri t.el.n t c j :
12 end.
13
35.
1 var a:array[l .. lO]of string;
2 t:string;
3 i,n,j,max:integer;
4 begin
5 readln(n); max:=O;
6 for i:=l to n do begin
7 readln(a[i]);
8 if length(a[i]max then
9 max:=length(a[i]);
10 end;
11 for i:=l to n-l do
12 for j:=i+lto n do
13 if a [il >a[j] then begin
14 t:=a[i] ;a[i] :=a[j);a[j] :7"t;
15 end;
16 for i:=l to max do begin
1 7 for j: =1 to n do
18 if length(a[j]>=i)then
19 write(a [j] [il " ')
20 else write(' ');
21 writeln; end; end.
38.
1 var i,j:byte;c,s:string;
2 begin
3 readln ( s) ;
4 i:=2;
5 while i<length(s) do begin
6 if (s[i]+s[i+l]='at')and
7 (s[i-l]<>'.')and(s[i+2]<>'.')
coutstrncat(c,s,m)endl;
strcpy(s,s+m) ;
while (strlen(s)) {
memset(c,O,sizeof(c) );
coutstrncat(c,s,p)endl;
strcpy(s,s+p);p--;
}
}
#include <iostream.h>
#include <string.h>
char a[256] ={"a" },b[256] ={"b"},
c[256]; int n,i;
void main() {
cinn;
for (i=3;i<=n;i++){
if (i%2=1) {strcat(c,b) ; strcat (c.a) ;}
alse {strcat(c,a) ;strcat(c,b);}
strcpy(a,b); strcpy(b,c);
memset(c,O,sizeof(c)) ;}
coutbendl;
#include <iostream.h>
#include <string.h>
char a [ 10] [2 5 6] , t [2 5 6] ;
int n,i,j,max;
void main() {
cinn; max=O;
for (i=O;i<n;i++)
cina[i] ;
if (max<strlen(a[i]))
max=strlen(a[i]) ;
}
for (i=O;i<n;i++)
for (j=i+l;j<n;j++)
if(strcmp(a[i] ,a[j]O)
{s trcpy ( t , a [i] ) ;
strcpy(a[i],a[j]) ;
s trcpy (a [ j ] r t) ; }
for (i7"O;i<max;i++) {
for (j=O;j<n;j++)
cout(i<strlen(a[j])?a[j] [i]:' ')
' '; coutendl;} }
#include <iostream.h>
#include <string.h>
int i,j,p;
char c[256],s[256];
void main()
{
cins;
207
8
9
10
11
12
13
14
15
16
17
18
19
20
39.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
47.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
208
then begin
C
. - l I
.- ,
for j:=l ta i-l do e:=e+s[j];
e: =e+'@' ;
for j:=i+2 ta length(s) do
e:=e+s[j] ;
writeln(e) ;
delete(e,pos('eod' ,e),3);
writeln (e) ;
end;
inc(i) ;
end;
end.
var i,j:byte;c,s,p:string;
begin
readln(s); i:=l; p:=";
while i<=length(s) do
if (s[i]=' (') then begin
c : =' , ; inc ( i) ;
while s[i]<>') 'do begin
c:=c+s[i]; inc(i);
end;
for j:=l ta ord(s[i+l])-48 do
p:=p+e; inc(i,2);
end
else begin
p:=p+s[i]; inc(i)
end;
wri teln (p) ;
end.
var s,n,j,i,p,pr:integer;
x: string; ok:boolean;
a:array[i . . 10]of string;
begin
readln(n); i:=i; ok:=true;
while i<=n do begin
readln(x); p:=i;
for j:=i ta length(x)do
if x[j]>x[p] then p:=j;
delete(x,i,p-l);
for j:=i ta i-i do
if a[j]=x then p:=O;
if p=O then ali] :=' ,
else begin
if ok then begin
pr:=i; ok:=false;
end;
ali] :=x;
end;
inc(i)
end;
for (i=i;i+i<strlen(s);i++) {
if (s[i]=='a'&&s[i+i]=='t'&&
s[i-i] !=' .'&&s[i+2] !=' .') {
memset(c,O,sizeof(c ;
stmcpy(c, s, i) ;strcat(c, "@");
stmcat(e,s+i+2,strlen(s)-i-2);
coutcendl;
p=strstr(e,"cod")-c;
strcpy(c+p,c+p+3) ;
coutcendl;
}
}
}
#include <iostream.h>
#inelude <string.h>
int i,j;
char s[256] ,p[256],c[256];
void main() {
cins;
for(i=O;i<strlen(s) ;i++)
if (s [i] ==' ( , ) {
memset(c,O,sizeof(c;
for (i++;s[i] !=')' ;i++)
c[strlen(e)]=s[i] ;
for (j=O;j<s[i+i]-'O' ;j++)
streat(p,c); i++;
}
else p[strlen(p)]=s[i];
coutpendl;}
#include <iostream.h>
#include <string.h>
int s,n,i,j,p,pr,ok;
char x[256] ,a[ll] [256];
void main() {
cinn;
ok=i;
for (i=O;i<n;i++) {
cinx;
for (p=j=O;j<strlen(x);j++)
if (x[j]>x[p]) p=j;
strcpy(x,x+p) ;
for (p=l,j=O;j<i;j++)
if (!strcmp(a[j],x p=O;
if (p==O)
memset(a[i],O,sizeof(a[i];
else {
if (ok) {pr=i; ok=O; }
strcpy(a[i] ,x);
}
}
22 for i:=l to length(a[pr]) do
23 s:=s+ord(a[pr] [il);
24 for i:=l to n do
25 if (a[i]=' ')or(i=pr) then
26 writeln(s+i)
27 else writeln (a [i])
28 end.
Tipul nregistrare - s t r u c t u r
for (i=O;i<strlen(a[pr]) ;i++)
s+=a[pr] [i];
for (i=O;i<n;i++)
if (!strlen(a[i]) I li==pr)
couts+i+lendl;
else couta[i]endl;
Sectiunea 1.2.1
1. a) c) 5. b) d) 9. a) c) 13. b)
2. d) 6. a) c) 10. d) 14. b)
3. a) d) 7. a) d) 11. c)
4. c) 8. a) b) 12. c)
Sectiunea 1.2.3
1.
1 type e=record
2 np:string; m:real;
3 end;
4 var a:array[1 .. 50]of e;
5 x:e;
6 nt,j,n,i:integer;
7 mo,mx,s:real;
8 nm,pr:string;
9 begin
10 readln (n) ;
11 for i:=l to n do begin
12 readln (nm) ;
13 readln (pr) ;
14 readln(mo,nt) ;
15 with ari] do begin
16 np: =nm+ ' '+pr ;
17 m:=(mo*3+nt)/4;
18 s: =s+m;
19 if m>mx then mx:=m;
20 end;
21 end;
22 writeln(s/n:O:2);
23 for i:=l to n do
24 if ari] .m=mx then
25 writeln(a[i] .np) ;
26 end.
#include <stdio.h>
#include <string.h>
typedef struct {
char np [256] ;
float m;
} e;
e a[50];
int n,i;
float mo,mx,nt,s;
char nm[256],pr[256];
void main () {
scanf ( "%d" , &n) ;
for (i=O;i<n;i++) {
scanf("%s%s%f%f" ,nm,pr,&mo,&nt);
strcpy(a[i] .np,nm);
strcat (a [il .np," ");
strcat(a[i] .np,pr);
ari] .m=(mo*3.0+nt)!4.0;s+=a[i].m;
if (mx<a[i] .m) mx=a[i] .m;
}
printf("%.2f\n",s/n);
for(i=O;i<n;i++)
if (a[i] .m==mx)
printf("%s\n",a[i] .np);
209
!!!!!!!
3.
1 type e=record
2 np:string; m:real
3 end;
4 var a:array[1 .. 50]of e;
5 x:e;nt,j,n,i:integer;
6 mo:real;
7 nm,pr:string;
8 begin
9 readln (n) ;
10 for i: =1 to n do begin
11 readln(nm}; readln(pr};
12 ari] .np:=nm+' '+pr;
13 readln(mojnt} ;
14 a [i] :m:=' (mo*3+nt) /4;
15 end;
16 for i:=l to n-1 do
17 for j: =i+1 to n do
18 if ari] .np>a[j] .np then
19 begin
20 x:=a[i];
21 ari] =a[j]; a[j] :.=x
22 end;
23 for i:=l to n do
24 if ali] .5 then
25 [il .np} ;
26 end.
6.
1 type e=record
2 np:string; vm:real;
3 end;
4 var a:array[1 .. 50]of e
5 x:e;nt,j,n,i,l:integer
6 mv,v,m:real; nm,pr:string;
7 begin
8 readln (n , l) ;
9 for i:=l to n do
10 begin
11 readln (nm) ; readln (pr) ;
12 a [i] . np: =nm+ ' , +pr;
13 readln(m,v);
14 ali] .vm:=v/m;
15 end;
16 for i:=l ton-1 do
17 for j:=i+1 to n do
18 if ari] .np>a[j] .np then
19 begin
20 x:=a[i]; ali] :=a[j];
21 a[j] :=x
22 end;
23 for i:=l to n do
24 if a li] . vm>L then
25 writeln(a[i] .np};
26 end.
210
#include <stdio.h>
#include <string.h>
typedef struct {
char np[256]; float m;
} e;
e a[50],x;int n,i,j;
float mO,nt; char
nm[ 2 5 6] ,pr [2 5 6] ;
void main(} {
scanf ("%d",&n) ;
for (i=O;i<n;i++) {
scanf ("%s%s%f%f" ,nm,pr, &mo, &nt) ;
strcpy(a[i] .np,nm};
strcat (a li] .np," ");
strcat(a[i] .np,pr};
a[i].m=(mo*3.0+nt}/4.0;
}
for (i=O;i<n;i++)
for (j=i+1;j<n;j++)
if(strcmp(a[i] .np,a[j] .np}>O) {
x=a[i]; a[i]=a[j]; a[j]=x;
}
for (i=O;i<n;i++)
if (a[i] .m<4.5)
printf ("%s\n" ,ari] .np);
#include <stdio.h>
#include <string.h>
typedef struct {
char np [256] ;
float vm;
} e;
e a[50] ,X;
int n,i,j,l;
fIcat v,m;char nm[256],pr[256];
void main(} {
scanf ("%d%d", &n, &l) ;
for (i=O;i<n;i++)
{scanf (" %s%s" ,nm, pr) ;
strcpy(a[i] .np,nm} ;
s trcat (a [ i ]; np," ");
strcat (a li] .np, pr);
scanf ("%f%f", &v, &m);
ali] .vm=v/m; }
for (i=O;i<n;i++)
for (j=i+1;j<n;j++)
if(strcmp(a[i] .np,a[j] .np}>O) {
x=al'[i]; a[i]=a[j]; a[j]=:x:;}
for li=O;i<n;i++}
if (a[i] .vmc-L)
printf (" %s\n" ,a li] .np) ;
7.
1 type e=record
2 nr,nm:integer;
3 end;
4 var a:array[1 .. 50]of e;
5 j,n,i,nr:integer;
6 v:real;
7 begin
8 readln(n); nr:=O;
9 for i:=l to n do begin
10 readln(a[i] .nr);
11 readln(a[i] .nm);
12 end;
13 v:=a[n] .nr/a[n] .nm;
14 for i:=l to n-1 do
15 if ali] .nr/a[i] .nm=v then
16 inc (nr) ;
17 writeln(nr);
18 end. \
10.
1 type e=recordx,y:integer end;
2 var p:array[l. .50]of e;
3 j ,n, i, nr','max, a: integer;
4 x:e;
5 begin
6 readln (n); max: =0;
7 for i:=l to n do
8 read(p[i .x/pU] .y);
9 for i:=l to n-1 do
10 for j:=i+1 ton do
11 if (p[i] .x>p[j],x)or
12 (p[i] .x=p[j] .x)and
13 (p[i].y:>p[j].y)
14 then begin
15 x:=p [il;
16 p [i] : =p [j ]; p [ j =x
17 end;
18 for i: =1 to nda begin
19 j :=i+1; nr:;=l;
20 while(p [j] .x-p [il .x<;=n)
21 apd ( j-<=n) do begin
22 if (p[j] .y'-p[i] .y<=n)and
23 (p[j].y'-p[i].y>O)then
24 inc (nr) ;
25 inc (j) ;
26 end;
27 if nr > max then begin
28 max:=nr;
29 a:=i;
30 end;
31 end;
32 write(p[a] .x,' ',p[a] .y)
33 end.
#include <stdio.h>
typedef struct {
int nr,nm;
} e;
e a[50];
int n,i,j,nr;
void main()
{
scanf (" %d" ,&n) ; nr=O;
for (i=O;i<n;i++)
scanf("%d%d" ,&ali] .nr,&a[i] .nrn);
for (i=0;i+1<n;i++)
if (a[i] .nr*a[n-1] .nm==
a [n-1] .nr*a[i] .nm)
f<lr++;
prLnt f ("%d\Il" ,nr);
}
#include <stdio.h>
typedef struct {int x,y;} e;
e p[50],x;
int n,i,j,nr,max,a;
void main()
{
scanf ("%d", &n) ;max=O;
for (i=O;i<'n;i++)
scanf("%d%d" ,&p[i] .x,&p[i] .y);
for (i=O;i<n;i++)
for (j=i+1;j<n;j++)
if ((p[i] .x>p[j] .x) II
(p[i] .x=;=p[j] .x&&p[i] .y>p[j] .y))
{
x=p[i] ;
p[i]=p[j] ;
p [j] ~ x ;
}
for (i=O;i<n i++)
{
for (j=i+1,nr=1;j<n&&
p[j] .x-pli] .x<=n;j++)
if (p[j] .y-p)n;y<=n&&
p[j] .y-p[i] .y>O)nr++;
if (nr>max) {
max=nr;
a=i
}
}
printf ("%d %d\n" ,p[a] .x,p[a] .y);
}
211
11.
1 type e=record x,y:integer end;
2 var p:array[1 .. 50]of e;
3 j,n,i,nr,max,a:integer; x:e;
4 begin
5 readln (n) ;
6 for i:=1 to n do
7 read(p[i].x,p[i].y);
8 for i:=1 to n-1 do
9 for j:=i+1 to n do
10 if (p[i] .y>p[j] .y)then begin
11 x : =p [i] ; p [i] : =p [ j ] ; p [ j] : =x
12 end;
13 max:=O; nr:=1;
14 for i:=2 to n do
15 if (p[i-1] .y=p[i] .y)then
16 inc (nr)
17 else begin
18 if nr>max then max:=nr;
19 nr:=1;
20 end;
21 if nr>max then max:=nr;
22 writeln(max)
23 end.
13.
1 type e=record
2 nr,nm:integer; v:real end;
3 var a:array[1 .. 50]of e;
4 j,x,y,n,i,nr,m:integer;
5 t:e; f,g:text;
6 begin
7 assign(f, 'in.txt'); reset(f);
8 assign(g, 'out.txt'); rewrite(g);
9 readln(f,n); m:=O;
10 for i: =1 to n do begin
11 inc (m);
12 read(f,a[m] .nr,a[m] .nm);
13 a[m] .v:=a[m] .nr/a[m] .nm;
14 with a [m] do begin
15 x:=nr; y:=nm;
16 while x-o-y do
17 if x>y then x:=x-y
18 else y:=y-x;
19 if x=1 then dec (m) ;
20 end;
21 end;
22 for i:=1 to m-1 do
23 for j:=i+1 to m do
24 if (a[i] .v>a[j] .v)then begin
25 t:=a[i]; a[i]:=a[j];a[j]:=t
26 end;
27 for i:=1 to m do
28 writeln(g, ari] .rir , '/' tari] .nm) ;
29 close(g); end.
212
#include <stdio.h>
typedef struct {int x,y;} e;
e p[50] ,x;
int n,i,j,nr,max,a;
void main() {
scanf ("%d", &n) ;
for (i=O;i<n;i++)
scanf ("%d%d", &p[i] .X, &p[i] .y) ;
for (i=O;i<n;i++)
for (j=i+1;j<n;j++)
if (p[i] .y>p[j] .y)
{x=p[i]; p[i]=p[j];p[j]=x;
}
max=O;
nr=1;
for (i=1;i<n;i++)
if (p[i-1] .y==p[i] .y) nr++;
else {
if (nr>max) max=nr;
nr=1; }
if (nr>max) m a x ~ n r ;
printf ("%d\n" ,max);
}
#include <stdio.h>
typedef struct {
int nr,nm; float v;
} e;
e a[50],t; int n,i,j,x,y,nr,m;
FILE *f,*g;
void main () {
f=fopen("in.txt","r");
g=fopen (" out. txt" , "w") ;
fscanf(f,"%d",&n);m=O;
for (i=O;i<n;i++)
{
fscanf(f, "%d%d" ,&a[m] .nr,&a[m] .run);
a [m] .v=a [m] .nr/ (float) a [m] .nm:
x=a[m] .nr;y=a[m] .nm;
while (x!=y)
if (x>y) x-=y; else y-=x;
if (x==1) m--; m++;
}
for (i=O;i<m;i++)
for (j=i+1;j<m;j++)
if (a[i] .v>a[j] .v) {
t=a[i];a[i]=a[j];a[j]=t;
}
for (i=O;i<m;i++)
fprintf(g, "%d/%d\n",a[i] .nr,
ari] .nm) ;
fclose (g) ;
}
16.
1 type e=record
2 s:byte;x,y:real;
3 end;
4 var p:array[1 .. 50]of e;
5 j,n,i,nr:integer;
6 v1,v2 :real;
7 x:e;
8 f,g:text;
9 beg-in
10 assign(f, 'film.txt');reset(f);
11 readln(f,n);
12 v1:=O;
13 v2:=24;
14 for i:=l to n do beg-in
15 readln(f,p[i] .x,p[i] .y);
16 p[i] .s:=i;
17 if p[i] .x>v1 then v1:=p[i] .x;
18 if p.I i l .y<v2 then v2:=p[i] .y;
19 end;
20 for i:=l to n-1 do
21 for j:=i+1 to n do
22 if (p[i] .x>p[j] .x)then beg-in
23 x:=Pl'i];
24 p[i] :=:p[j];
25 p[j] :=x
26 end;
27 writeln(v1:0:2,v2:6:2);
28 for i:=l to n do
29 write(p[i].s,',');
30 end.
#include <stdio.h>
typedef struct {
int s; float x,y;
} e;
e p[50] ,X;
int n,i,j,nr;
float v1,v2,xx,yy;
FILE *f;
void main() {
f=fopen("film.txt","r");
fscanf(f,"%d",&n) ;v1=O;v2=24;
for (i=O;i<n;i++){
fscanf(f,"%f%f",&xx,&yy);
p[i] .x=xx;
p[i] .y=yy;
p[i] .s=i;
if (p[il.x>v1) v1=p[i] .x;
if (p[i] .y<v2) v2=p[i] .y;
}
for (i=O;i<n;i++)
for (j=i+1;j<n;j++)
if (p[i] .x>p[j] .x)
x=p[i] ;
p[i] =p[j];
p[j]=x;
}
printf("%.2f %.2f\n",v1,v2);
for (i=O;i<n;i++)
printf("%d," ,p[i] .s+l);
1.3.2
1. Se mparte textul n cuvinte care se vor insera ntr-un vector, mereu
numai cuvinte distincte. La final, se vectorul criteriul din se
cuvintele.
2. Se poate genera matricea fie prin completarea a diagonale, fie
folosind "formula": M[i, j] =li - j 1.
3. Ca puterea la care apare factorul prim p n descompunerea lui n! se
poate folosi formula: f =[n/p] + [n/p2j + [n/p3j + ... ([]
partea Avnd acesta se poate traversa un anumit rnd din
triunghiul lui Pascal pentru fiecare element (r.c), se poate calcula puterea la care
apare D n descompunerea lui r! / ((r-c)! *el). Atunci cnd D nu este prim, trebuie
avut se verifice respectivul element (r,c) are n descompunerea sa
factorii primi ai lui D. D=6, elementul din (r,c) trebuie 2 3 n
descompunerea sa, iar D=4, trebuie 2 de cel ori.
213
!!!!!!!!!
o modalitate de a calcula puterea la care apare un factor prim p n
descompunerea unui este: fie A[c] = puterea la care apare p n
descompunerea lui (r,c).d[c+1] =A[c] + puterea lui p n (r-c) - puterea luip n
(c+ 1). se poate deduce din modul n care se elementul
(r,c+1) din (r,c) folosind formula (r,c) = r! I ((r-c)! *ci).
4. Se parcurge caracter cu caracter (nu este stocarea datelor de
intrare ntr-un vector) se variabile care de nceput
a ultimului cuvnt detectat n s-a vreunul. De
asemenea, se .variabile pentru suma lungimilor cuvintelor
de cuvinte pentru a calcula rezultatul. la parcurgerii
de ultimul caracter citit a fost o mare sau se
actualizeze de cuvinte suma lungimilor.
5. Se algoritmii de criptare decriptare n
6. Se mparte textul n cuvinte se ntr-un vector de cuvinte; cnd
cuvntul deja n vector se din vector.
7. Problema se n mod cu problema "Camion" dei la
1.3.1 (probleme rezolvate), deoarece sunt necesare doar rezultatele pentru
primele 10 linii.
8. Lafiecare pas se scade din n cel mai mare Fibonacci mai micdect,. Se
numere mari deoarece n poate avea 80 de cifre.
9. Se parcurge matricea pe coloane se cte blocuri apar pe fiecare

1 sau 3, rezolvarea este Pentru lungime mai
primul caracter din se ncepe cu B sau
C.. Se recunoscute se; parcurge
caracter cu caracter. B va.fi.mereu de forma22.. ;221A3AC, iar o perla C
va fi de forma 2, 12A sau 322...221A3ACC. Cum perla A poate fi ()rice caracter .din
problema se reduce la n perle de tip C de cifre n
de caracterul din v3,rflll. stivei.
11. se determina regula:
1 (unu)
11. (un unu)
21 (doi de unu)
1211 (un doi,un unu)
111221 (un unu, un doi, doi de unu)
312211. (trei de; unu, .doi.de doi, un unu)
Se poate demonstra va fi-mereu format.din cifrele 1,2 3.
214
!!!!!!!!!!!
14. .Se. mparte textul n cuvinte se distribuie pe linii de. lungime.Max conform
regulilor descrise n
altfel
daca e[i+l,j]>e[i,j+l] atunci eli, j] e[i+l, j]
V[i, j] V[i+l, j.]
ct ]
V[i, j+l]
AND(V[i+l,j]<V[i,j+l]) atunci
c t i , j] cj L, j+l]
V[i, j] V[i j+l]
altfel
daca re [i+i,
altfel
daca e[i+l,j]<e[i,j+l] atunci eli, j]
V[i,
altfel
daca (e[i+l,j]=e[i,j+l])AND(V[i+lij]>V[i,j+l]) atunci
e [i , j] . e [i+1, j ]
V [i ,j ] V [i +,1, j]
15. Se va folosi algoritmul "clasic" de determinare a celui mai lung comun a
programarea Ca se determine.o.solutie.ct mai
mare pin .punct de vedereal.valorii, se va pe matricea C[i, jl=
lungimea celui. mai lung comun din n[Llungime(n)]
matrice V[i,j] =ceamai, mare valoare pentru cel mai lung
din respective. de vor fi:
daca n[i]=m[j] atunci eli, j] e[i+l, j+l.] 1
Vi, j] n[i] + V[i+l,j+l
13. Se nlocuiesc literele din cuvinte cu cifre de la O la 9, n de-pozitia n
alfabet Cum pot fi doar 10.000 de' cuvinte distincte, se va folosi un' algoritm de

12. Problema se relativ simplu, cont de
mesaj a fost codificat prin 4.rotiri ale textuIJji,>este la o
a.textului sub pot fi citite Lung(Mesaj)/4 caractere, .decintregul
mesaj are
2) Ca urmare a de la punctul l,mesajul poate fi exact n 4
egale ...,
se p TV,}1 din ei i corespund
1] .' la rotir.e 90 grade
TIN-i+1,N-j+1] la rotire cu 180 grade
TIN:j+1,i] . la rbtirecu 270 grade
de unde deducem du e nevoie rotim textul.
unui este Uf' numa,i
cele 4 cu un Index. Atunci, parcurgnd textul care ascunde mesajul, n
(i, j) o n numai toate celeA caractere
Mesaj2[lndex], Mesaj3[lndex], Mesaj4[Inde::x:]
coincid cu cele 4 caractere prinr()tire (vezi 3).
215
16. Se va folosi algoritmul "clasic" de determinare a celui mai lung comun a
anume, ntre normal inversat. Rezultatul va fi de
caractere din - lungimea celui mai lung comun. Pentru exemplul din
CMLSC("Abxbd", "dbxbA") = 3, astfel va fi 5-3 =2 (se va insera
un "A" un "d" pentru a se "AdbxbdA").
17. Numim vecinii unei i, la care se poate ajunge
executarea i. Din programului, fiecare are
maximum 2 vecini. Pentru a verifica ce nu se vom folosi o
de date de tip astfel deoarece..este cu .o
(Ia magazin, la farmacie, etc. ). Coada va avea un nceput un
iar pe ce se. elemente, se la se
elemente, se de la nceput. Astfel, se 1 n
se
fie i elementul de la nceputul cozii; se vor insera n vecinii lui i
care nu au fost deja la un moment dat acum;
se i din
coada este atunci stop.
Astfel, folosind acest mecanism se vor determina toate care se
cele care nu se fiind exact acelea care nu au fost inserate
n
18. Cele 5 valori care trebuie calculate se vor ntr-un vector cu 5 elemente:
v[l] pentru de caractere r. v[2] pentru de caractere 'V, v[3]
pentru de caractere 'X, v[4] pentru de caractere 'L' v[5] pentru
de caractere 'C'.
Programul.parcurge cele n valori pentru fiecare, de caractere
folosite prin determinarea intervalului i Se disting
cazurile: [100..399], [90..99], [50..89], [40..49], [10..39], [9], [5..8], [4], [1..3].
Pentru fiecare caz n parte, se contoarele necesare se scade
valoarea care inferior al intervalului. Calculul
cnd valoarea devine O.
19. Numim cu prioritate o de date care

inserare element la cozii;
inserare element la nceputul cozii;
extragere element de la cozii;
extragere element de la nceputul cozii;
accesarea elementului de la nceputul cozii;
accesarea elementului de la cozii.
Se vor utiliza cozi cu prioritate:
1) Coada a cu elemente de tip caracter, n care se vor insera succesiv caracterele
din ulterior cele specificate n din de intrare.
2) Coada b cu elemente de tip ntreg; b[l]=lungimea regulate care ncepe
cu i. Se vor implementa cozile a b ca doi vectori.
216
!!!!!!!!!
Pentru a putea realiza la nceputul la vectorilor, se va dubla
de memorie necesar pentru fiecare dintre cei doi vectori se. ncepe
inserarea elementelor de la mijloc. se n ordine toate caracterele
citit n coada a. Pentru a ordinea, fiecare nou caracter va fi inserat la
cozii. Cnd se o la cozii, iar pe ultima
n este paranteza se deduce se
o cu lungimea 2 mai mare dect cea deja pe
Prin urmare, se n vectorul b lungime se din coada
a cele paranteze. Cnd se la nceputul cozii a o
iar la nceputul cozii a era paranteza se o
cu 2 mai mare se ca n cazul
precedent.
20. Se va. memora ntr-un vector de de caractere numerele de nregistrare ale
p ordinea lor n tunel. citirea acestui vector, vor fi
identificate prin lor n vector (un cuprins ntre O N-l, unde N este
de La citirea despre ordinea de a din
tunel se va construi un vector denumit pozOut n care se va numerele de
identificare ale care ies din tunel. Pentru a determina de
care au efectuat n tunel, este suficient se determine de
inversiuni din acest vector. Mai exact i<j pozOutU] <pozOut[i], a avut loc
o
21. Se primul cu el se prima a celui de-al
doilea n nou format.
22. Se aduce la o valoare lui 500000000, n n
care se reprezentarea 1, 2 sau 3 caractere 'Z'.
500000000) este n cifre ordinului de
(unitatea, zeci, sute, ...). Toate cifrele se la fel, dar n de lor
n (unitatea, zeci, ...), rezultatul va fi diferit. este deci, n acest
caz, organizarea simbolurilor folosite. Astfel, acestea au fost organizate n perechi
ordinului de 1, V pentru X, L pentru zeci; C, D
pentru sute; M, P pentru mii; Q, R pentru zeci de mii; S, T pentru sute de mii; D,.B
pentru milioane; W,T pentru zeci de milioane; Y, Z pentru sute de milioane. La
parcurgerea de cifre vor fi tratate cele 9 cazuri, care vor da rezultate diferite
n de ordinul de al cifrei respective.
23. Se pentru a scrie numerele din intervalul [10
X
-
l
,l OX_l ] sunt necesare
x*9* lO
x
-
l
cifre. Se parcurg succesiv toate intervalele de forma [lO
X
-
l
, IO"-1].
n>lO
x
-l se la total de cifre necesare x*9*lOx-l de cifre
necesar pentru a. scrie toate cifrele din acest interval) se trece la
interval. OX-1, atunci din intervalul curent mai trebuie se adune
de cifre necesare pentru scrierea numerelor din intervalul [1Ox-l ,n],
x*(n_lO
x
-
l+l)
cifre.
217
!!!!!!!!!!!!
24. Fie Si rotit care ncepe la indexul i. Trebuie care este
n ordine Se vor mod n care se
la un turneu de tenis, turneului fiind
care este n ordine La un pas al turneului.: se

Fie n trei ABC. La pasul actual, trebuie comparat
BCA, unde A si Bau llingime:
Daca A <B, atllnciABC dintre ABC si BCA.
Daca-A' B, atunci BCA este dintreABCsiBCA.
Daca B,> atunci se ia ABC ca e ABC>
BCA, atunci C < A'deci la un moment lilterior al turneului, BCA ar fi
nfrnt de CAB sau de lui CAB, deci prin ignorarea lui BCA nu s'"a
final. Cnd Si cu
(practic care au fost. n()tate cu. ..La k a
care trebuie fOmpara,te vor fi cel mult 2
k
vorfi nl2
k
.de comparat. Deci, total de. runde l()g2 n.
25. Se un vector C cu = nu un
ncepe pe se pe i .un natural mai
mare ;de O,care va. reprezenta minim de cuvinte n care se poate
descompune care. ncepe .pe 1 . se pe i. Pentru a
calcula acest vector, se de
C[i] =min(C[j] + 1) ; j < i de la i apare n
Astfel, pentru a calcula C[ll se parcurge se. un cuvnt se
astfel nct de fie i se C[i]; Pentru
l11ai folosi un alt vector ni], care va reprezenta indicele
cuvntuluifolosit pentru a C[i].
26. Se termenii .. se. transforma dat n
bazalO.
27. Se principiul lui Dirichlet: se pun n obiecte n m cutii tm. <n)
va exista cel o cutie cucei rn/mlobiecte". (rl rotunjire

Astfel, se numerele: x, .xx, xxx ...., xxx... xxx (de n ori) 'se
restul la n: apare restul 0, s-a o altfel vor exista
numere cu resturi egale (nnumere generate [obiecte] resturi [cutii]),
care vor da un de forma x...x",-oO.. .0, multiplu al lui n.
28. Se intervalele. stnga se atribuie .. intervalului
ce.culoare este cea mai La
ambele. culori ntregul interval [1 .. .L].
29. Fie n, de cifre al B. Se toate numerele de lungime
cel mult n/2 se un palindrom, princoncateriarea
cu simetricul sau prin. concatenarea cu o cifra ntre 9 apoi
cu simetricul Fiecare palindrom astfel generat se este prim
intervalului [A, Bl.
218

30. Se .... .. .... ap9h.


se unesc n unul singur, cnd nu mai intervale
intersecteze. Primul va fi cel mai lung interval din cele care acum,
iarat.doilea: cea mai mare dintre intervale adiacente.
31. punctele negre linie n caz de egalitate, dupa
pentru a determina cte cuvinte, verticale Pentru a determina
cuvintelor .orizontale, se se algoritm. Pentru
fiecare linie, se parcurg punctele negre de pe linia se toate
de puncte albe dintre puncte negre; fiecare astfel de cu
lungime mai mare dect 1se considera lIl1 cuvnt.
32. Se unul cte unul se o De
fiecare cnd se o sau sau
aceasta se introduce n caracterul "*",atunci se
scoate caracterul din vrful stivei un astfel de caracter). n final (la
ntlnirea caracterului "E"), stiva. va pe ecran. Pentru averifica
un este parantezat.corect, acesta se parcurge de la stnga la se
o a doua se o
sau se introduce n o
caracterul din vrful stivei nu este o de
tip cu paranteza sau atunci se eroare.
Altfel, paranteza din vrful stivei se se trece la
caracter. nu s-a 'eroare n timpul parcurgerii lfinal stiva
este atunci este parantezat corect.
33. Un algoritm destul de eficient este se punctele x n
caz de egalitate, y. Pentru ca dreptunghiul arie

acesta. va avea
marginile sus jos la coordonate y care coincid cu coordonate ale unor
puncte; n caz contrar, dreptunghiul ar putea fi se puncte n
el. Astfel, se iau oricare coordonate y se toate dreptunghiuri le goale
marginite de acestea.
34. Se algoritmul clasic pentru determinarea celui mai lung comun.
Toate se construiesc n paralel cu determinarea lungimilor, Este nevoie de
un tablou de n care se toate cele mai lungi comune
ale (al. ai, ..., ai) (bI. b
2
, ... , b
j
) . cel mult 1000 de cele lungi
sub comune avnd lungimea cu 80 astfel, dimensiunea
tabloului este de 80 x 80. Acesta folosi memoria
Se numai linia cea sunt necesare n timpul
Astfel, este posibil se un tablou de dimensiune..2 x 80.
35. paranteze magice i se atribuie o mai ultimei,
i se atribuite cte paranteze nchise au mai
219
III Subprograme implementate n m a n i e r i t e r a t i v
Sectiunea 2.1.1
1. d) 6. b) 11. b) 16. e)
2. b) 7. d) 12. e) 17. e)
3. b),d) 8. a) 13. e) 18. b)
4. e) 9. e) 14. a) 19. a)
5. e) 10. b) 15. a) 20. c)
Sectiunea 2.1.3
1.
1 function det (x: integer) : integer;
2 var z,y:integer;
3 begin
4 y:=x;z:=x;
5 while not prim(y) do
6 inc(y);
7 while (z>l)and net prim(z)do
8 dec(z);
9 if (z<>l)and(x-z<y-x) then
10 det:=z
11 else
12 det:=y;
13 end;
3.
1 function cub(x: integer) :boolean;
2 var i:integer;
3 begin
4 i:=l;
5 while i*i*i<x do inc(i);
6 cub:=i*i*i=x;
7 end;
8
9 function poz(a:sir;n,k:integer);
10 byte;
11 var mx,j,nr,i:integer;
12 begin
13 mx:=O;
14 for i:=l ta n-k+l do begin
15 nr:=O;
16 for j:=i ta i+k-l do
17 if cub(a[j]) then inc(nr);
18 if nr>mx then begin
19 mx:=nr; poz:=i;
20 end;
21 end;
22 end;
220
!!!!!!!!
int det (int x)
{
int z,y;
y=x; z=x;
while (!prim(y))
y++;
while (z>l&& lprim(z))
Z--i
if ((zl=l)&&(x-z<y-x))
return z;
else
return y;
int cub(int x)
{
int i;
i=l;
while (i*i*i<x) i++;
return (i*i*i==x);
int poz(int a[],int n,int k)
{
int pz,mx,j,nr,i;
mx=O;
for (i=O;i<n-k+l;i++){
nr=O;
for (j=i;j<=i+k-l;j++)
if (cub(a[j])) nr++;
if (nr>mx) {
mx=nr; pz=i;
}
return pz;
}
4.
1 function
2 baza(b,x:integer):boolean;
3 var i: integer;
4 begin
5 baza: =true;
6 while x>O do begin
7 if x mod b>l then baza:=false;
8 x:=x div b;
9 end;
10 end;
11
12 procedure det(var a:sir;
13 n , b: integer) ;
14 var x,i:integer;
15 begin
16 x:=O;
17 i:=O;
18 w h i ~ ~ i<n do begin
19 if baza(b,x) then begin
20 inc(i);
21 ari] :=x;
22 end;
23 inc (x}.
24 end;
25 end;
5.
1 function cif(x:integer) :byte;
2 var i:integer;
3 begin
4 while x>9 do x:=x div 10;
5 cif:=x;
6 end;
7
8 procedure scrie(a:sir;n:byte);
9 var i, j :byte;
10 ok:boolean;
11 g:text;
12 begin
13 assign(g, 'nr.txt');rewrite(g);
14 for i:=O to 9 do begin
15 ok: =false;
16 for j; =1 to n do
17 if cif(a[j])=i then begin
18 write(g,a[j],");
19 ok:=true;
20 end;
21 if ok then writeln(g);
22 end;
23 close(g);
24 end;
int baza(int b,int x)
{
int bz;
while (x>O)
{
if (x%b>l) return O;
x=x/b;
}
return 1;
void det(int a[],int n,int b)
{
int x,i;
x=O;
i=-l;
while (i<n-l) {
if (baza (b,x))
i++;
a[i]=x;
x++;
}
}
int cif (int x)
{
int i;
while (x>9) x=x/lO;
return x;
void scrie(int a[],int n)
{int ok,i,j;
FILE *g=fopen( "nr. txt", "w");
for (i=1;i<=9ii++) {
ok=O;
for (j=O;j<n;j++)
if (cif(a[j])==i){
fprintf(g,"%d ",a[j]);
ok=l;
}
if (ok) fprintf(g, "\n");
}
fclose(g) ;
}
221
!!!!!!!!!!
8.
1 functian rest{a:sir;n,k:lJyte) :lJyte;
2 var s,i:integer;
3 begin
4 s:=O;
5 for i:=l to k do
6 s:={s+a[i])mod n;
7 rest: =s;
8 end;
9 procedure det{a:sir;u:byte;
10 var x,y:byte);
11 var z,i,j:byte;
12 r:array[O .. 100]of byte;
13 begin
14 for i:=O to 100 do r[i] :=0;
15 for i:=l to n do begin
16 z:=rest{a,n,i);
17 if z=O then begin
18 x:=l; y:=i;
19 end
20 else
21 if r[z]=O then r[z] :=i
22 else begin
23 x:=r[z]+l; y:=i;
24 end;
25 end;
26 end;
10.
1 function pfix{a: sir;n:byte).:
2 boolean;
3 var s,i:integer;
4 begin
5 pfix:=false;
6 for i:=l to n do
7 if [i]=i then pfix:=true;
8 end;
9 procedure perm{var a:sir;n:byte);
10 var i: byte;
11 begin
12 a[n+1] :=a[l];
13 for i:=l to n do ari] :=a[
14 end;
15 procedure scrie{a:sir;n:byte);
16 var j,i:byte;
17 begin
18 for i: =1 to n do begin
19 perm{a,n);
20 if not pfix{a,n) then begin
21 for j:=l to n do
22 write{a[j], , ');
23 writeln;
24 end;
25 end;
26 end;
222
int rest (int a [] ,iritn,int:. k)
{int s,i;
s=O;
for (i=O;i<=k;i++)
s={s+a[i])%n;
retums;
}
void det{int a[] ,int n,int
&x,int &y)
{
int z , i, j r r [10 O] ;
for (i=0;i<100;i++)
r[i]=-l;
for (i=O;i<n;i++)
{
z=rest{a,n,i);
if (z==O){
x=O; y=i;
}
else
if (r[z]==-l) r[z]=i;
else {
x=r[z]+l; y=i;
}
int pfix{int a[),intn)
{
int i;
for (i=O;i<n;i++)
if (a[i]==i+1) retum 1;
retum O;
}
void perm{int a[],int n)
{
int i;
a[n]=a[O] ;
for (i=O;i<n;i++)
a. [i ] =a [ i +1] ;
1.
,
}
}
}
11.
1 function suml(a:mat;n,l:byte):
2 integer;
3 var s,i:integer;
4 begin
5 s:=O;
6 for i:=l to n do s:=s+a[l,i];
7 suml:=s;
8 end;
9
10 function sume(a:mat;n,e:byte):
11 integer;
12 var s,i:integer;
13 begin
14 s:=O;
15 for i:=l to n do s:=s+a[i,e];
16 sume:=s;
17 end;
18
19 procedure scrie (a:mat;n:byte);
20 var j,i:byte;x:integer;
21 begin
22 for i:=l to n do begin
23 x:=suml(a,n,i);
24 for j:=l to n do
25 if x=sume(a,n,j)then
26 write(a[i,j],");
27 end;
28 end;
int suml(int a[10l'(10).,int n ,
int 1)
{
int s,i;
s=O;
for (i=O;i<n;i++) s+=a[l] [il;
return s;
int sume(int a[10] [10],int n ,
int c )
{
int s, i; ,
s=O;
for (i=O;i<n;i++) s+=a[i] [e];
return s;
void scrie (int a[10] [10] ;i:nt n)
{
int j,i,x;
for (i=O;i<n;i++) {
x=s\.l:ml (a, n , i)
for (j=O;j<n;j++)
if (x==sUIle(a,n,j))
eouta[i] [j]' ';
}
}
void det(int x,int y)
, .
r
(i=O;i<m;i++)
(a[n] [i]==max)
eouti+1'
{
int ],1.,max,Z;
max=O;
for (i=O;i<m;i++h{
z=nr(x,y,i); a[n] [i]=z;
if (z>max) max=z;
}
for
if
int nr(int x,int y,int e)
{
int s,i;
s=O;
for (i=O;i<m;i++)
if (a[i] [e]<xlla[i] [e]>y)
s++;
return s;
13.
1 function nr (x, y, e: byte): byte;
2 var s,i:integer;
3 begin
4 s:=O;
5 for i:=l to m do
6 if(a[i,e]<x)or(a[i,e]>y)then
7 ine (s);
8 nr:=s;
9 end;
10
11 p ~ o c e d u r e det(x,y:integer);
12 var j,i,max,z:integer;
13 begin
14 max:=O;
15 for i: =1 to m do begin
16 z:=nr(x,y,i); a[n+1,i] :=z;
17 if z>max then max: =z;
18 end;
19 for i:=l to m do
20 if a [n+1, i] =max then
21 write (i,' ')
22 end;
223
16.
1 procedure perm(var a:mat;
2 n,l:byte};
3 var s,i:integer;
4 begin
5 a[1,n+1]:=a[1,1];
6 for i:=l to n do
7 a [1, i] : =a [1, i +1] ;
8 end;
9
10 procedure solve (var a:mat;
11 n,k:byte);
12 var j,i:integer;
13 begin
14 for i:=l to n do
15 for j:=l to k do perm(a,n,i}
16 end;
17.
1 function exp(x,p:word} :byte;
2 var y:integer;
3 begin
4 y:=O;
5 while x mod p=O do begin
6 inc(y);
7 x:=x div p;
8 end;
9 exp: =y;
10 end;
11
12 function nrz(a:mat;m,l:byte}:
13 byte;
14 var n2,n5,i:byte;
15 begin
16 n2 : =0; n5: =0 ;
17 for i:=l to m do begin
18 n2:=n2+exp(a[1,i],2};
19 n5:=n5+exp(a[1,i],5};
20 end;
21 if n2<n5 then nrz:=n2
22 else nrz:=n5;
23 end;
24
25 procedure scrie(a:mat;n:byte};
26 var j, i: integer;
27 begin
28 for i:=l to n do
29 write(nrz(a,n,i},' '}
end;
18.
1 function baza:byte;
2 var bm,i,j:byte;
3 begin
4 bm:=a[l,l];
224
void perm(int a[10] [10],
int n,int 1)
{int s,i;
a[l] [n]=a[l] [O];
for (i=O;i<n;i++)
a[l] [i]=a[l] [i+1];
void solve(int a[10] [10] ,
int n , int k )
{
int j,i;
for (i=O;i<n;i++)
for (j=l;j<=k;j++)
perm(a,n, i);
int exp(long x,long p}
{
int y;
y=O;
while (x%p==O) {
y++; x/=p;
}
return y;
int nrz(long a[10] [10],int m,
int l}
{
int n2,n5,i;
n2=0; n5=0;
for (i=O;i<m;i++) {
n2+=exp(a[1] [il ,2};
n5+=exp(a[1] [i], 5};
}
if (n2<n5) return n2;
else return n5;
void scrie(long a[10] [10],int n}
{
int j,i;
for (i=O;i<n;i++)
coutnrz(a,n,i}' ';
int baza(}
{
int bm,i,j;
bm=a [ O] [O] ;
19.
for i:=l to n do
for j:=l to m do
if a[i,j]>bm then
bm:=a[i,j] ;
baza:=bm+1;
end;
function conv(b,l:byte):
longint;
var i,x:1ongint;
begin
x:=O;
for i:=l to m do
x:=x*b+a[l,i];
conv:=x;
end;
procedure scrie;
var j, i: integer;
begin '
j: =baza';
for i:=l to n do
write (conv(j, i) " ')
end;
"
function eva1(1:byte;s:string) :
longint;
var x,i,j:byte;
begin
x:=a[l,l];
for i:=2 to m do
if s[i-1]='+' then
x:=x+a[l,i]
else x:=x-a[l,i];
eva1:=x;
end;
function max:1ongint;
var i,mx:integer;
,begin
mx:=eva1(1,s);
for i:=2 to n do
if mx<eva1(i,s)then
mx:=eva1(i,s);
max:=mx;
end;
for (i=O;i<n;i++)
for (j=O;j<m;j++)
if (a[i] [j]>bm)
bm=a [i] [j] ;
return bm+1 ;
}
long conv(int b,int 1)
{
int i,x;
x=O;
for (i=O;i<m;i++)
x=x*b+a[l] [i];
return X;
void scrie ()
{
int J,l;
j=baza () ;
for (i=O;i<n;i++)
coutconv(j,i)' ';
long eva1(int 1, char *s)
{
int x,i,j;
x=a [1] [O] ;
for (i=l;i<m;i++)
if (s[i-1]=='+')
x=x+a [1] [i] ;
else x=x-a[l] [i];
return X;
}
long max()
{
int i,mx;
mx=eva1(O,s);
for (i=l;i<n;i++)
if (mx<eva1(i,s
mx=eva1(i,s) ;
return mx;
}
225
!!!!!!!!!!
Subprograme implementate n
Sectiunea 2.2.1
l. b) 7. a) 13. b) 20. c)
2. a) 8. b) 14. c) d) 21. a)
3. c) 9. d) 15. c) 22. b) c)
4. d) 10. c) 16. d) 23. b)
5. c) 11. b) 17. c) 24. a)
6. c) 12. a)b)d) 18. c) d) 25. b)
19. d) 26. d)
Sectiunea 2.2.3
1.
2.
226
!!!!!!!!!!!
function ok(x,i:longint):
boolean;
begin
if x=l then ok:=true
else
if x mod i<>O then ok:=false
else ok:=ok(x div i,i+1)
end;
functionnr(i:integer) :
integer;
var x:longint;
begin
if i<=n then begin
readln (x);
if ok(x,2) then
nr:=nr(i+1)+1
else nr:=nr(i+1);
end
else nr:=O;
end;
function cif(x:longint) :byte;
begin
if x<10 then cif:=x
else
cif:=cif(x div 10)
end;
procedure afis(c,i:byte);
var x:longint;
begin
if i<=n then begin
if cif(a[i)=c then
write(a[iL' Il;
afis (c , i+1);
end;
end;
int ok(long x,long
{
if (x==l) return 1;
else
if (x%i) return O;
else return ok(x/i,i+1);
int nr (int i)
{
long x;
if (i<=n) {
cinx;
if (ok(x,2
return nr(i+1)+1;
else
return nr (i+1) ;
}
else return O;
}
int cif (long x)
{
if (x<10) return x;
else
return cif(x/10);
}
void afis (int c,int i
{
long x;
if (i<n) {
if (cif(a[i)==c)
couta[i)' ';
afis(c,i+l);
}
}
3.
function nr(x:longint) :byte;
begin
if x=O then nr:=O
else
if x mod 2=0 then
nr:=nr(x div 10)+1
else nr:=nr(xdiv 10)
end;
procedure sortare(i,j:byte);
var x:longint;
begin
if i<n then
if j<=n then begin
if (nr(a[i]nr(a[j]))or
(nr(a[i])=nr(a[j]))and
(a[i]>a[j]) then

:i; =a [i] ; a [i] : =a [j ] ;
a [j] : =x;
end;
sortare(i,j+1)
arid
else
end;
int nr(long x)
{
if (x==O) return O;
else
if (x%2==0)
return nr(x/10)+1;
else return nr(x/10);
void sortare(int i,int j)
{
long.x;
if (i<n-1)
if (j<n) {
if (nr(a[i]nr(a[j]) I I
nr(a[i])==nr(a[j])&&
a[i]>a[j])
{
x=a [i] ; a [i] =a [j ] ;
a[j]=x;
}
sortare(i,j+1);
}
elee sortare(i+1,i+2);
4.
6.
function p(x:longint) :longint;
begin
if x=O then p:=l
else
ifx mod 2=lthe1'l
p:=p(x div 10)*x mod 10
else p:=p(x div 10)
end;
procedure del(var a:sir;
i:byte;var n:byte);
var x:longint;
.begin
if 'i<n then begin
a [il : =a [i+1] ;
del(a,i+1,n)
end else n: =n-T;
end;
long p(long x)
{
if (x==O) return 1;
else
if (x%2==1)
return p(x/10)*x%10;
elee return p(x/10);
void del(long a[],int i,
int &n)
{long x;
if (i<n-l){
a [il =a [i+1] ;
del(a,i+l,n) ;
}
else
function cmax(x:longint):byte;
begin
if x=O then cmax:=O
elee
if x mod 10>cmax(x div 10)
then cmax:=x mod 10
elee cmax:=cmax(x div 10)
end;
int cmax(long x)
{
if (x==O) return O;
elee
if (x%10>cmax(x/10))
return x%10;
elee return cmax(x/10);
227
!!!!!!!!!!!
function delcif {x, c:longint) :
longint;
begin
if x=O then delcif:=O
else
if x mod 10=c then
delcif:=delcif{x div 10,c)
else
delcif:=10*delcif{x div 10,c)+
x mod 10;
end;
' ~ e s{var a:sir;i,n:PYte);
var x:longint;
begin
if i<=n then begin
a[i]:=delcif{a[i],cmax{a[i]));
s{a,i+1,n)
end
end;
long delcif{long x,int c)
{
if (x==O)return o;
else
if (x%10==c)
return delcif{x/10,c);
else
return
10*delcif{x/10,c)+x%10;
void s{long a[],int i,int n)
{
long x;
if (i<n)
{
a[i]=delcif{a[i],cmax{a[i]));
s (a, i +1 t n) ;
7.
228
function pal {x,y:integer;var
z:integer) :boolean;
begin
if x=O then pal:=y=z
else begin
z:=z*10+x mod 10;
pal:=pal{x div 10,y,z)
end;
end;
function search{x,t:integer):
integer;
var z:integer;
begin
z:=O;
if pal{x,x,z) then search:=x
else search:=search{x+t,t);
end;
procedure s{var a:sir;i,n:PYte);
begin
if i<=n then begin
if (search{a[i],l)-a[i] <
a[i]-search{a[i] ,-1))
then ali] :=search{a[i] ,1)
else ali] :=search{a[i] ,-1);
s{a,i+1,n)
end
end;
int pal{int x,int y,int&z)
{
if (x==O) return (y==z);
else {
z=z*10+x%10;
returnpal{x/10,y,z) ;
}
}
int search{int x,int t)
{
int z;
z=O;
if (pal{x,x,z)) return x;
else
return search{x+t,t);
void s{int a[],int i,int n)
if (i<n) {
if (search{a[i] ,l):-a.[i]<
a[i]-search{a[i] ,-1))
a[i]=search{a[i] ,1) ;
else
a[i]=search{a[i] ,-1);
s{a,i+1,n);
10.
function nr(i,t:integer):
longint;
begin
if (i=O)or(i>n) then nr:=O
else nr:=lO*nr(i+t,t)+a[i]
end;
function cub(x,i:longint):
boolean;
bagin
if i*i*i=x then cub:=true
else if i*i*i>x then
cub:=false
else cub:=cub(x,i+l);
end;
long nr(int i,int t)
{
if (i==O II i==n) return O;
else
return 10*nr(i+t,t)+a[i];
int cub(long x,long i)
{
if (i*i*i==x) return 1;
else if (i*i*i>x) return O;
else
return cub(x,i+1);
11.
12.
function inv(x:longint;
'var y:longint) :longint;
bagin
if x=O then inv:=y
else bagin
mod 10;
inv:=inv(x div 10,y);
end;
end;
procedure S(i,x:longint);
var y,z:longint;
begin
if i<x then begin
y:=O; z:=inv(i,y);
if (i+z=x)and(i mod 10<>0)
then writeln(i,' ',z);
S(i+1,x);
end;
end;
function Sd(x,i:word) :word;
begin
if i>x div 2 then Sd:=O
else
if x mod i=O then
Sd:=Sd(x,i+1)+i
else Sd:=Sd(x,i+1);
end;
procedure Make(i:byte;
var b,d:sir;vark,l:byte);
begin
if i<=n then bagin
if Sd(a[i],l)=a[i] then
long inv(long x,long &y)
{
if (x==O) return y;
else {
y=y*lO+x%lO;
return inv(x/10,y);
}
}
void S(long i,long x)
long y,z;
if (i<x) {
y=O; z=inv(i,y);
if (i+z==x && i%10)
couti' 'zendl;
S (i+l,x);
}
long Sd(long x,long i)
{
if (i>x/2) return O;
else
if (x%i==O)
return Sd(x,i+1)+i;
else return Sd(x,i+1);
}
void Make(int i,long of],
long d[],int &k,int &1)
{
if (i<n) {
if (Sd(a[i] ,1)==a[i])
229
16.
begin
inc (k);
b[k] :=a[i];
end
else begin
inc(l);
d [1] : =a [i] ;
end;
Make(i+1,b,d,k,l);
end;
end;
function fact(x:byte) :longint;
bagin
if x=O then fact:=l
else fact:=x*fact(x-1)
end;
function SUIll. (x: integer) : longint;
begin
if x=O then sum:=O
else sum:=fact(x mod 10)+
sum(x div 10)
end;
function prod(i:integer) :longint;
var x:integer;
begin
if i>n then prod:=l
else begin
read1n (x) ;
if sum(x)=x then
prod:=prod(i+1)*x
else
prod: =prod (i+1)
end;
k++;
b[k] =a [il ;
}
else {
1++;
d[l] =a[i];
}
Make (i +1, b, d, k , 1) ;
}
}
long fact(int x)
(
if (x==O) return 1;
else return x*fact(x-1);
}
long sum(int x)
(
if (x==O) return O;
else return
fact(x%10)+sum(x/10) ;
long prod (int i)
{int x;
if (i>n) return 1;
else (
cinx;
if (sum(x)==J{)
return prod(i+1)*x;
else
returnprod(i+1);
17.
function T(x:1ongint) :longint;
begin
if x=l then T:=O
else T:=x-T(x-1);
end;
procedure M(i,j:byte;
var a:mat);
begin
if i<=n then
if j<=n then begin
a [ i , j ] : =T(n * (i -1 ) +j ) ;
M(i,j+1,a) ;
end
else M(i+1,l,a);
end;
long T(long x)
(
if (x==l) return O;
else return x-T(x-1);
}
void M(int i,int j,
int a[10] [10])
{
if (i<n)
if (j<n) (
a[i][j]=T(n*i+j+1);
M(i,j+1,a) ;
}
else M(i+1,O,a);
}
230
18.
19.
function ok(x,i:longint):
boolean;
beg-in
if i>x div 2 then ok:=true
else
if x mod i=O then ok:=false
else ok:=ok(x,i+1)
end;
procedure inv(l,i:byte);
var x:integer;
beg-in
if i<=m div 2 then beg-in
x:=a[l, i];
a[l,i] :=a[l,m-i+1];
a[l,m-i+1] :=X;
inv(1,i+1);
end;
end;
procedure pl(i:byte) ;
beg-in
if i<=n then beg-in
if ok(a[i,l],2)then
LnvI'i. ,1) ;
pl(i+1);
end;
end;
function 81(i,j:byte) :integer;
bag-in
if i<=(n+1) div 2 then
if j<=n-i+1 than
81:=81(i,j+1)+a[i,j]
alsa 81:=81(i+1,i+1)
elsa 81:=0;
and;
function 82(i,j:byte) :integer;
bag-in
if i<=n than
if j<=i then

alse 82:=82(i+1,n-i)
alsa 82:=0;
end;
function 83(j,i:byte) :integer;
bag-in
if j<=(n+1) div 2 than
if i<=n-j+1 then
83:=83(j,i+1)+a[ ,j]
elsa 83:=83(j+1,j+ )
else 83:=Oi
endi
int ok(int x,int i)
{
if (i>x/2) raturn 1;
else
if raturn Oi
else return ok(x, i+1)i
}
void inv(int l,int i)
{
int x;
if (i<m/2) {
x=a[l] [i];
a[ll.[i] =a[l] [m-i-1] ;
a [1] [m-i-1] =Xi
inv(l,i+1);
}
}
void pl (int i)
{
if (i<n)
{
if (ok (a [i] [O] ,2) )
inv(i, O) ;
pl (i+1) ;
}
}
int 81(int i,int j)
{
if (i<=n/2)
if (j<=n-i-1)
raturn 81(i,j+1)+a[i] [j];
alsa return 81(i+1,i+1);
else return O;
}
int 82(int i,int j)
{
if (i<n)
if (j<=i)
return 82 (i, j+i ) +a [i] [j] ;
else return 82(i+1,n-i-2);
else return O;
}
int 83(int j,int i)
{
if (j<=n/2)
if (i<=n-j-1)
return 83 (j , i +1) +a [i] [j] ;
else return 83(j+1,j+1);
alse return Oi
}
231
20.
21.
232
!!!!!!!!!!.
function S4(j,i:byte) :integer;
begin
if j<=n then
if i<=j then
S4:=S4(j,i+l)+a[i,j]
else S4:=S4(j+l,n-j)
else S4:=0;
end;
procedure OrdL(i,j,l:byte);
var x:integer;
begin
if i<m then
if j <=m then begin
if a[l,i]>a[l,j] then begin
x:=a[l,i]; a[l,i] :=a[l,j];
a[l,j] :=x;
end;
OrdL(i,j+l,l);
end
else OrdL(i+l,i+2,1);
end;
procedure OrdC(i,j,e:byte);
var x:integer;
begin
if i<n then
if j<=n then begin
if a[i,e]>a[j,e] then begin
x: =a li, e] ;a[i, e] : =a[j, c l ;
a[j, e] :=x;
end;
OrdC(i,j+l,e);
end
else OrdC(i+l,i+2,e);
end;
:function S_e(x,i:integer) :byte;
begin
if x=l then S_e:=O
else
if x mod i=O then
S_e:=l+S_e(x div i,i)
else S_e:=S_e(x,i+l)
end;
procedure Diag(i,j:byte);
var x:integer;
begin
if i<=n then
if j<=n then begin
a[i,j] :=S_e(a[i,j] ,2);
Diag(i,j+l)
end
else Diag(i+l,n-i+l);
end;
int S4(int j,int i)
{
if (j<n)
if (i<=j)
return S4(j,i+l)+a[i] [j];
else return S4(j+l,n-j-2);
else return o;
}
void OrdL(int i,int j,int 1)
{int x;
if (i<m-l)
if (j<m)
{
if (a[l] [i]>a[l] [j] ) {
x=a[l] [i]; a[l] [i]=a[l] [j];
a[l] [j]=x;
}
OrdL (i , j +1, 1) ;
}
else OrdL(i+l,i+2,1);
}
void OrdC(int i,int j,int e)
{int x;
if (i<n-l)
if (j<n)
{
if (a[i][c]>a[j][c]){
x=a [ i] [e] ; a [i] [c] =a [ j] [c] ;
a[j] [e]=x;
}
OrdC(i,j+l,c);
}
else OrdC(i+l,i+2,c);
int S_e(int x,int i)
{
if (x==l) return O;
else
if (x%i==O)
return l+S_e(x/i,i);
else
return S_e(x,i+l);
}
void Diag(int i,int j)
{int x;
if (-cn)
if (j<n)
{ a[i][j]=S_e(a[i][j],2);
Diag(i,j+l);
}
else Diag(i+l,n-i-l);
}
22.
23.
functionT(x,i:longint):booleani
beg-in
ifi>x div 2 then T:=true
else
if x mod i=O then T:=false
else T:=T(x,i+l);
end;
procedure M(i,j,v:byte);
beg-in
if i<=n then
if j<=n then beg-in
if T(v,2) then beg-in
a[i,j] :=Vi
M(i,j+l,v+l); end
el se M( i , j , v+1) ;
end
elseM(i+l,l,v+l);
end;
procedure Morse(s:string-);
beg-in
if then
writeln(s)
else beg-in
Morse(s+'-');
Morse(s+'. ');
end;
end;
int T(long- x,long- i)
{
if (i>x/2)return 1;
else
if (x%i==O) return O;
else return T(x,i+l);
}
void M(int i,int j,int v)
{
if (i<n)
if (j<n){
if (T(v,2{
ari] l i l>v:
M(i , j +1 , v+1) ; }
else M(i,j,v+l);
}
else M(i+l,O,v+l);
}
void Morse(char s[])
char x[256];
if (strlen(s)==n)
coutsendl;
else {
strcpy(x,s);x[strlen(x)]='-';
Morse (x) ;
strcpy(x,s);x[strlen(x)]='.' ;
Morse(x);}}
Sectiunea 2.3.2
1. Pornind de la de numere, se va construi un tablou A, n care Ai
de strict de lungime care ncep cu
elementul din i. Acest tablou se folosind rezolvarea problemei
strict de lungime deci se va construi n paralel un
tablou L, unde Li lungimea celui mai lung strict care
ncepe pe i. Fie MAX valoarea din L. Suma elementelor din A,
elementelor maxime dinL, total de
strict de lungime Ne al K-Iea astfel de
il primei a lui MAXn L, i2 celei de-a doua
Au 2:: K, .. atunci este al K-Iea strict maxima!
care ncepe pe il. Au :::; K :::; A
u
+ Ai], atunci ncepe cu
etc. ce a fost primul element al sub se
al doilea element,. apoi al treilea, etc. Metoda este Se impune
de exemplu, ncepe cu i3, se al
(K ..A
u
+ A
i2
) . -lea maximal care ncepe. i3, are
lungimea MAX-l, iar primul element al este mai mare dect elementul de pe
i3. Acest se folosind procedeu.
233
!!!!!!!!!!!
2. Se pentru fiecare element, lungimea celui mai lung strict
care se cu el lungimea celui mai lung
care ncepe cu el(vezi de la problema pentrudetalii),
n a astfel de. de (unul unul
pentru doi de (eventual identici)
eliminarea din primul privesc spre stnga, spre
dreapta. Primul se nainte de a ncepe al doilea. Seau nvedere.
cazurile particulare.
3. Un are aspect de munte pe primele se cifre.n ordine
iar pe ultimele se cifre n ordine Pentru a
rezolva problema se va determina, pentru fiecare n parte, lungimea celui mai
lung care se cu cifra precum lungimea celui
mai lung care ncepe n dreptul cifrei respective. Pentru fiecare
se va calcula sumele celor lungimi, iar "vrful" muntelui va fi dat de
cifra pentru care suma este problemei va fi de dintre
de cifre al dat suma la care se va valoarea
1. Valoarea 1 trebuie deoarece "vrful" muntelui este considerat de
ori: n n
4. Se ordinea n care vor fi aranjate culorile n (sunt C! variante), iar
pentru fiecare ordine se minim de care se vor muta. Pentru
a genera toate de ordonare, se poate considera fiecare ntre. 1
Cl, fiecare reprezentnd indicele unei acestea ar fi sortate
lexicografic; decodificarea se face problemei
complementare (vezi capitolul 1.3.1, problema Pentru a determina
se cel mai lung cont de ordinea
rezultatul fiind de elemente - lungimea celui mai lung
alege cel mai bun rezultat.
5. Se pentru primul. grup va trebui o a numerelor
N: Pentru al doilea grup, dintre cei k va trebui
se o cu valoarea k. pentru al doilea grup
este pentru o valoarea k strict mai dect n. Practic, la fiecare
pas se va rezolva pentru valori din ce n ce mai mici n
momentul n care nu mai nici un la fiecare pas vatrebui se
determine o a unei cu k elemente a fie
cu k: n acest scop se va folosi principiul cutiei lui Dirichlet.: Se vor calcula sumele
Si==- aj+ a2+".+ ai folosind formula re Si= ai+ Si-1. Potrivit principiului
cutiei lui Dirichlet (vezi capitolul 1.3), resturile valorilor Si la k sunt
distincte, atunci unul dintre aceste resturi este. O. Potrivit principiu,
resturile nu sunt distincte, atunci dintre acestea. sunt egale. resturile
valorilor S; Sy (x <y) sunt egale, atunci restul valorii SrSx la
k esteO. valoarea ax+j +a
x+2
+ ... + a
y
va fi cu k.nconc1uzie, va
exista ntotdeauna posibilitatea de a alege o a fie
cu k. alegerea acestei ea nu toatecele k
234
!!!!!!!!!!!!!
elemente, va trebui se rezolve pentru o valoarea strict mai
dect k (elementele respective sunt eliminate).
6. poate fi folosind principiul cutiei llli Dirichlet.
Se va concatena format din cifrele date. cu el n momentul n
care Iarz va fi Osau se un rest a mai fost la un
pas anterior. Pe baza principiului, sigur se va ajunge n una dintre cele
cel mult n s-a restul O, s-a un rezultat. nu,
rezultatul va fi dat prin simpla a celor numere care duc la
rest prin la n. cele resturi se la p q,
atunci n simpla nlocuire a ultimelor k*(q-p) cifre ale rezultatului
cucifra O(care face parte cu dintre cifrele date). Rezultatul nu poate
cu cifra O. Pentru a evita este suficient ca, n cifrelor
date, nu se cifra Ope prima
7. n este un natural a este un care puterile la care apar
factorii primi din descompunerea lui n, atunci divizorilor lui n este:
k
I,(a
i
+1)
i=O
acestei teoreme este foarte n i se ai
al puterilor la care apar factorii primi din descompunerea sa. Astfel, divizor
i va corespunde un element al produsului cartezian XI * X
2
*... * X
k
, unde Xi = {O,
1, ..., ai}, iar elementelor acestui produs cartezian este exact suma de mai
sus.. De fapt, nu trebuie luate n considerare toate numerele prime, fiind
suficiente doar cele mai mici. n continuare, se va presupune s-au ales primele
15 numere prime. La nceput, se vectorul d al divizorilor n; se
acest.vector are m elemente. Se o matrice A cu 15 linii
m coloane, A
ij
avnd valoarea cu cel mai mic care are ca factori primi
primele i numere prime avnd clj divizori. Rezultatul cerut va fi valoarea
de pe ultima a matricei. Primul element al linii (Au) va avea
valoarea 1, deoarece 1 este cel mai mic cu un singur divizor; Ao.Foo,
deoarece nu numere cu idivizori niciun factor prim. Elementul A
i j
poate
fi calculat folosind valorile Ai-l,h pentru k <j d
k
este divizor al lui dj- Ai-l,k are d
k
divizori, deci o valoare A
i

j
cu clj divizori poate fi calculnd valoarea:
A . pdj/dk+1
i-l,k i
unde Pi este al z-lea prim. Valoarea A
i j
va fi ca fiind minimul acestor
valori. valoare este mai mare dect A
i
-
1j
, atunci A
ij
va primi
valoarea A
i
-
1j
, Deoarece ar trebui se lucreze cu numere foarte mari, n program
se va determina logaritmii naturali ai valorilor A
i j
, iar n final valoarea
a minimului de pe ultima a matricei folosind cu numere mari.
8. poate fi foarte un devalori
booleene care indice o poate sau nu fi
sunt cel mult 100 de numere ale valori sunt cel mult 1000, suma
care poate fi este 100.000, deci ar fi nevoie de100.001valbri.
235
se va considera nu poate fi dect suma O. n continuare, Ia
fiecare pas, se va lua. n considerare un Se va parcurge sumelor
la pasul anterior pentru fiecare cu valoarea 1, la suma
se. va curent. Rezultatul va. reprezenta o
care,poate fi cu Se se parcurge de la
stnga la dreapta (ncepnd cu valoarea O), n momentul n care. valoarea
unei sume devine 1, aceasta este n atunci
cnd se va ajunge la nu se va putea valoarea a fost
la pasul curent sau la un pas anterior. Problema este prin simpla
parcurgere a de la dreapta spre stnga (dinspre suma spre O).
Fiecare valoare se va afla la dreapta curente, deci nu va mai fi
la pasul curent spre stnga.
9. Se o de a unui mare cu un mic
se (care va realizaun logaritmic de
.
{
a
1l/ 2
a"? n par
aII = '
a
ll
- ] a, n impar
10. Se pentru calcularea ariei unui triunghi
determinat de trei puncte ale coordonate sunt ntregi:
l(x
2
-X])'(Y3 - y])-(x
3
-.X])(Y2 - Y])I
2
De asemenea, se paritatea ariei este de paritatea celor
coordonate. Din acest motiv, se vor punctele n patru categorii (ambele
coordonate pare, ambele coordonate impare, prima iar a doua
prima iar a doua Se vor punctele din
fiecare categorie se va calcula pe baza unei formule simple modul n care se pot
alege puncte din diferite categorii pentru a un determinant par.
11. Pentru fiecare se va tangenta unghiului format de
dreapta care o de origine cu axa Se vor alege apoi particulele
pentru care se cea mai cea mai mare valoare a tangentei se va
determina unghiul format de dreptele care unesc cele particule de origine.
Trebuie observat faptul n locul tangentei se poate utiliza orice f care
ordinea (n cazuln care a < b, avem mtotdeaUl1a fie j{a) <; j{b), fie
j{b) < j{a. se pot utiliza sinus sau cosinus, dar altele care
satisfac proprietatea
12. Problema cere se determine o care mparte o de puncte n
cu cardinal. Pentru a rezolva problema, se punctele
n de coordonata x se ia. ca dreapta care . trece prin
punctul cu indexul n din.. sortat al punctelor. Este. evident
cel n puncte pe ea stnga ei, dar mai cel npuncte
pe ea n dreapta ei.
236
!!!!!!!!!!
13. un punct se in interiorul piramidei, pe una din pe una din muchii
sau..este un vrf, . atunci suma.volumelor celor ... patru piramide determinate. de
punctul respectiv grupuri de trei vrfuri ale piramidei este cu volumul
piramidei. Volumul unei piramide se poate afla cu formula (Ariebaza*H)/3.
14. Algoritmul de rezolvare al acestei probleme .este foarte simplu: se
cel mai mare (2*n) se perechea lui, parcurgnd valorile n ordine
determinarea pereche, acesta se ca
fiind utilizat. Se cu valori neutilizate (2*n':1, 2*n-2, ...),
pentru care se perechile n mod. Numerele pereche determinate la
fiecare pas se ca fiind. utilizate. nu mai sunt folosite pentru
determinarea unei alte perechi. n final, se vor toate cele n perechi. nu
se o a acestui fapt, algoritmul descris
toate perechile cel' pentru toate valorile ,1 .cuprinse ntre 1 16383.
nordine (de la 1la 2*n), nu sunt determinate toate
cden perec1i,
15. fiecare pas se scoate un element din lista trebuie se un
element cu un index. elementul .:eliminat la pasul curent k era la
i, atunci elementul pentru eliminate la pasul este pe
(i-1+k) mod (n-i)+1). Pentru a realiza eficient, se va folosi un
Nr[i] cu elevi cu de ordine ntre i i+[-Jn] mai sunt n
Pentru a elimina un element de index p din trebuie
p-[-Jn] ... pailui Nr. Pentru a. elementul al p-Iea ce nu a fost eliminat, se
parcurge n salturi de [-Jn] se ajunge la unindex i, astfel nct al p-lea element se
ntre i i+[-Jn], deci pentru celui de-al p-Iea element ce nu a fost
eliminat.se-fac maxim 2*[-Jn]
16. Se o matrice auxiliara C astfel nct elementul de pe (iJ) va
n cazul n care n labirint la se poate ajunge nu este zid,
lungimea a drumului de la ea la de plecare. toate
elementele vor fi cu -1, cu punctul de plecare, care va fi
cu O. n momentul n care se valoarea unui element aflat
pe prima linie sau pe prima sau pe-ultima linie sau pe ultima
fiecare element din matrice va primi valoarea a vecinilor la care se
Ln momentul n care se un element de pe margine, s-a o
Pentru a reconstitui drumul se va folosi o determinnd la
fiecare pas vecinului unui punct (i, j) din matrice, pentru care valoarea este
C[i,}l:1; apelurile recursive se ncheie cnd se ajunge la punctul
17. Pentru a afla probabilitatea trebuie aflat cte numere n intervalul
[A..B}cucel K cifre de C. Pentru asta se va construi o f(x) care va
returna cte numere sunt n intervalul [O..x-I] care au cel K cifre de C. Astfel,
rezultatul va fi f(B+l)-f(A). f(x) va parcurge x cu
adunnd la fiecare pas cte numere care impuse au ca
prefix cifrele din x fixate acum. Ca se realizeze acest lucru este nevoie de

237
Nrti, }) .=;:. cte numere ntre O IOi-1 cifre de.C' (se va considera
numerele pot avea O-uri n de exemplu: 0003 are3 cifre de.O).
Acest se poate calculacu o de de variabila
C): Nr(i,}) = 9 *Nr(i-l,}) +Nr(i-l,}-l).
De asemenea, mai este nevoie de
NrO(i, j);;;;;: cte numere care nu au O-uri n ntre O IOi-1 cifre de C.
de va fi n de C:
C=O atunci NrO(i, j}f"-NrO(i-l, j} + 9 * Nr(i ... l, j}
altfel NrO(i,j}t-NrO(i-l, j} + 8 * Nr(i-l,j} + Nr(i-l, j-l}
disponibile se poate realiza destul de f(x),
acordnd la cazurile care pot
18. Cum triunghiurile echilaterale au toate unghiurile toate laturile egale, se
poate calcula .. folosind formule matematice, unde se al treilea. punct
pentru a forma un triunghi echilateral, se puncte.. Astfel,
rezolvarea se reduce la ncercarea pereche de puncte, la calcularea celui
de-al treilea punct, la verificarea acestuia; .pentru a realiza
verificare eficient, se punctele la nceputul programului, iar cnd se va
un punct se va realiza o
19. Se va folosi o care n se ajunge la
coordonatele (x,y), punctele.sunt parcurse n ordinea de curba de ordink.
Se mparte curba de ordinul k n patru curbe de ordinul k-l se din ce
provine (x,y), apoi se face un apel recursiv. Procedura se cnd se
ajunge la o de ordinull.
20. Nu se pot genera toate primele P limitei mari pentru P, se
va binar celei de a P-a pe baza faptului de
ireductibile cu numitorul N cu :s x fixat, cu
x. problema se reduce la determinarea de
ireductibile cu numitorul N, cu :s x fixat. Pentru a realiza acest
lucru, se vor cte reductibile cu numitorul N cu :s x
folosind principiul includerii excluderii:
It n n
UA
i
= LIAil- LIA
i
nAjl+ LIA
i
n
A
j n
A
k\-
... +(-ly-1. nAi
i=1 i=1 1'Si<j'Sll 1'Si<j<k'Sll i=1
Ai vor reprezenta de divizibili cu al i-Iea
prim care este divizor al lui N (se iau divizorii lui N pentru a
reductibile - este evident nu sunt necesari divizorii, ci numai cei primi -
sunt maxim IOpentru limita lui N din
21. Se vor construi doi vectori:
P[i] = minim de persoane necesare pentru a i;
S[il = minim de necesari pentru a eficienta i.
238
!!!!!!!!
Se iau toate grupurile posibile de x .persoane, dintre care y se
valorile P[i+(x...y)*y] S[i+(x-y)*y] n deP[ihi S[i] ..
22. Problema cere determinarea de lurigimej\T'care
K monotone Se va nota. acest ntr-o
permutare de lungime N-l cu K monotone, elementul cu
fi introdus n K locuri anume la monotone, pentru a
forma o' permutare de lungime N existe tot K monotone. ntr-o
permutare de lungime N-l cu K-l monotone, se poate insera ca nainte
elementul N n K-l locuri pentru a tot K-l monotone, deci >n
celelalte N-K+1 locuri, inserarea lui N va produce o permutare de lungime N cu K
monotone,deoarece seva sparge o n
monotone mai mici. Astfel, se de
A(n,k) =k*A(n-l,k) +(n-k+l)*A(n:l,k-l).
23. {l ,2,...,n} este

se
{1,2,...,n} care ncep cu un
oarecare x sunt n de 2
n
-
x
de ordine al unei a
{1,2,...,n} care ncepe cu x este cel 2 n-!+2 n-2 +... +2 n-x+! cel mult 2 n-l+2
n
-
2
+... +2 n-x_I. se pentru Aceasta
va trebui fie o a {1,2,...,n-l}. Pentru a realiza acest
lucru.jse.scade cte o unitate din fiecare al ..
este n cazul n care se elementele unei
sunt ordonate Folosind sus, se poatedetefllliga
Folosind un se
poate realiza
24. Pentru a nchide prima trebuie se execute 1 click +
de click-uri necesare pentru a nchide ferestrele deschise prima
care din dreapta-sus al ferestrei.
25. n Sol[J,F,M,A] se va valoarea a unei echipe formate din F
M A folosind numai primii J Pentru
stabilirea valorilor Sol[J] este nevoie de valorile Sol[J-l]. La va fi n
Sol[ij,4,4,2].
26. Algoritmul de rezolvare al 'problemei este
Se va lli(l.fiecare punct' n parte, axelor de c()ordonate.
Fie M acest punct (M
x
, M
y
) coordonatele sale Pentru fiecare punct
P, coordonatele sale vor deveni (Px-kfx, Py-M
y);
Se pentru fiecare punct P, unghiul pe care:segmentul. MP l
cu axa Ox;
Se punctele valoarea unghiului calculat pasul
n astfel .. cea mai '. mare depulJ-cte, cu iiPIJ.ghil.l1
caracteristic identic, cu punctul M va reprezenta.
de puncte coliniare din care face parte M.
239
27. n generarea comutatoare de pe prima linie a
panoului. n acest mod, pe a doua linie vor trebui doar acele comutatoare
care vor stinge becurile de pe prima linie. Se va parcurge astfel panoul se
de pe ultima linie. toate becurile de pe ultima linie sunt
stinse, s-a o Dintre toate aceste se va aceea
cu minim de
28. N are maxim 2*Nl!2 divizori. se descompune N n
factori primi,atunci se poate scrie n forma PIEI*P2
E2*
...*p,tEk, unde P1, P2, ..., Pk
sunt numere. prime EI,E2, ..., Ek sunt numere naturale mai mari ca zero. Un
divizor al lui N va fi reprezentat printr-un vector de (el. e2, ..., ek), unde
OS:.e6:Ek. Prin urmare, problema poate fi la
vectorii (el, ez, ..., ek), unde OS:.e(5Ek,ntr-un cu proprietatea
ntre doi vectori consecutivi se la o a vectorilor cele
elemente ale vectorilor de pe prin o unitate.
este o generalizare a codului Gray poate fi
modificnd una din metodele folosite pentru a genera codul Gray. Se presupune
se se genereze o pentru M=N/(p,tEk) (o pentru un cu k-
1 factori primi). Fie C, vectorul pentru M R, vectorul C inversat (primul
element al lui R este ultimul al lui C, etc.). O pentru N poate fi n
C, Pk*R, re-c. PlC*R '"
Astfel, s-au concatenat Ek coduri pentru M, cu Pk pe fiecare
s-a pus pentru M.
2.9. Pentru a rezolva toate liniile cu zerouri
la nceput, se vor genera primele 8 linii: la cea mai putere a lui 2:
1 1
1 1 1 1
101101 o
1111 1111
10001 10001000
110011 11001100
1010101 10101010
11111111 11111111
Se a doua a linii este cu prima Mai
mult, elementele din prima a unui rnd cu 2
K
elemente completare)
sunt identice cu elementele aflate cu 2
K
-
I
rnduri mai sus s-ar completa
rndurile respective cu suficiente zerouri). Pentru a valida aceste se
poate demonstra prin sunt valabile n tot tabelul. n acest
-, moment, ideea de rezolvare devine destul de pentru a genera linia N se
se "prima (este vorba despre
completarea la o putere a lui 2).
Pentrlf. a genera "prima se recursiv avnd ca
un nou N, care se din vechiul N cea mai mare putere a lui
2, mai dect el. alte variante de rezolvare eficiente, toate exploatnd
descrise mai sus.
240
!!!!!!