This is an old revision of the document!
Rezolvare subiecte admitere - varianta 41
Exercitiul 1
Numim graf complementar al unui graf neorientat $ G$ graful neorientat $ G_1$ cu aceeasi multime a nodurilor ca si $ G$ si cu proprietatea ca doua noduri sunt adiacente in $ G_1$ daca si numai daca nu sunt adiacente in $ G$ . Daca $ G$ are $ n$ noduri si $ m$ muchii, cate muchii are $ G_1$ .
a) exact n(n-1)/2-m
b) exact n-m
c) exact (n-1)/2
d) minimum n(n-1)/2-m
e) minimum n-m
f) maximum n(n-1)/2-m
Solutie
Explicatii: ce este un graf neorientat, complementar, complet la ce se refera adiacenta.
Rezolvare: Intr-un graf complet se gasesc n(n-1)
muchii orientate, cu conditia ca o muchie sa nu poata avea acelasi nod ca sursa/destinatie. Asadar avem n(n-1)/2
muchii neorientate. Daca in $ G$ se gasesc $ m$ muchii, atunci in $ G_1$ se vor gasi $ \frac{n(n-1)}{2}-m$ muchii.
Exercitiul 2
Cu ce expresie trebuie completata secventa lipsa (marcata prin …
) din functia urmatoare, pentru ca f(x,2)
sa aiba ca rezultat suma exponentilor factorilor primi ce intra in descompunerea lui x
?
int f(int x, int d){ if(...) return 1; if(x%d==0) return 1+f(x/d,d); return f(x, d+1); }
a) x==1
b) x==0
c) x<d/2
d) x<d
e) x>d
f) x<=d
Solutie
Context: numerele prime compun toate numerele naturale (comparatie cu tabelul lui Mendeleev). Factorii primi sunt acele numere prime care compun un numar. Iar exponentii sunt puterile la care acesti factori se afla. Gauss, a demonstrat in aprox. 1800, ca fiecare numar natural are o descompunere unica in factori primi.
Programul de mai sus, testeaza divizibilitatea lui x
cu fiecare numar natural d
, incepand cu 2. Daca x
se divide cu d
, procesul se reia cu x/d
si d
. Cateva observatii:
- daca un numar
x
(e.g. 12) se divide cu und=k*n
(e.g.6
), atunci el se divide cu2
, iar acest divizor va fi gasit inaintea lui6
. De aceea este corect sa incrementam cu1
ped
, fara a fi nevoie sa luam in considerare doar numerele prime - daca un numar
x
(e.g. 9) se divide de mai multe ori cu und
, atunci apelul1+f(x/d,d)
va contoriza in mod corect de cate ori se dividex
cud
. Acesta este exponentul mentionat in intrebare. Se observa ca dupa ce am eliminat dinx
pe divizorul saud
, putem continua cu un divizor mai mare (nu este necesar sa reluam cautarea de lad=2
).
Algoritmul descris mai sus, poate fi implementat in doua feluri:
int f(int x, int d){ if(x==1) return 0; if(x%d==0) return 1+f(x/d,d); return f(x, d+1); }
In acest caz, cand x==1
, numarul a fost deja descompus si toti exponentii au fost contorizati.
sau:
int f(int x, int d){ if(x==d) return 1; if(x%d==0) return 1+f(x/d,d); return f(x, d+1); }
In acest caz, cand x==d
inseamna ca am intalnit ultima aparitie a lui d
ca divizor a lui x
(garantat sa existe si sa fie gasit de procedura de mai sus). Singurul raspuns cu care programul de mai sus s-ar comporta la fel este x⇐d
Exercitiul 3
Instructiunea care afiseaza cea mai din stanga pozitie unde se afla valoarea intreaga x
, sau afiseaza -1
, daca x
nu apare in tabloul unidimensional a
cu n
elemente intregi.
// Varianta 1 for (i=0 ; i<n && a[i] == x ; i++) if (i < n) printf("%d", i); else printf("-1");
// Varianta 2 for (i=0 ; i<n && a[i] != x ; i++) if (i == n) printf("%d", i); else printf("-1");
// Varianta 3 for (i=0 ; i<n && a[i] == x ; i++) if (i == n) printf("%d", i); else printf("-1");
// Varianta 4 for (i=0 ; i<n && a[i] != x ; i++) if (i < n) printf("%d", i); else printf("-1");
// Varianta 5 for (i=0 ; i==n && a[i] != x ; i++) if (i == n) printf("%d", i); else printf("-1");
// Varianta 6 for (i=0 ; i<n ; i++) if (a[i] == x) printf("%d", i); else printf("-1");
Solutie
Consideram ca a
contine elementele: 1,2,3,2,4,5,1
si ca x=2
. Atunci programul cautat trebuie sa intoarca pozitia 1
, adica prima aparitie a lui 2
in sir. Analizand cu atentie fiecare varianta:
- Varianta 1: va iesi din
for
daca primul element nu este egal cux
, prin urmare este incorecta. - Varianta 2: va iesi din
for
cand prima aparitie a luix
ina
va fi gasita, insa daca aceasta va fi raportata doar dacai==n
, deci varianta este gresita. - Varianta 3: aceeasi problema ca Varianta 1
- Varianta 4: instructiunea
for
se va executa fara instructiuni interioare pana cand: (i)a[i] == x
sau (ii)i==n
. Dacai<n
, pozitia va fi raportata: raspuns corect. - Varianta 5: nu se va intra in
for
decat daca tabloul are dimensiune 0 (i==n
) - Varianta 6: va afisa toate pozitiile pe care se afla
x
, nu doar prima.
Exercitiul 4
Apelul F(7)
returneaza:
int F(int N) { if (N==0) return 1; return F(N-1) + F(N-1); }
a) 60 b) 64 c) 120 d) 128 e) 240 f) 256
Solutie
Recurenta implementata de program este: $ F(N)=2*F(N-1)$ pt $ N > 0$ si $ F(0)=1$ . Raspunsul asadar trebuie sa fie o putere a lui 2 (ceea ce exclude variantele a) c) d)). Se observa cu usurinta ca $ F(N)=2^N$ asadar raspunsul corect este $ 2^7=128$ .
Exercitiul 5
Se considera un sire de caractere s
. Stabiliti rezultatul afisarii pe ecran, in urma executarii urmatoarei secvente de program:
char s[15]="ABCDEFG", *p, x[15]; p = s; p += 4; strcpy(x,s+2); strcat(x,p); printf("%s",x);
a) b) c) exact d) e) f)
Solutie
Varianta c.
Exercitiul 1
a) b) c) exact d) e) f)