Sunteți pe pagina 1din 4

SUBIECTUL I

1. Raspuns corect: a

Justificare: dacă desfaceţi parantezele şi aplicaţi negaţia unei


expresii logice compuse se obţine:
!(n%2==1) && !(n%5!=0) => n%2!=1 && n%5==0
Datorită faptului că n este natural (scrie în enunţ) faptul
că n%2!=1 înseamnă că de fapt n%2==0
deci expresia de mai sus este de fapt echivalentă cu
n%2==0 && n%5==0 adică exact ceea ce se cere.

Atenţie, dacă n ar fi putut fi negativ, nu era corect,


deoarece %2 pt. numere negative este 0 sau -1 !!!!

2. Răspuns corect: c

Justificare:
f(102030) = 20 + f(10203) ^ = 20 + 2080 = 2100
f(10203) = 20 + f(1020) | = 20 + 2060 = 2080
f(1020) = 20 + f(102) ^ = 20 + 2040 = 2060
f(102) = 20 + f(10) | = 20 + 2020 = 2040
f(10) = 2020 şi revenim în calculele ^
de mai sus:|
3. Răspuns corect: d

Justificare:
Mai avem nevoie de încă 4 soluţii. Le scriem cu atenţie,
încercând de fiecare dată să modificăm cât mai de la coadă şi,
când nu mai e posibil, revenim la cea anterioară celei pe care am
încercat s-o modificăm şi nu s-a putut:
plecăm de la ultima dată de ei, 123. Încercăm mai întâi
să mai punem cifre după: nu se mai poate (că trebuie maxim 3)
aşa că încercăm să-l creştem pe 3 - nu se mai poate (e maximul
admis) aşa că revenim la cifra de dinainte, 2, pe care-o facem 3.
Avem aşadar a 9-a soluţie: 13
Mergem mai departe, punând cifre noi după:
130 - nu e bun (e par)
131 - e bun - deci asta e a 10-a soluţie. Nu mai putem să-i
adăugăm noi cifre că ar fi 4, aşa că îl plusăm pe ultimul 1.
ar urma 132 - nu e bun (e par)
133 - e bun - deci asta e a 11-a soluţie. Nu mai putem să-i
adăugăm cifre noi, aşa că încercăm să plusăm ce avem - nu mai
e posibil că am ajuns la 3 (cifra maximă) - ne întoarcem până
la primul 1 pe care-l facem
2 - dacă era cifră impară ar fi fost bine, dar cum e cifră pară
nu e bine - mergem mai departe, adăugând noi cifre:
20 - din păcate e impar, aşa că adăugăm noi cifre:
200 - din păcate şi-ăsta e impar. Nu mai putem adăuga cifre noi aşa
că rămânem şi schimbăm ultimul 0 în 1 şi obţinem cea de-a 12-a soluţie,
cea care se cere: 201

4. Răspuns corect: b

Dacă un anumit număr apare în vectorul de taţi de 3 ori (cum e cazul lui 9 din
exemplul dat de ei) înseamnă că acel nod este de 3 ori tată la diferite noduri,
deci are 3 fii. Astfel, pe exemplul dat, trebuie să identificăm CÂTE valori se
repetă FIX de 2 ori în vectorul de taţi.
Astfel, identificăm valorile 2, 8 şi 7 care se repetă de exact 2 ori, deci
răspunsul este 3
5. Răspuns corect: c

Un graf complet cu n noduri are un număr total de m=n*(n-1)/2 muchii,


în cazul nostru n=20 deci graful nostru complet ar avea 20*19/2=190
de muchii.
Cum graful are 100 de muchii, ca să-l aducem la unul complet avem
nevoie de diferenţa de muchii care este 190-100 = 90

SUBIECTUL al II-lea

1. La o analiză a algoritmului recunoaştem o repetitivă exterioară


care află una câte una cifrele numărului dat. La fiecare pas al acestei
repetitive se citeşte câte o valoare x. Constatăm că pe măsură ce paşii
sunt efectuaţi, creşte valoarea variabilei k (la primul pas este 0, la
al doilea pas este 1, etc.)
Ne mai dăm seama că la fiecare pas din numărul x citit la pasul curent
se şterg k cifre. În urma acestei ştergeri, dacă x a rămas nenul i se
va considera ultima sa cifră, care se memorează în variabila c, dacă nu
în c se va memora cifra curentă a lui n.
Cu aceste cifre c se formează un nou număr, de la stânga la dreapta.

a) Pe baza celor descrise mai sus, algoritmul citeşte numărul


12345 şi scoate cifrele sale una câte una, de la dreapta la stânga:
5 - timp în care îl citeşte pe 780, de la care ia ultima cifră: 0
4 - timp în care îl citeşte pe 921 de la care ia penultima cifră: 2
3 - timp în care îl citeşte pe 4013 de la care ia cifra sutelor: 0
2 - timp în care îl citeşte pe 75, de la care ar trebui să ia
cifra miilor. Totuşi 75 neavând 4 cifre, x va ajunge la 0, caz în
care se ia cifra curentă a lui n adică: 2
1 - timp în care îl citeşte pe 100214, de la care ia cifra a 5-a,
adică: 0

Va forma deci cu cifrele considerate, numărul de la dreapta la stânga deci


Raspuns: 2020
Să verificăm că, şi urmărind evoluţiile valorilor variabilelor cu tabel,
obţinem acelaşi lucru:
n | p | m | k | x | i | c |
-----+------+-----+---+------+---+---+
12345| 1| 0| 0| 780| | 0 |
1234| 10| 0| 1| 921| 1| |
123| 100| 20| 2| 92| | 2 |
| | | | 4013| 1| |
| | | | 401| 2| |
12| 1000| 20| 3| 40| | 0 |
| | | | 75| 1| |
| | | | 7| 2| |
| | | | 0| 3| |
1| 10000| 2020| 4| 0| | 2 |
| | | |100214| 1| |
| | | | 10021| 2| |
| | | | 1002| 3| |
| | | | 100| 4| |
0|100000| 2020| | 10| | 0 |

Deci, RĂSPUNS: 2020


b) E clar că, dacă pt. n se citeşte 49, trebuie ca în continuare să citim
două numere. Cele două numere le alegem astfel încât, pt. primul număr citit
să se aleagă cifra 9 iar pentru al doilea cifra 4.
Iată o serie de date de intrare care pot face acest lucru (remarcaţi că pe 49
NU l-am mai scris, deoarece cerinţa zice
"seturi de date CARE POT FI CITITE ÎN CONTINUARE..."
0 0
0 8
5189 3142
9 44
49 49

c)
#include <iostream>
using namespace std;

int main()
{
int n,p=1,m=0,k=0,c,x,i;
cin>>n;
while(n)
{
cin>>x;
for(i=1;i<=k;i++)x/=10;
if(x)c=x%10;
else c=n%10;
m=c*p+m;
n/=10;
p*=10;
k++;
}
cout<<m;
return 0;
}

d) Remarcăm că, de fapt, intrucţiunea pentru i <- 1,k execută x <- [x/10]
are rolul de a şterge k cifre din număr. Acest lucru îl putem face pe baza
variabilei p care de fapt progresează (vezi tabelul) ca 1, 10, 100, 100
Astfel, simpla atribuire x <- [x/p] poate înlocui acest for.
Deci, iată rezolvarea (!atenţie, trebuie rescrisă toată secvenţa):

citeşte n (număr natural)


p <- 1; m <- 0; k <- 0
┌cât timp n≠0 execută
│ citește x (număr natural)
│ x <- [x/p]
│┌dacă x≠0 atunci c <- x%10
││altfel c <- n%10
│└■
│ m <- c*p+m
│ n <- [n/10]
│ p <- p*10; k <- k+1
└■
scrie m
2. E vorba de a defini un struct imbricat. Citiţi cu atenţie exerciţiile ăstea
ca să nu faceţi greşeli de genul declarării câmpurilor de tip int, din moment
ce se zice "NUMERE REALE"!!
Iată două variante posibile de declarare a acestui lucru:
Var.1: Var.2:
struct punct struct triunghi
{ {
double x,y; struct
}; {
struct triunghi double x,y;
{ } A,B,C;
punct A,B,C; } t;
} t;
Personal, d.p.d.v. practic, optez pentru prima variantă, deoarece în a doua
nu putem folosi struct-ul interior, nici chiar dacă-i dăm şi lui o etichetă,
pentru că e considerat declaraţie locală şi NU va fi recunoscut nicăieri în afară.
În practică, e foarte util să scriem funcţii care să opereze cu entităţile de tip
punct, or acest lucru, pe varianta 2, va fi imposibil

3. Răspuns: 8viCtORIe

Prima atribuire calculează în k diferenţa dintre codurile ASCII ale literlor mici
şi ale celor mari. Cum 'a' = 97 şi 'A' = 65, de fapt această diferenţă va fi 32.
În continuare, se iau caracterele din string şi, dacă avem literă mare, la codul
său ASCII se adună k, deci este transformată în litera mică corespunzătoare iar
dacă nu, se scade valoarea k, deci se va transforma la litera mare corespunzătoare.

S-ar putea să vă placă și

  • Vocab
    Vocab
    Document1 pagină
    Vocab
    Doru MODRISAN
    Încă nu există evaluări
  • Cicloida
    Cicloida
    Document2 pagini
    Cicloida
    Doru MODRISAN
    Încă nu există evaluări
  • Cicloida
    Cicloida
    Document2 pagini
    Cicloida
    Doru MODRISAN
    Încă nu există evaluări
  • 22 12 13lucrare
    22 12 13lucrare
    Document3 pagini
    22 12 13lucrare
    Doru MODRISAN
    Încă nu există evaluări