Documente Academic
Documente Profesional
Documente Cultură
1. Răspuns corect: a
Justificare:
Dacă vrem să verificăm că trei numere au valori identice (sunt egale) este suficient ca unul dintre ele să fie egal
cu celelalte două asta conform relației de tranzitivitate pe care voi o cunoașteți și anume: daca x=y și y=z atunci
și x=z
Așa că relația de pa punctual a (x==y && x==z) este cea corectă
Relațiile de la punctele b și d par corecte matematic vorbind dar în C++ este greșit să scriem x==y==z, corect este
x==y&&y==z).
2. Răspuns corect: b
Justificare:
Marcăm cu roșu apelurile
f (20 , 2020) = 1 + f (20 , f (20 , 101))
f (20 , 101) = 1 + f (20 , f (20 , 5) )
f (20 , 5) = 1 + f ( f (4 , 5) , 5)
f(4 , 5) = 1+f (4 , f (4 , 1))
f(4 , 1)=0
Numărăm f-urile colorate, sunt 9.
3. Răspuns corect: d
Justificare:
Avem la dispoziție 3 mulțimi din care luăm elemente pentru a forma soluțiile. Din prima mulțime punem toate
elementele, din mulțimile 2 și 3 luăm câte un element având în vedere restricțiile.
Justificare:
După desenarea arborelui pe baza vectorului de tați dat, se conturează 3 lanțuri diferite care pleacă din nodul
rădăcină și se opresc în noduri de tip frunză.
Pentru că nodul 5 este tatăl nodului 3, nodul 3 este tatăl nodului 4, nodul 4 este
tatăl nodului 8 și nodul 8 este tatăl nodului 7 rezultă lantul (5, 3, 4, 8, 7), lanț de
lungime 4.
Pentru că nodul 5 este tatăl nodului 6 și nodul 6 este tatăl nodului 1, rezultă lanțul
(5, 6, 1), lanț de lungime 2.
Pentru că nodul 5 este tatăl nodului 6 și nodul 6 este tatăl nodului 2, rezultă lanțul
(5, 6, 2), lanț de lungime 2.
5. Răspuns corect: b
Putem să ne imaginăm că un lanţ eulerian este de fapt un ciclu eulerian de la care lipseşte o muchie. Prin
urmare, analogie făcând cu proprietatea de caracterizare a unui graf eulerian, deducem că graful nostru trebuie
să fie conex, exact două noduri pot să aibă grad impar, restul având fiecare grad par.
Dacă desenăm graful, observăm că ar două componente conexe şi avem destul de multe noduri de grad impar:
1, 2, 4, 5, 6, 8. Cel mai probabil, soluţia care ne avantajează este să lăsăm exact două noduri cu grad impar.
c)
#include <iostream>
using namespace std;
int main()
{
int n,c1,c2;
cin>>n;
do
{
c1=n%10;
n=n/10;
c2=n%10;
if(c1>c2)
{
c2=c1;
c1=n%10;
}
while(c1<c2)
{
cout<<c1;
c2=c2/2;
}
}
while (n>9);
return 0;
}
d)
Avem de transformat structura cât timp....execută intr-o structură de tipul repetă...până când.
Vă reamintesc modul general de transformare dintr-o repetitivă cu test inițial într-o repetitivă cu test final.
Se dă:
┌cât timp condiţie execută
│ instrucţiuni
└■
Transformarea sa:
┌dacă condiţie atunci
│ ┌repetă
│ │ instrucţiuni
│ └până când not condiţie
└■
Justificare:
Explicația algoritmului este următoarea:
- se copiază în șirul de caractere s cuvântul “optsprezece”
- variabila i primește valoarea 0 (poziția primului caracter din șir) și variabila j primește valoarea 10
(poziția ultimului caracter din șir)
- cât timp i<j, dacă caracterul de pe poziția i nu este vocală și dacă caracterul de pe poziția j este
vocală, caracterul de pe poziția i primeste următorul caracter din alfabet iar caracterul de pe poziția j
primeste caracterul precedent din alfabet
- apoi indiferent de rezultatul condiției i crește cu 1 și j scade cu 1 (practic se pune condiția asupra
caracterelor egal departate de mijlocul șirului)
SUBIECTUL al III-lea
///am luat cu cele două for-uri toate valorile posibile pe care le pot lua variabilele
a și b
#include <iostream>
int main()
{
int n,m,a[22][22],i,j,nr,ok;
cin>>m;
cin>>n;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
nr=0;///var nr numără câte coloane complementare cu prima col. avem
for(j=2;j<=n;j++)
{
ok=1; ///pp. coloanele a fi complementare
for(i=1;i<=m;i++)
if(a[i][1]==a[i][j]) ok=0;
if(ok) nr++;
}
cout<<nr;
return 0;
}
3. O soluție eficientă parcurge șirul din fișier, memorând variabila curentă (crt), valoarea anterioară celei curente
(ant) , precum și numărul de apariții ale valorii curente (nr). La întâlnirea unei valori crt diferite de ant, se
afișează ant, după caz, și se actualizează corespunzător variabilele. Ultima secvență este tratată individual.
Algoritmul este eficient d.p.d.v. al timpului de executare deoarece se fac puțini pași, pentru că datele de intrare
sunt parcurse o singură dată, algoritmul fiind liniar.
Algoritmul este eficient d.p.d.v. al memoriei deoarece utilizează doar câteva variabile simple.
Iată varianta de rezolvare eficientă:
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("bac.txt");
int main()
{
int x,crt,ant,nr,ok;
ok=0;
fin>>x;
ant=x;
nr=1;
while(fin>>x)
{
crt=x;
if(ant==crt) nr++;
else
{
if(nr==2) {
cout<<ant<<" ";
ok=1;
}
ant=crt;
nr=1;
}
}
if(nr==2)
{
cout<<crt;
ok=1;
}
if(ok==0) cout<<"nu exista";
return 0;
}