Atestat profesional · Informatică
Atestat: programare
Modelul 1 Suma a n fracții, în formă ireductibilă
Exemplu
date.in
4
7 6
1 3
1 4
2 5date.out
43 207/6 + 1/3 + 1/4 + 2/5 = 43/20.
Cum se rezolvă
Suma se reține ca fracție a/b. Inițial, a/b este prima fracție citită. Pentru fiecare fracție x/y citită după ea:
- se adună fracțiile: a/b + x/y = (a·y + x·b) / (b·y);
- se calculează cel mai mare divizor comun al numărătorului și numitorului, cu algoritmul lui Euclid;
- numărătorul și numitorul se împart la acest divizor.
Prin simplificarea după fiecare adunare, valorile rămân cât mai mici. După ultima adunare, fracția este ireductibilă.
Numerele se rețin în tipul long long, pentru că produsele a * y și b * y pot depăși limita
tipului int.
Modelul 2 Cifra de control a unui număr natural
Exemplu
date.in
1971date.out
91971 → 18 → 9.
Cum se rezolvă
Cât timp numărul n are mai mult de o cifră (n > 9), el se înlocuiește cu suma cifrelor lui.
Suma cifrelor se obține prin împărțiri repetate la 10:
- restul împărțirii la 10 este ultima cifră, care se adună la sumă;
- câtul împărțirii la 10 este numărul fără ultima cifră;
- împărțirile se opresc când numărul devine 0.
Modelul 3 Primele n zecimale ale fracției a/b
Exemplu
date.in
5 23 5date.out
217395/23 = 0.21739…
Cum se rezolvă
Tipul double reține numai aproximativ 15 cifre semnificative, deci zecimalele nu se pot lua din
rezultatul împărțirii a / b. Ele se obțin pe rând, prin algoritmul împărțirii:
- r este restul curent; la început, r = a % b;
- la fiecare pas, restul se înmulțește cu 10;
- câtul r / b este zecimala următoare și se scrie în fișier;
- restul r % b se folosește la pasul următor.
Modelul 4 Numere prime de trei cifre care citite invers sunt tot prime
Modelul 5 Număr deosebit: n = m + suma cifrelor lui m
Modelul 6 Numărul de cifre folosite la paginarea unei cărți
Exemplu
date.in | date.out |
|---|---|
| 100 | 192 |
| 15 | 21 |
Pentru 100 de pagini:
- paginile 1–9 folosesc câte o cifră, adică 9 cifre;
- paginile 10–99 folosesc câte două cifre, adică 90 · 2 = 180 de cifre;
- pagina 100 folosește 3 cifre.
În total, 9 + 180 + 3 = 192 de cifre.
Cum se rezolvă
Se parcurg numerele paginilor, de la 1 la n. Pentru fiecare pagină p, cifrele se numără
prin împărțiri repetate la 10, într-o copie x a lui p: la fiecare împărțire contorul
cifre crește cu 1, până când x devine 0.
Modelul 7 Termeni consecutivi ai șirului lui Fibonacci
Exemplu
date.in | date.out |
|---|---|
| 2 3 | DA |
| 89 55 | DA |
| 4 5 | NU |
Cum se rezolvă
Termenii șirului se generează pe rând, cu două variabile:
- x este termenul curent, iar y este termenul următor; la început, x = 1 și y = 1;
- la fiecare pas, perechea (x, y) se compară cu (a, b) și cu (b, a), pentru că numerele pot fi date în orice ordine, ca în al doilea exemplu;
- se trece la perechea următoare: noul x este y, iar noul y este x + y.
Generarea se oprește când s-a găsit perechea sau când termenul curent depășește 1000000000.
Termenii se rețin în tipul long long, pentru că suma x + y poate depăși limita tipului int.
Modelul 8 Scrierea unui număr ca sumă de numere naturale consecutive
Exemplu
date.in | date.out |
|---|---|
| 15 | 1 2 3 4 5 4 5 6 7 8 |
| 50 | 8 9 10 11 12 11 12 13 14 |
Cum se rezolvă
Suma a k numere consecutive care încep cu a este:
a + (a + 1) + … + (a + k − 1) = k · a + k · (k − 1) / 2.
Pentru un număr de termeni k dat, reprezentarea există dacă din n = k · a + k · (k − 1) / 2 se obține un a natural nenul, adică dacă:
- r = n − k · (k − 1) / 2 este pozitiv;
- r este divizibil cu k; atunci a = r / k.
Numărul de termeni este cel puțin 2. Cel mai mare k posibil este cel pentru care k · (k − 1) / 2 < n; pentru n ≤ 1000000000 acesta este mai mic decât 44722. Se încearcă deci valorile lui k, nu toate valorile posibile ale primului termen, care ar fi prea multe pentru un n de ordinul miliardelor.
Modelul 9 Număr „super prim”: numărul și toate prefixele lui sunt prime
Modelul 10 Cel mai apropiat număr prim de un număr dat
Exemplu
date.in | date.out | Explicație |
|---|---|---|
| 1400 | 1399 | 1399 este numărul prim cel mai apropiat de 1400 |
| 3019 | 3019 | 3019 este număr prim |
| 3000 | 3001 | 3001 și 2999 sunt numere prime egal depărtate de numărul 3000 |
Cum se rezolvă
Subprogramul prim(x) verifică dacă x este prim, căutând un divizor de la 2 până la √x.
Se încearcă distanțele d = 0, 1, 2, … față de n. Pentru fiecare distanță se verifică întâi n + d, apoi n − d. Primul număr prim găsit este cel mai apropiat de n. Când n + d și n − d sunt amândouă prime, se afișează n + d, ca în al treilea exemplu.
Numărul n − d se verifică numai dacă este cel puțin 2, pentru că numerele 0 și 1 nu sunt prime.
Modelul 11 Câte elemente ale unui vector sunt numere Fibonacci
Modelul 12 Transformarea unui vector în mulțime
Exemplu
date.in | date.out | Explicație |
|---|---|---|
| 10 1 2 9 4 2 6 5 1 20 3 | 1 2 9 4 6 5 20 3 | elementele vectorului inițial nu sunt două câte două distincte |
| 7 1 2 9 4 6 5 3 | 1 2 9 4 6 5 3 | elementele vectorului inițial sunt două câte două distincte |
Cum se rezolvă
Din fiecare valoare se păstrează prima apariție, în același vector:
- m este numărul de elemente păstrate până la un moment dat; ele ocupă pozițiile 1, …, m;
- elementul v[i] se caută printre v[1], …, v[m];
- dacă nu se găsește, el se copiază pe poziția m + 1, iar m crește cu 1.
Numărul m este mai mic decât i, deci copierea nu suprascrie un element care nu a fost încă verificat. Dacă vectorul este deja o mulțime, fiecare element se copiază pe propria poziție, iar vectorul rămâne neschimbat.
Modelul 13 Elementele unui vector mai mici decât toate elementele altui vector
Modelul 14 Suma a două numere mari
Modelul 15 Ordonarea unui vector format din două secvențe crescătoare
Modelul 16 Elementele care apar de cele mai multe ori într-un vector
Modelul 17 Vectorul numărului de apariții
Modelul 18 Matrice completată pe linii cu termenii șirului lui Fibonacci
Exemplu
date.in
3date.out
1 1 2
3 5 8
13 21 34Primii 9 termeni ai șirului lui Fibonacci sunt: 1, 1, 2, 3, 5, 8, 13, 21 și 34.
Cum se rezolvă
Termenii șirului se generează în timpul parcurgerii matricei, fără un vector în care să fie păstrați:
- x este termenul curent, iar y este termenul următor; la început, x = 1 și y = 1;
- elementul a[i][j] primește valoarea lui x;
- noul x este y, iar noul y este suma lor.
Liniile se parcurg de sus în jos, iar pe fiecare linie coloanele se parcurg de la stânga la dreapta.
Termenii se rețin în tipul long long. Al 93-lea termen al șirului depășește însă și limita
acestui tip, deci programul scrie valori corecte numai pentru n ≤ 9, când matricea are cel mult 81
de elemente.
Modelul 19 Suma elementelor impare din zona de nord a unei matrice
Exemplu
date.in
5
45 2 63 8 10
3 5 1 0 9
1 11 12 15 7
13 8 -1 41 19
-2 23 18 3 4date.out
64Elementele impare din zona de nord a matricei sunt 63 și 1.
Cum se rezolvă
Cu liniile și coloanele numerotate de la 1, elementul a[i][j] se află în zona de nord dacă:
- este deasupra diagonalei principale: i < j;
- este deasupra diagonalei secundare: i + j < n + 1.
Inegalitățile sunt stricte, deci elementele de pe diagonale nu intră în sumă.
Un număr este impar dacă a[i][j] % 2 != 0. Condiția a[i][j] % 2 == 1 nu este corectă aici: în
C++, restul împărțirii unui număr negativ impar la 2 este -1.
Modelul 20 Cuvintele distincte obținute prin eliminarea unui caracter
Modelul 21 Cel mai mare număr format cu cifrele distincte ale unui număr
Modelul 22 Numerele prime dintr-un interval deschis, câte 10 pe linie
Modelul 23 Descompunerea unui număr în factori primi, cu subprogram
Exemplu
date.in
48date.out
factorul 2 la puterea 4
factorul 3 la puterea 148 = 2⁴ · 3.
Cum se rezolvă
Subprogramul descompunere(n) încearcă divizorii d în ordine crescătoare, începând cu 2:
- cât timp n se divide cu d, se împarte la d, iar exponentul p crește cu 1;
- dacă p > 0, d este factor prim și se scrie împreună cu puterea lui.
Un divizor neprim nu poate împărți numărul rămas, deoarece factorii lui primi au fost eliminați înainte.
Dacă d · d > n și n > 1, atunci n nu mai are divizori până la √n, deci este prim; în acest caz d primește direct valoarea n. Pentru un număr prim de 9 cifre, divizorii se încearcă numai până la aproximativ 31623, nu până la numărul însuși.
Modelul 24 Triunghi de numere construit recursiv, fără structuri repetitive
Exemplu
date.in
5date.out
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5Cum se rezolvă
Ambele structuri repetitive, cea pentru linii și cea pentru numerele de pe o linie, se înlocuiesc cu câte un subprogram recursiv:
linie(k)scrie numerele de la 1 la k: pentru k > 1 se apelează întâilinie(k - 1), apoi se scriu un spațiu și numărul k; pentru k = 1 se scrie numai 1;triunghi(n)scrie primele n linii: se apelează întâitriunghi(n - 1), apoilinie(n)și se trece la rând nou; pentru n = 0 nu se scrie nimic.
Modelul 25 Căutarea binară într-un vector ordonat de numere reale
Exemplu
date.in | date.out | Explicație |
|---|---|---|
| 5 12 14 20 24 45 45 | 5 | valoarea 45 se găsește pe poziția a 5-a în vectorul v |
| 4 50 65 88 89 13 | 0 | valoarea 13 nu se găsește în vectorul v |
Cum se rezolvă
Vectorul este ordonat crescător, deci se folosește căutarea binară. Căutarea se face în secvența v[st..dr], inițial tot vectorul:
- se compară x cu elementul din mijloc, v[mij], unde mij = (st + dr) / 2;
- dacă sunt egale, poziția căutată este mij;
- dacă v[mij] < x, căutarea continuă în jumătatea din dreapta: st = mij + 1;
- altfel, căutarea continuă în jumătatea din stânga: dr = mij − 1.
Căutarea se oprește când s-a găsit poziția sau când secvența nu mai are elemente (st > dr). La fiecare pas, secvența se reduce la jumătate, deci pentru 50 de elemente se fac cel mult 6 comparații.
Modelul 26 Concatenarea numerelor citite consecutiv, cu subprogram
Exemplu
numere.in | numere.out |
|---|---|
| 5 12 3 128 36 78 | 312 3128 36128 7836 |
Cum se rezolvă
a. Pentru ca cifrele lui b să fie scrise după cele ale lui a, numărul a se înmulțește cu 10 la puterea numărului de cifre ale lui b:
- p este cea mai mică putere a lui 10 mai mare decât b; pentru b = 45, p = 100;
- rezultatul este a · p + b; pentru a = 154 și b = 45, 154 · 100 + 45 = 15445.
Pornind de la p = 10, cazul b = 0 se tratează corect: 154 concatenat cu 0 este 1540.
b. Numerele nu se memorează într-un vector. Se păstrează numai numărul citit anterior, x:
- se citește numărul următor, y;
- se calculează
Concatenare(x, y)șiConcatenare(y, x)și se scrie cel mai mare; - y devine numărul anterior pentru pasul următor.
Modelul 27 Factorul prim cu puterea cea mai mare, cu subprogram
Modelul 28 Cifra care este maximă pentru cele mai multe numere
Exemplu
atestat.in | atestat.out | Explicație |
|---|---|---|
| 458 188 956 659 88 | 8 | 8 este cifra maximă pentru 3 din numere, 9 este cifra maximă pentru două numere |
| 125 54 125 65 126 62 | 5 6 | 5 este cifra maximă pentru 3 din numere, 6 este cifra maximă tot pentru 3 numere |
Cum se rezolvă
a. Cifrele lui n se obțin prin împărțiri repetate la 10, iar cea mai mare se reține în c.
b. Numerele nu se memorează. Pentru fiecare număr citit se apelează CifraMax, iar
frecventa[c] numără numerele care au cifra maximă c. Vectorul de frecvență are numai 10
elemente, oricâte numere ar conține fișierul, iar fiecare număr se prelucrează o singură dată.
La final:
- se determină cea mai mare valoare din vectorul
frecventa; - se scriu cifrele cu această frecvență; parcurgerea de la 0 la 9 le dă în ordine crescătoare.
Modelul 29 Ștergerea elementului din mijloc și inversarea celor două jumătăți
Exemplu
numere.in | numere.out |
|---|---|
| 7 4.1 8.2 4.3 8.1 2.1 3.1 7.9 | 4.3 8.2 4.1 7.9 3.1 2.1 |
Cum se rezolvă
Pozițiile se numără de la 1, ca în exemplele din enunț.
a. Inversez interschimbă v[p] cu v[q], apoi apropie cele două poziții (p crește,
q scade), cât timp p < q.
b. Stergp mută cu o poziție la stânga elementele de după poziția p, apoi micșorează
n. Parametrul n se transmite prin referință (int &n), ca modificarea să ajungă în
programul principal.
c. Pentru exemplu:
- șirul are 7 elemente, deci elementul din mijloc este pe poziția 7 / 2 + 1 = 4; după ștergerea lui 8.1 rămâne 4.1 8.2 4.3 2.1 3.1 7.9;
- se inversează pozițiile 1–3 și 4–6: 4.3 8.2 4.1 7.9 3.1 2.1.
Un tablou transmis ca parametru se modifică direct în programul apelant, deci subprogramele nu au nevoie de valoare returnată.
Modelul 30 Numerele formate din cifrele pare, cu cifrele în ordine crescătoare
Exemplu
date.in | date.out | Explicație |
|---|---|---|
| 1546 65423 26 623 2318 | 100 | 46 + 26 + 28 = 100 |
Din 65423 se obține 642, iar din 623 se obține 62; cifrele lor nu sunt în ordine crescătoare, deci nu intră în sumă.
Cum se rezolvă
a. Cifrele lui n se iau de la ultima spre prima. Fiecare cifră pară c se pune în fața
cifrelor deja alese: nr = nr + c * p, apoi p se înmulțește cu 10. Puterea p crește numai
la cifrele pare, deci între cifrele alese nu rămân zerouri. Pentru 12245 se obțin pe rând 4, 24 și
224.
b. Cifrele se parcurg tot de la ultima spre prima. Ordinea este crescătoare dacă fiecare cifră este cel mult egală cu cifra din dreapta ei; la prima cifră mai mare, subprogramul returnează 0. Exemplul 12245 arată că cifrele egale sunt permise.
c. Numerele se citesc până la sfârșitul fișierului, fără să fie memorate. Suma poate depăși
limita tipului int, deci se reține în tipul long long.
Modelul 31 Cmmdc și cmmmc ale tuturor numerelor dintr-un fișier
Exemplu
atestat.in | atestat.out |
|---|---|
| 16 32 8 4 18 | 2 288 |
Cum se rezolvă
a. Cel mai mare divizor comun se calculează cu algoritmul lui Euclid prin împărțiri: cât timp b ≠ 0, perechea (a, b) se înlocuiește cu (b, a % b); rezultatul este a.
b. Cel mai mic multiplu comun se obține din relația cmmdc(a, b) · cmmmc(a, b) = a · b. În program se împarte întâi a la cmmdc și abia apoi se înmulțește cu b, ca produsul intermediar să rămână mai mic.
c. Cmmdc și cmmmc pentru mai multe numere se calculează din aproape în aproape:
- cmmdc(x₁, x₂, x₃) = cmmdc(cmmdc(x₁, x₂), x₃);
- cmmmc(x₁, x₂, x₃) = cmmmc(cmmmc(x₁, x₂), x₃).
Variabilele d și m primesc primul număr, apoi se actualizează la fiecare număr citit. Cel
mai mic multiplu comun crește repede, deci se reține în tipul long long.
Modelul 32 Inserarea sumei cifrelor după fiecare element al unui vector
Exemplu
numere.in | numere.out |
|---|---|
| 5 48 13 6 91 30 | 48 12 13 4 6 6 91 10 30 3 |
Cum se rezolvă
a. Elementele de pe pozițiile p, …, n se mută cu o poziție la dreapta, începând cu ultimul, ca niciun element să nu fie suprascris înainte de a fi mutat. Pe poziția p se pune val, iar n crește cu 1. Parametrul n se transmite prin referință.
b. Suma cifrelor se calculează prin împărțiri repetate la 10.
c. După fiecare inserare, elementul următor din vectorul inițial ajunge cu două poziții mai la dreapta. De aceea indicele i crește din 2 în 2:
- elementul inițial de pe poziția i este urmat de suma lui de cifre, inserată pe poziția i + 1;
- pasul următor tratează poziția i + 2.
Vectorul final are 2n elemente, deci se declară cu cel puțin 200 de poziții.
Modelul 33 Numărul prim care apare de cele mai multe ori într-un fișier
Modelul 34 Numere cu cifre distincte și numere cu cifre care se repetă
Exemplu
date.in | date.out |
|---|---|
| 1546 65423 6526 623 2311 3263 | 1546 65423 623 3 6526 2311 3263 3 |
| 12345 6598 458 | 12345 6598 458 3 Nu există |
| 25454 6988 7877 | Nu există 25454 6988 7877 3 |
Cum se rezolvă
a. Subprogramul numără aparițiile fiecărei cifre într-un vector de 10 elemente. La prima cifră care apare a doua oară, returnează 0; dacă toate cifrele au fost parcurse, returnează 1.
b. Numerele se citesc până la sfârșitul fișierului și se memorează într-un vector, pentru că
fiecare linie din date.out începe cu numerele și se termină cu numărul lor. La citire se numără
numerele din fiecare categorie. Apoi:
- pe prima linie se scriu numerele cu cifre distincte și numărul lor, sau mesajul, dacă nu există;
- pe a doua linie se scriu celelalte numere și numărul lor, sau mesajul.
Mesajul se scrie cu diacritice, ca în exemplu.
Modelul 35 Sortarea elementelor dintre primul și ultimul număr par
Exemplu
numere.in | numere.out |
|---|---|
| 7 47 52 13 6 91 10 301 | 47 6 10 13 52 91 301 |
Cum se rezolvă
Pozițiile se numără de la 1, ca în exemplul de la punctul a.
a. Parametrii prim și ultim se transmit prin referință (int &prim, int &ultim), ca
valorile lor să ajungă în programul principal. La parcurgerea vectorului, prim primește
poziția primului element par găsit (când încă este 0), iar ultim primește poziția fiecărui
element par, deci la final rămâne cu poziția ultimului.
b. Secvența v[p..q] se ordonează prin metoda selecției: fiecare element v[i] se compară cu elementele de după el din secvență și se interschimbă cu cele mai mici.
c. În exemplu, primul număr par este 52, pe poziția 2, iar ultimul este 10, pe poziția 6. Se ordonează secvența 52 13 6 91 10 și se obține 6 10 13 52 91.
Modelul 36 Sufixele unui cuvânt, în ordinea descrescătoare a lungimii
Exemplu
Pentru cuvântul citit de la tastatură
examenfișierul sufixe.out conține:
examen xamen amen men en n
6Din definiție (na ≤ nb), cuvântul însuși este sufix al lui.
Cum se rezolvă
Sufixul care începe pe poziția i are lungimea n − i, deci sufixele se scriu în ordinea descrescătoare a lungimii dacă i crește de la 0 la n − 1.
În C++, S + i este adresa caracterului de pe poziția i, iar fout << S + i scrie
caracterele de la poziția i până la sfârșitul șirului, adică exact sufixul. Un cuvânt de
lungime n are n sufixe.
Modelul 37 Subșirurile „centru” ale unui cuvânt
Exemplu
cuvinte.in
informaticacuvinte.out
6
informatica nformatic formati ormat rma mCum se rezolvă
Ca în exemplu, primul subșir centru este cuvântul întreg (x = 0). Prin eliminarea a câte x litere de la fiecare capăt rămân literele de pe pozițiile x, …, n − x − 1, adică n − 2x litere. Se scriu subșirurile pentru x = 0, 1, 2, … cât timp n − 2x > 0.
Numărul lor este (n + 1) / 2, cu împărțire întreagă:
- pentru „informatica”, n = 11 și se obțin 6 subșiruri, ultimul de o literă;
- pentru un cuvânt cu n = 4 se obțin 2 subșiruri, de 4 și de 2 litere.
Modelul 38 Numărul vocal asociat unui cuvânt
Exemplu
cuvant.in | numar.out | |
|---|---|---|
| Exp.1 | matematica | 24680 |
| Exp.2 | electroencefalografie | Imposibil |
| Exp.3 | ksprc | Imposibil |
Cum se rezolvă
În cuvântul „matematica”, vocalele sunt pe pozițiile 2, 4, 6, 8 și 10. Poziției 10 îi corespunde cifra 10 − 10 = 0, deci numărul vocal este 24680.
Caracterele se parcurg de la stânga la dreapta:
- un caracter este vocală dacă se găsește în șirul
"aeiou"; funcțiastrchrreturneazăNULLdacă nu îl găsește; - poziția numerotată de la 1 este i + 1; dacă trece de 9, din ea se scade 10;
- cifra se adaugă la sfârșitul numărului:
x = x * 10 + c.
Un cuvânt de cel mult 17 caractere dă un număr de cel mult 17 cifre, care încape în tipul
long long.
Modelul 39 Numărul cons asociat unui cuvânt
Exemplu
cuvant.in | numar.out | |
|---|---|---|
| Exp.1 | matematica | 13579 |
| Exp.2 | electroencefalografie | Imposibil |
| Exp.3 | oaia | Imposibil |
Cum se rezolvă
În cuvântul „matematica”, consoanele sunt pe pozițiile 1, 3, 5, 7 și 9, deci numărul cons este 13579.
Caracterele se parcurg de la stânga la dreapta:
- textul are numai litere mici, deci un caracter este consoană dacă nu se găsește în șirul
"aeiou", adică dacăstrchrreturneazăNULL; - poziția numerotată de la 1 este i + 1; dacă trece de 9, din ea se scade 10;
- cifra se adaugă la sfârșitul numărului:
x = x * 10 + c.
Un cuvânt de cel mult 17 caractere dă un număr de cel mult 17 cifre, care încape în tipul
long long.
Modelul 40 Cuvintele în care litera o apare cel puțin o dată și cel mult de x ori
Exemplu
atestat.in | atestat.out |
|---|---|
| 2 antropomorfoza este totalitatea modificarilor morfologice la om | 3 totalitatea modificarilor om |
| 2 abilitate reprezinta indemanare iscusinta pricepere dibacie | 0 |
În primul exemplu, „antropomorfoza” are patru litere o, iar „morfologice” are trei, deci nu îndeplinesc condiția.
Cum se rezolvă
- După citirea lui x,
fin.get()consumă caracterul de sfârșit de linie, iarfin.getlinecitește textul de pe linia a doua. - Funcția
strtokîmparte textul în cuvinte, după spații. - Pentru fiecare cuvânt se numără literele o; dacă numărul lor este între 1 și x, cuvântul se reține.
Numărul de cuvinte se scrie înaintea cuvintelor, deci cuvintele se rețin până la sfârșitul
parcurgerii. Funcția strtok pune sfârșitul de șir după fiecare cuvânt chiar în t, de aceea
este suficient să se rețină adresa de început a fiecărui cuvânt, în vectorul de pointeri
cuvinte.
Modelul 41 Dublarea fiecărei apariții a unei litere într-un text
Exemplu
atestat.in | atestat.out |
|---|---|
| abilitate indemanare iscusinta pricepere i | 6 abiiliitate iindemanare iiscusiinta priicepere |
| abilitate indemanare iscusinta pricepere v | 0 abilitate indemanare iscusinta pricepere |
Cum se rezolvă
Rezultatul se scrie în fișierul atestat.out, cum precizează datele de ieșire.
Textul se modifică în același șir t, care se declară cu 202 poziții: dacă toate cele 100 de caractere sunt egale cu c, textul ajunge la 200 de caractere, plus caracterul de sfârșit de șir.
La fiecare poziție i pe care se află litera c:
- caracterele de la poziția i + 1 până la sfârșitul șirului, inclusiv caracterul de sfârșit, se mută cu o poziție la dreapta, începând cu ultimul;
- pe poziția i + 1 se pune litera c;
- lungimea n și numărul de modificări cresc cu 1;
- i crește cu încă 1, ca litera adăugată să nu fie dublată și ea.
Modelul 42 Ștergerea primelor x vocale din fiecare cuvânt al unui text
Exemplu
atestat.in | atestat.out |
|---|---|
| 2 maine voi sustine examenul la informatica | mne v sstne xmenul la nfrmatica |
Cuvântul „la” are o singură vocală, deci rămâne nemodificat.
Cum se rezolvă
Textul se împarte în cuvinte cu strtok. Pentru fiecare cuvânt:
- se numără vocalele;
- dacă sunt cel puțin x, cuvântul se parcurge de la stânga la dreapta și se șterg primele x vocale întâlnite;
- cuvântul se scrie în fișier, cu un spațiu înaintea lui, cu excepția primului cuvânt.
Ștergerea caracterului de pe poziția i se face prin copierea restului cuvântului cu o poziție
mai la stânga. Funcția strcpy nu admite ca sursa și destinația să se suprapună, de aceea restul
cuvântului se copiază întâi în șirul aux. După ștergere, pe poziția i se află alt caracter,
deci i scade cu 1, ca acel caracter să fie verificat și el.
Modelul 43 Ștergerea ultimelor x consoane din fiecare cuvânt al unui text
Exemplu
atestat.in | atestat.out |
|---|---|
| 2 maine voi sustine examenul la informatica | aie voi susie exameu la informaia |
Cuvintele „voi” și „la” au câte o singură consoană, deci rămân nemodificate.
Cum se rezolvă
Textul se împarte în cuvinte cu strtok. Pentru fiecare cuvânt:
- se numără consoanele, adică literele care nu se găsesc în șirul
"aeiou"; - dacă sunt cel puțin x, cuvântul se parcurge de la sfârșit spre început și se șterg primele x consoane întâlnite, care sunt ultimele x consoane ale cuvântului;
- cuvântul se scrie în fișier, cu un spațiu înaintea lui, cu excepția primului cuvânt.
Ștergerea caracterului de pe poziția i se face prin copierea restului cuvântului cu o poziție
mai la stânga, prin intermediul șirului aux, pentru că strcpy nu admite ca sursa și destinația
să se suprapună. Parcurgerea se face spre stânga, deci caracterele mutate au fost deja verificate.
Modelul 44 Inserarea după fiecare vocală a următoarelor două litere din alfabet
Exemplu
atestat.in | atestat.out |
|---|---|
| voi sustine examenul | vopqijk suvwstijknefg efgxabcmefgnuvwl |
Cum se rezolvă
Literele mici au coduri ASCII consecutive, deci literele care urmează după vocala t[i] sunt
t[i] + 1 și t[i] + 2. De exemplu, după o urmează p și q. Vocalele sunt a, e, i, o, u, deci
literele următoare există întotdeauna în alfabet.
La fiecare vocală de pe poziția i:
- caracterele de la poziția i + 1 până la caracterul de sfârșit de șir se mută cu două poziții la dreapta, începând cu ultimul;
- pe pozițiile i + 1 și i + 2 se pun cele două litere;
- lungimea n crește cu 2, iar i sare peste literele inserate.
Șirul are cel mult 50 de caractere, iar după inserări poate ajunge la 150, deci se declară cu 151 de poziții.
Modelul 45 Decodificarea unui text: ștergerea literelor inserate după vocale
Exemplu
atestat.in | atestat.out |
|---|---|
| vopqijk suvwstijknefg efgxabcmefgnuvwl | voi sustine examenul |
Cum se rezolvă
Rezultatul se scrie în fișierul atestat.out, cum precizează datele de ieșire.
Textul se parcurge de la stânga la dreapta. La fiecare vocală de pe poziția i se șterg caracterele de pe pozițiile i + 1 și i + 2: restul textului, de la poziția i + 3, se copiază începând cu poziția i + 1.
Literele inserate după o vocală nu sunt niciodată vocale, deci după ștergere parcurgerea poate
continua cu poziția i + 1. Funcția strcpy nu admite ca sursa și destinația să se suprapună, de
aceea restul textului se copiază întâi în șirul aux.
Modelul 46 Liniile unei matrice care au un element comun cu linia k
Modelul 47 Interschimbarea liniilor pe care apar minimul și maximul unei matrice
Modelul 48 Numărul valorilor impare de pe diagonalele unei matrice
Modelul 49 Liniile unei matrice care au suma elementelor maximă
Exemplu
matrice.in | matrice.out |
|---|---|
| 4 1 2 3 4 6 1 1 2 2 2 4 1 4 3 1 2 | 1 2 4 |
Sumele liniilor sunt 10, 10, 9 și 10.
Cum se rezolvă
a. Subprogramul adună elementele x[p][1], …, x[p][n].
b. Subprogramul se apelează o singură dată pentru fiecare linie, iar sumele se rețin în vectorul s. Apoi:
- se determină cea mai mare valoare din s;
- se scriu indicii liniilor a căror sumă este egală cu această valoare.
Modelul 50 Înlocuirea liniilor nule cu numărul de valori 1 de pe fiecare coloană
Exemplu
atestat.in | ecran |
|---|---|
| 5 1 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 | 1 0 0 1 1 1 1 1 0 1 3 2 1 2 3 1 1 0 1 1 3 2 1 2 3 |
Cum se rezolvă
Elementele sunt cifre binare, deci numărul elementelor nenule de pe o coloană este numărul de valori 1 de pe acea coloană.
Numerele trebuie luate din tabloul inițial. După înlocuirea liniei 3, coloanele ar conține alte valori, iar linia 5 ar primi alte numere. De aceea:
- întâi se calculează, cu
numarare, numărul de valori 1 de pe fiecare coloană și se reține în vectorul c; - apoi fiecare linie pentru care
toateNulereturnează 1 primește valorile din c.
Tabloul se declară cu 101 × 101 elemente, după limita de la punctul b.
Modelul 51 Coloanele complementare cu prima coloană a unui tablou binar
Exemplu
atestat.in | ecran |
|---|---|
| 3 6 1 1 0 0 1 0 0 1 1 1 1 1 1 0 0 0 0 1 | 2 |
Prima coloană conține valorile 1, 0, 1. Coloanele 3 și 4 conțin valorile 0, 1, 0, deci sunt complementare cu ea.
Cum se rezolvă
a. Coloanele k1 și k2 se parcurg linie cu linie. La prima linie pe care elementele lor sunt egale, subprogramul returnează 0. Dacă toate perechile sunt diferite, returnează 1.
b. Subprogramul se apelează pentru prima coloană și fiecare dintre coloanele 2, …, m, iar apelurile care returnează 1 se numără.
Tabloul de 200 × 200 de elemente se declară global, nu în funcția main.
Modelul 52 Interschimbarea coloanelor pe care apar minimul și maximul unei matrice
Exemplu
atestat.in | atestat.out |
|---|---|
| 5 5 1 2 3 8 6 0 3 7 3 1 3 6 5 2 3 7 1 9 7 1 8 0 6 4 9 | 3 2 1 8 6 7 3 0 3 1 5 6 3 2 3 9 1 7 7 1 6 0 8 4 9 |
Valoarea minimă, 0, apare prima dată pe coloana 1, iar valoarea maximă, 9, apare prima dată pe coloana 3.
Cum se rezolvă
a. Pentru fiecare linie i, elementele a[i][k1] și a[i][k2] se interschimbă prin
intermediul variabilei aux.
b. Tabloul se parcurge linie cu linie, de la stânga la dreapta. Coloana minimului (cmin) și coloana maximului (cmax) se schimbă numai la o valoare strict mai mică, respectiv strict mai mare, deci rămân coloanele pe care valorile apar prima dată. Când minimul și maximul apar pe aceeași coloană, interschimbarea nu ar schimba nimic, deci subprogramul se apelează numai dacă cmin ≠ cmax.
Modelul 53 Înlocuirea elementelor impare cu maximul par de pe diagonale
Exemplu
matrice.in | ecran |
|---|---|
| 4 1 2 3 4 6 1 1 2 2 2 4 1 4 3 1 2 | 1 2 4 4 6 1 1 2 2 2 4 4 4 4 4 2 |
Valorile de pe diagonala principală sunt 1, 1, 4, 2, iar cele de pe diagonala secundară sunt 4, 1, 2, 4. Cea mai mare valoare pară de pe diagonale este 4.
Cum se rezolvă
Rezultatul se scrie în fișierul matrice.out, cum cere punctul b.
a. Pentru fiecare linie i se verifică elementul de pe diagonala principală, a[i][i], și cel de pe diagonala secundară, a[i][n + 1 − i]. Maximul pornește de la −1, deci rămâne −1 dacă nu se găsește nicio valoare pară.
b. Un element a[i][j] se află în afara diagonalelor dacă i ≠ j și i + j ≠ n + 1. Elementele
impare care îndeplinesc această condiție primesc valoarea returnată de maxim_d. Subprogramul se
apelează o singură dată, înaintea modificărilor.
Modelul 54 Valoarea vânzărilor și cel mai vândut produs, cu tip structurat
Exemplu
vanzari.in | ecran |
|---|---|
| 6 4 2.5 10.0 5 10 2.0 4 5 5.0 5 6 3.0 4 3 4.0 3 10 5.0 | 157.88 4 |
Prețul de vânzare se calculează din prețul de achiziție adunat cu adaosul comercial: pv = pa + pa*adaos_com/100.
Cum se rezolvă
Tipul produs grupează cele trei date ale unui produs: cantitatea, prețul de achiziție și adaosul.
Produsele se citesc într-un vector de elemente de acest tip.
La parcurgerea vectorului, pentru fiecare produs:
- se calculează prețul de vânzare, pv = pret + pret · adaos / 100;
- la valoarea totală se adaugă cantitate · pv;
- poziția poz a celui mai vândut produs se schimbă dacă produsul curent are o cantitate mai mare sau, la cantitate egală, un adaos mai mare.
În exemplu, produsele 2 și 4 au cantitatea maximă, 5, iar produsul 4 are adaosul mai mare (3 față
de 2). Valoarea totală se afișează cu două zecimale, cu fixed și setprecision(2).
Modelul 55 Nota la purtare calculată din absențe, cu tip structurat
Exemplu
elevi.in
5
Avram Teodor 20 15
Barbu Anda 45 20
Flore Marius 30 15
Marcu Alin 10 10
Valea Sebastian 25 16elevi.out
Avram Teodor 10
Marcu Alin 10
Valea Sebastian 10
Flore Marius 9
Barbu Anda 8Cum se rezolvă
Tipul elev grupează numele, prenumele, numărul total de absențe, numărul de absențe motivate și
nota. La citirea fiecărui elev se calculează nota:
- absențele nemotivate sunt diferența dintre total și cele motivate;
- dacă sunt mai mult de 50, nota este 4;
- altfel, nota este 10 − nemotivate / 10, cu împărțire întreagă; de exemplu, Barbu Anda are 25 de absențe nemotivate și primește nota 8.
Lista se ordonează descrescător după notă prin metoda bulelor. Două înregistrări se interschimbă
numai dacă nota primei este strict mai mică, deci elevii cu aceeași notă rămân în ordinea din
fișier, ca în exemplu. O înregistrare se copiază întreagă printr-o singură atribuire, aux = e[i].
Modelul 56 Numărul cifrelor pare și al cifrelor impare pentru fiecare număr dintr-un șir
Exemplu
Pentru datele de intrare:
4
2504 135 8 0se afișează:
3 1
0 3
1 0
1 0Pe fiecare rând, primul număr este numărul cifrelor pare, iar al doilea este numărul cifrelor impare. Numărul 2504 are cifrele pare 2, 0, 4 și cifra impară 5.
Cum se rezolvă
- se citește
n, apoi numerele, unul câte unul; - pentru fiecare număr, contoarele
pareșiimparepornesc de la 0; - ultima cifră se obține cu
x % 10și se elimină cux = x / 10; - după paritatea cifrei se mărește unul dintre contoare.
Structura repetitivă do ... while execută cel puțin o dată corpul, deci și numărul 0 este
tratat corect: are o cifră, iar aceasta este pară.
Modelul 57 Cifrele unui număr afișate în ordine crescătoare
Exemplu
Pentru x = 5972034 se afișează:
0 2 3 4 5 7 9Cum se rezolvă
Cifrele se numără într-un vector de frecvență fr, cu 10 elemente: fr[c] reține de câte ori
apare cifra c în număr.
- se extrag cifrele numărului cu
x % 10șix / 10, iar pentru fiecare cifrăcse măreștefr[c]; - se parcurge vectorul de la cifra 0 la cifra 9;
- fiecare cifră
cse afișează defr[c]ori.
Cifrele care apar de mai multe ori se afișează de tot atâtea ori.
Modelul 58 Verificarea scrierii unui număr într-o bază de numerație b
Exemplu
Pentru datele de intrare 1021 3 se afișează:
Numarul 1021 poate fi scris in baza 3Pentru datele de intrare 1024 3 se afișează:
Numarul 1024 nu poate fi scris in baza 3În baza 3 se folosesc numai cifrele 0, 1 și 2, iar numărul 1024 conține cifra 4.
Cum se rezolvă
În baza b se folosesc cifrele de la 0 la b - 1. Un număr poate fi scris în baza b dacă
toate cifrele lui sunt mai mici decât b.
- se citesc numărul
xși bazab; - variabila
okpornește cu valoareatrue; - se parcurg cifrele numărului, iar la prima cifră mai mare sau egală cu
b,okdevinefalse; - după valoarea lui
okse afișează mesajul.
Modelul 59 Semnul înmulțirii introdus într-un număr pentru produsul maxim
Exemplu
Pentru n = 4322 se afișează:
4*322=1288Cum se rezolvă
Dacă p este 10, 100, 1000, …, atunci n / p este numărul din stânga semnului, iar n % p este
numărul format din ultimele cifre ale lui n, cele din dreapta semnului. Pentru n = 4322:
p = 10: 432 și 2, cu produsul 864;p = 100: 43 și 22, cu produsul 946;p = 1000: 4 și 322, cu produsul 1288.
Puterea p se înmulțește cu 10 cât timp n / p mai are cel puțin o cifră. Pentru fiecare
împărțire se calculează produsul, iar cel mai mare se reține împreună cu cele două numere.
Modelul 60 Cifra maximă a fiecărui număr dintr-un șir
Exemplu
Pentru datele de intrare:
3
3829 105 0se afișează:
9
5
0Cum se rezolvă
- se citește
n, apoi numerele, unul câte unul; - pentru fiecare număr, variabila
maximpornește de la 0, cea mai mică cifră; - se extrag cifrele cu
x % 10șix / 10, iar fiecare cifră mai mare decâtmaximdevine noul maxim; - după prelucrarea tuturor cifrelor se afișează
maxim.
Modelul 61 Numerele cu suma cifrelor maximă și minimă dintr-un șir
Exemplu
Pentru datele de intrare:
5
123 99 1000 45 207se afișează:
Suma cifrelor maxima: 99
Suma cifrelor minima: 1000Sumele cifrelor sunt 6, 18, 1, 9 și 9.
Cum se rezolvă
Suma cifrelor se calculează cu subprogramul sumaCifrelor. În programul principal:
sMaxpornește de la -1, iarsMinde la 100, o valoare mai mare decât orice sumă a cifrelor unui număr cu cel mult 9 cifre (cel mult 81);- pentru fiecare număr citit se calculează suma cifrelor
s; - dacă
s > sMax, se rețin noua sumă maximă și numărul; - dacă
s < sMin, se rețin noua sumă minimă și numărul.
Comparațiile sunt stricte, deci dacă mai multe numere au aceeași sumă maximă sau minimă, se afișează primul dintre ele.
Modelul 62 Cifra maximă și cifra minimă pentru fiecare număr dintr-un șir
Exemplu
Pentru datele de intrare:
3
3829 505 7se afișează:
9 2
5 0
7 7Pe fiecare rând se afișează întâi cifra maximă, apoi cifra minimă.
Cum se rezolvă
- pentru fiecare număr citit,
cMaxpornește de la 0, cea mai mică cifră, iarcMinde la 9, cea mai mare cifră; - se extrag cifrele cu
x % 10șix / 10; - fiecare cifră se compară cu
cMaxși cucMin, care se actualizează.
Numărul 7 are o singură cifră, deci aceasta este în același timp cifra maximă și cifra minimă.
Modelul 63 Număr cu cifrele ordonate strict descrescător
Exemplu
Pentru n = 54321 se afișează DA.
Pentru n = 543234 se afișează NU.
Cum se rezolvă
Cifrele ordonate strict descrescător de la stânga la dreapta sunt ordonate strict crescător de la dreapta la stânga. Cifrele se extrag de la cifra unităților spre stânga, deci fiecare cifră trebuie să fie strict mai mare decât cifra extrasă înaintea ei.
ultimareține cifra extrasă anterior;- la fiecare pas se compară cifra curentă
n % 10cuultima; - dacă cifra curentă este mai mică sau egală cu
ultima, condiția nu este îndeplinită, iarokdevinefalse.
Modelul 64 Numărul de apariții ale ultimei cifre într-un număr
Exemplu
Pentru n = 2732 se afișează:
2Ultima cifră este 2 și apare de două ori în număr.
Cum se rezolvă
- ultima cifră se reține în variabila
u = n % 10; - se parcurg toate cifrele numărului, inclusiv ultima;
- contorul
nrse mărește la fiecare cifră egală cuu.
Ultima cifră este numărată și ea, deci rezultatul este cel puțin 1.
Modelul 65 Cifra maximă a unui număr și numărul ei de apariții
Exemplu
Pentru n = 4949194 se afișează:
9 3Cea mai mare cifră este 9 și apare de trei ori.
Cum se rezolvă
Maximul și numărul lui de apariții se determină la o singură parcurgere a cifrelor. Pentru fiecare
cifră c:
- dacă
ceste mai mare decât maximulcMax, ea devine noul maxim, iar contorulnrprimește valoarea 1; - dacă
ceste egală cucMax, contorulnrcrește cu 1.
cMax pornește de la -1, deci prima cifră extrasă devine maxim, chiar dacă este 0.
Modelul 66 Eliminarea cifrelor impare dintr-un număr
Exemplu
Pentru n = 532997201 se afișează:
220Pentru n = 1357 se afișează:
Numarul nu are cifre pareCum se rezolvă
Numărul nou se construiește din cifrele pare ale lui n, de la cifra unităților spre stânga.
rezultatpornește de la 0, iarpde la 1;- fiecare cifră pară se adaugă la
rezultatînmulțită cup, adică pe poziția unităților, a zecilor, a sutelor ș.a.m.d.; - după fiecare cifră pară adăugată,
pse înmulțește cu 10; - cifrele impare nu se adaugă.
Pentru 532997201, cifrele pare sunt, de la dreapta la stânga, 0, 2, 2, iar numărul obținut este 0 · 1 + 2 · 10 + 2 · 100 = 220.
Modelul 67 Aparițiile unei cifre în numere citite până la 0
Exemplu
Pentru datele de intrare:
7
7177 205 77 0se afișează:
3
0
2Prima valoare citită este cifra c = 7. Urmează numerele, până la 0.
Cum se rezolvă
- se citește întâi cifra
c; - se citește primul număr, apoi, cât timp numărul citit este diferit de 0, se numără aparițiile
cifrei
cîn el, se afișează rezultatul și se citește numărul următor; - valoarea 0 oprește citirea și nu se prelucrează.
Modelul 68 Verificarea unui număr palindrom
Exemplu
Pentru n = 123321 se afișează:
Numarul 123321 este palindromPentru n = 12322 se afișează:
Numarul 12322 nu este palindromCum se rezolvă
Un număr este palindrom dacă este egal cu oglinditul lui, adică cu numărul format din aceleași cifre, scrise în ordine inversă.
- oglinditul se construiește dintr-o copie
xa numărului: la fiecare pas,oglindit = oglindit * 10 + x % 10, apoix = x / 10; - la final, oglinditul se compară cu
n.
Pentru 12322 se obține oglinditul 22321, diferit de număr.
Modelul 69 Oglinditul fiecărui număr dintr-un șir
Exemplu
Pentru datele de intrare:
3
1234 1200 5se afișează:
4321
21
5Oglinditul lui 1200 este 0021, adică numărul 21.
Cum se rezolvă
Subprogramul oglindit primește un număr și returnează oglinditul lui:
ogpornește de la 0;- la fiecare pas, ultima cifră a lui
xse adaugă la dreapta luiog, prinog = og * 10 + x % 10, apoi se elimină dinx, prinx = x / 10.
Programul principal citește n și, pentru fiecare număr citit, afișează valoarea returnată de
subprogram.
Modelul 70 Împărțirea unui număr „la mijloc” în două numere
Exemplu
Pentru n = 12345 se afișează:
12 345Pentru n = 12345678 se afișează:
1234 5678Cum se rezolvă
Din exemplu se vede că, la un număr cu un număr impar de cifre, al doilea număr primește cifra din mijloc: 12345 are 5 cifre, iar al doilea număr are 3.
- se numără cifrele lui
nîn variabilanrCifre; - al doilea număr are
k = (nrCifre + 1) / 2cifre; - se calculează
p = 10la putereak; - primul număr este
n / p, iar al doilea esten % p.
Modelul 71 Cifrele distincte ale unui număr
Exemplu
Pentru n = 234542 se afișează:
2 3 4 5Cum se rezolvă
Se folosește un vector apare cu 10 elemente de tip bool, câte unul pentru fiecare cifră:
apare[c] are valoarea true dacă cifra c se găsește în număr.
- inițial, toate elementele vectorului au valoarea
false; - pentru fiecare cifră
ca numărului,apare[c]primește valoareatrue; - se parcurg cifrele de la 0 la 9 și se afișează cele pentru care
apare[c]estetrue.
Modelul 72 Prima jumătate a unui vector ordonată crescător, a doua descrescător
Exemplu
Pentru datele de intrare:
6
5 8 2 1 7 9se afișează:
2 5 8 9 7 1Cum se rezolvă
Elementele se rețin în vectorul a, pe pozițiile de la 1 la n. Prima jumătate ocupă pozițiile
de la 1 la m = n / 2, iar a doua jumătate pozițiile de la m + 1 la n.
Fiecare jumătate se ordonează separat, prin metoda interschimbării: fiecare element se compară cu toate elementele aflate după el în aceeași jumătate, iar cele două se interschimbă dacă nu sunt în ordinea cerută.
- în prima jumătate se interschimbă când
a[i] > a[j], pentru ordinea crescătoare; - în a doua jumătate se interschimbă când
a[i] < a[j], pentru ordinea descrescătoare.
Modelul 73 Numerele de trei cifre egale cu suma cuburilor cifrelor
Exemplu
Programul nu are date de intrare și afișează:
153 370 371 407De exemplu, 1³ + 5³ + 3³ = 1 + 125 + 27 = 153.
Cum se rezolvă
Se parcurg toate numerele de la 100 la 999. Pentru fiecare număr x se calculează cifrele:
a = x / 100, cifra sutelor;b = x / 10 % 10, cifra zecilor;c = x % 10, cifra unităților.
Numărul se afișează dacă a * a * a + b * b * b + c * c * c este egal cu x.
Modelul 74 Numerele formate din cifre identice dintr-un interval, scrise într-un fișier
Exemplu
Pentru a = 10 și b = 150, fișierul cifre.txt conține:
11 22 33 44 55 66 77 88 99 111Cum se rezolvă
Enunțul nu dă numele fișierului; programul scrie în fișierul cifre.txt.
Subprogramul cifreIdentice verifică dacă toate cifrele unui număr sunt egale cu ultima lui
cifră și returnează true sau false.
În programul principal:
- se citesc
așib; dacăa > b, cele două valori se interschimbă, pentru ca intervalul să fie parcurs de la capătul mai mic; - se parcurg numerele din intervalul [a, b];
- numerele pentru care subprogramul returnează
truese scriu în fișier.
Modelul 75 Numerele divizibile cu suma cifrelor lor, până la n
Exemplu
Pentru n = 100 se afișează:
1 2 3 4 5 6 7 8 9 10 12 18 20 21 24 27 30 36 40 42 45 48 50 54 60 63 70 72 80 81 84 90 100
De exemplu, 84 are suma cifrelor 12, iar 84 = 12 · 7.
Cum se rezolvă
- subprogramul
sumaCifrelorreturnează suma cifrelor unui număr; - în programul principal se parcurg numerele de la 1 la
n; - se afișează numerele
xpentru carex % sumaCifrelor(x)este 0.
Numărul 0 nu se verifică: suma cifrelor lui este 0, iar împărțirea la 0 nu este definită.
Modelul 76 Primele n numere cu suma cifrelor m
Exemplu
Pentru n = 10 și m = 4 se afișează:
4 13 22 31 40 103 112 121 130 202Fiecare dintre aceste numere are suma cifrelor 4.
Cum se rezolvă
- subprogramul
sumaCifrelorreturnează suma cifrelor unui număr; - în programul principal se cercetează numerele 1, 2, 3, … în ordine;
- fiecare număr cu suma cifrelor egală cu
mse afișează, iar contorulgasitecrește cu 1; - căutarea se oprește când
gasiteajunge lan.
Modelul 77 Numerele perfecte mai mici sau egale cu n
Exemplu
Pentru n = 500 se afișează:
6 28 496De exemplu, divizorii lui 28 mai mici decât el sunt 1, 2, 4, 7, 14, iar suma lor este 28.
Cum se rezolvă
Un număr natural este perfect dacă este egal cu suma divizorilor săi mai mici decât el.
Subprogramul perfect calculează suma acestor divizori:
- suma pornește de la 1, divizorul oricărui număr mai mare decât 1;
- divizorii
dse caută numai până la rădăcina pătrată a numărului (d * d <= x); pentru fiecare divizordgăsit, se adaugă și perechea lui,x / d, dacă este diferită ded; - subprogramul returnează
truedacă suma este egală cu numărul.
Modelul 78 Numărul cu cei mai mulți divizori dintr-un șir
Exemplu
Pentru datele de intrare:
5
12 7 30 16 9se afișează:
30Numerele au, în ordine, 6, 2, 8, 5 și 3 divizori.
Cum se rezolvă
Subprogramul nrDivizori numără divizorii unui număr x:
- divizorii
dse caută până la rădăcina pătrată a luix(d * d <= x); - fiecare divizor
dgăsit are perecheax / d, care se numără și ea, dacă este diferită ded.
În programul principal, pentru fiecare număr citit se calculează numărul de divizori și se
compară cu maximul nrMax. Când se găsește un număr de divizori mai mare, se rețin noul maxim și
numărul. Comparația este strictă, deci se afișează primul dintre numerele cu număr maxim de
divizori.
Modelul 79 Divizorii comuni a două numere naturale
Exemplu
Pentru a = 12 și b = 18 se afișează:
1 2 3 6Cum se rezolvă
Un divizor comun al lui a și b nu poate depăși cel mai mic dintre cele două numere.
- se parcurg valorile
dde la 1 până la minimul dintreașib; - se afișează valorile
dcare divid ambele numere, adică cele pentru carea % d == 0șib % d == 0.
Divizorii comuni ai lui a și b sunt divizorii celui mai mare divizor comun al lor: pentru 12 și
18, cel mai mare divizor comun este 6, cu divizorii 1, 2, 3, 6.
Modelul 80 Număr aproape prim, produs de două numere prime
Exemplu
| n | Se afișează | Motivul |
|---|---|---|
| 35 | Numărul este aproape prim | 35 = 5 · 7 |
| 4 | Numărul este aproape prim | 4 = 2 · 2 |
| 30 | Nu este prim | 30 = 2 · 3 · 5 |
| 13 | Nu este prim | 13 este prim, nu are o descompunere în doi factori primi |
Cum se rezolvă
Cel mai mic divizor d al lui n, mai mare decât 1, este un număr prim. Numărul n este un
produs de două numere prime dacă:
- are un divizor
dcud * d <= n, deci nu este prim; - câtul
n / deste și el un număr prim.
Primalitatea câtului se verifică cu subprogramul prim, care caută divizori de la 2 până la
rădăcina pătrată a numărului.
Modelul 81 Cel mai mic multiplu comun a trei numere
Exemplu
Pentru a = 4, b = 6 și c = 10 se afișează:
60Cum se rezolvă
Cel mai mic multiplu comun a două numere se obține din cel mai mare divizor comun al lor:
cmmmc(a, b) = a · b / cmmdc(a, b)
Pentru trei numere, cel mai mic multiplu comun se calculează în doi pași: cmmmc(a, b, c) = cmmmc(cmmmc(a, b), c).
- subprogramul
cmmdcaplică algoritmul lui Euclid prin împărțiri repetate; - subprogramul
cmmmcfolosește formula de mai sus; - programul principal apelează
cmmmcde două ori.
Pentru 4, 6 și 10: cmmmc(4, 6) = 12, iar cmmmc(12, 10) = 60.
Modelul 82 Cel mai mare divizor comun a n numere
Exemplu
Pentru datele de intrare:
4
12 18 24 30se afișează:
6Cum se rezolvă
Cel mai mare divizor comun a mai multor numere se calculează din aproape în aproape: cmmdc(a₁, a₂, …, aₙ) = cmmdc(cmmdc(a₁, …, aₙ₋₁), aₙ).
- variabila
dprimește valoarea primului număr citit; - fiecare număr următor
xse citește, iarddevinecmmdc(d, x); - după citirea tuturor numerelor,
deste rezultatul.
Subprogramul cmmdc aplică algoritmul lui Euclid prin împărțiri repetate.
Modelul 83 Simplificarea unei fracții până la fracția ireductibilă
Exemplu
| a | b | Se afișează |
|---|---|---|
| 12 | 18 | 2/3 |
| 6 | -4 | -3/2 |
| 0 | 5 | 0/1 |
Cum se rezolvă
O fracție se simplifică prin cel mai mare divizor comun al numărătorului și numitorului. Fracția obținută este ireductibilă.
- dacă numitorul este 0, fracția nu există și se afișează un mesaj;
- dacă numitorul este negativ, numărătorul și numitorul își schimbă semnul, pentru ca semnul fracției să rămână la numărător;
- se calculează
d, cel mai mare divizor comun al lui |a| și b; - se afișează
a / dșib / d, despărțite prin/.
Pentru a = 0, cel mai mare divizor comun este b, iar fracția devine 0/1.
Modelul 84 Perechi de numere prime între ele, citite până la o pereche cu 0
Exemplu
Pentru datele de intrare:
3 27
5 12
8 13
2 46
13 17
0 0se afișează:
(5 12) (8 13) (13 17)
3 perechiCum se rezolvă
Două numere sunt prime între ele dacă cel mai mare divizor comun al lor este 1.
- se citește prima pereche
a,b; - cât timp niciunul dintre numere nu este 0, se calculează
cmmdc(a, b); dacă rezultatul este 1, perechea se afișează, iar contorulnrcrește cu 1; apoi se citește perechea următoare; - după oprirea citirii se afișează
nr.
Perechea care conține 0 oprește citirea și nu se prelucrează.
Modelul 85 Un număr și oglinditul lui, verificate dacă sunt prime
Exemplu
Pentru n = 13 se afișează:
13 este prim
31 este primPentru n = 23 se afișează:
23 este prim
32 nu este primCum se rezolvă
Programul folosește două subprograme:
oglinditreturnează numărul format din cifrele luixîn ordine inversă;primreturneazătruedacăxeste prim; numerele 0 și 1 nu sunt prime, iar pentru celelalte se caută un divizor de la 2 până la rădăcina pătrată a luix(d * d <= x).
În programul principal se calculează oglinditul, apoi se verifică fiecare dintre cele două numere și se afișează câte un mesaj.
Modelul 86 Numerele prime mai mici sau egale cu n
Exemplu
Pentru n = 20 se afișează:
2 3 5 7 11 13 17 19Cum se rezolvă
- subprogramul
primreturneazătruedacă numărul primit este prim: numerele 0 și 1 nu sunt prime, iar pentru celelalte se caută un divizor de la 2 până la rădăcina pătrată a numărului; - în programul principal se parcurg numerele de la 2 la
nși se afișează cele pentru care subprogramul returneazătrue.
Modelul 87 Numerele prime de trei cifre
Exemplu
Programul nu are date de intrare. Se afișează 143 de numere, de la 101 la 997:
101 103 107 109 113 127 131 137 139 149 ... 953 967 971 977 983 991 997
Cum se rezolvă
Numerele de trei cifre sunt cele de la 100 la 999. Fiecare dintre ele se verifică cu subprogramul
prim, care caută un divizor de la 2 până la rădăcina pătrată a numărului; numerele fără niciun
astfel de divizor se afișează.
Modelul 88 Scrierile unui număr par ca sumă de două numere prime
Exemplu
Pentru n = 10 se afișează:
10 = 3 + 7
10 = 5 + 5Pentru n = 20 se afișează:
20 = 3 + 17
20 = 7 + 13Cum se rezolvă
Orice scriere are forma n = p + (n − p). Pentru ca o scriere să nu apară de două ori (3 + 7 și
7 + 3), primul termen p ia valori numai până la n / 2.
- se parcurg valorile
pde la 2 lan / 2; - se afișează scrierea dacă atât
p, cât șin - psunt prime.
Primalitatea se verifică cu subprogramul prim.
Modelul 89 Vectorul numerelor prime dintr-un șir citit până la 0
Exemplu
Pentru datele de intrare:
15 7 2 9 13 1 0vectorul construit are elementele:
7 2 13Cum se rezolvă
- variabila
kreține numărul de elemente ale vectoruluivși pornește de la 0; - se citește un număr, apoi, cât timp numărul citit este diferit de 0, se verifică dacă este prim;
- un număr prim se adaugă în vector:
kcrește cu 1, iar numărul se memorează înv[k]; - la final se afișează cele
kelemente ale vectorului.
Primalitatea se verifică cu subprogramul prim.
Modelul 90 Elementele prime ale unui șir citit din fișier, scrise în alt fișier
Exemplu
Dacă fișierul sir.in conține:
4 9 11 1 23 25 2fișierul sir.out va conține:
11 23 2Cum se rezolvă
Numărul de valori din fișier nu este dat, de aceea citirea se face cât timp mai există numere în
fișier: expresia f >> x are valoarea false după ultimul număr.
- fiecare număr citit se verifică cu subprogramul
prim; - numerele prime se scriu în fișierul
sir.out, despărțite prin spații.
Modelul 91 Elementele prime de deasupra diagonalei principale
Modelul 92 Numerele perfecte de sub diagonala principală
Exemplu
Pentru datele de intrare:
3
1 2 3
6 5 4
12 496 7se afișează:
2Sub diagonala principală se află elementele 6, 12 și 496. Numerele 6 și 496 sunt perfecte, iar 12 nu este: 1 + 2 + 3 + 4 + 6 = 16.
Cum se rezolvă
Cu liniile și coloanele numerotate de la 1, elementul a[i][j] se află sub diagonala principală
dacă i > j.
- subprogramul
perfectadună divizorii luixde la 1 lax / 2și compară suma cux; - pentru fiecare linie
i, de la 2 lan, coloanajia valori de la 1 lai - 1; - contorul
nrcrește pentru fiecare element perfect.
Un divizor al lui x, diferit de x, nu depășește x / 2, de aceea căutarea se oprește la
x / 2.
Modelul 93 Elementele cu suma cifrelor pară de deasupra diagonalei secundare
Exemplu
Pentru datele de intrare:
3
11 12 13
24 25 26
37 38 39se afișează:
2Deasupra diagonalei secundare se află elementele 11, 12 și 24, cu sumele cifrelor 2, 3 și 6. Două dintre sume sunt pare.
Cum se rezolvă
Cu liniile și coloanele numerotate de la 1, elementul a[i][j] se află pe diagonala secundară
dacă i + j = n + 1 și deasupra ei dacă i + j < n + 1, adică j <= n - i.
- subprogramul
sumaCifrelorreturnează suma cifrelor unui număr; - pentru fiecare linie
i, de la 1 lan - 1, coloanajia valori de la 1 lan - i; - contorul
nrcrește pentru fiecare element cu suma cifrelor pară.
Modelul 94 Elementele formate numai din cifre impare de sub diagonala secundară
Exemplu
Pentru datele de intrare:
3
11 12 13
24 25 15
37 38 39se afișează:
2Sub diagonala secundară se află elementele 15, 38 și 39. Numerele 15 și 39 sunt formate numai din cifre impare.
Cum se rezolvă
Cu liniile și coloanele numerotate de la 1, elementul a[i][j] se află sub diagonala secundară
dacă i + j > n + 1, adică j >= n - i + 2.
- subprogramul
cifreImparereturneazăfalsela prima cifră pară găsită șitruedacă toate cifrele sunt impare; - pentru fiecare linie
i, de la 2 lan, coloanajia valori de lan - i + 2lan; - contorul
nrcrește pentru fiecare element format numai din cifre impare.
Modelul 95 Numărul de valori neprime de pe fiecare coloană a unei matrice
Modelul 96 Numerele prime până la n, câte 10 pe linie, într-un fișier
Modelul 97 Numerele de cinci cifre cu suma cifrelor divizor al produsului cifrelor
Exemplu
Programul nu are date de intrare. Se afișează 12 511 numere; primele sunt:
11125 11133 11147 11152 11169 11174 11196 11215 11222 11226 ...Printre ele se află 12345: 120 = 15 · 8. Pentru 11125, suma cifrelor este 10, iar produsul este 10.
Cum se rezolvă
Se parcurg numerele de la 10000 la 99999. Pentru fiecare număr se calculează, la aceeași parcurgere a cifrelor:
- suma cifrelor
s, care pornește de la 0; - produsul cifrelor
p, care pornește de la 1.
Numărul se afișează dacă p % s == 0.
Modelul 98 Al p-lea număr prim mai mare decât n
Exemplu
Pentru n = 20 și p = 4 se afișează:
37Numerele prime mai mari decât 20 sunt 23, 29, 31, 37, …; al patrulea este 37.
Cum se rezolvă
- variabila
xpornește de lan, iar contorulgasitede la 0; - cât timp
gasite < p,xcrește cu 1, iar dacă noulxeste prim,gasitecrește cu 1; - structura repetitivă se oprește chiar la al
p-lea număr prim, care se afișează.
Primalitatea se verifică cu subprogramul prim.
Modelul 99 Factorul prim cu puterea cea mai mare din descompunerea unui număr
Exemplu
| x | Descompunerea | Se afișează |
|---|---|---|
| 360 | 2³ · 3² · 5 | 2 |
| 2250 | 2 · 3² · 5³ | 5 |
| 36 | 2² · 3² | 2 |
Dacă mai mulți factori apar la aceeași putere maximă, se afișează cel mai mic dintre ei.
Cum se rezolvă
Descompunerea în factori primi se face prin împărțiri repetate, cu divizorul d pornind de la 2:
- cât timp
xse împarte exact lad, se împarte și se numără împărțirile în variabilaputere; - dacă
putereeste mai mare decâtputereMax, se rețin noua putere maximă și factoruld; dcrește cu 1, iar procedeul se reia până cândxdevine 1.
Modelul 100 Descompunerea unui număr natural în factori primi
Exemplu
Pentru x = 360 se afișează:
360 = 2^3 * 3^2 * 5^1Cum se rezolvă
Divizorul d pornește de la 2. Cât timp x este mai mare decât 1:
- se numără în variabila
puterede câte ori se împarte exactxlad, iarxse împarte de tot atâtea ori; - dacă
putereeste mai mare decât 0,deste factor prim al numărului și se afișează sub formad^putere; dcrește cu 1.
Divizorii d care nu sunt primi nu îl mai divid pe x, deoarece factorii lor primi au fost deja
eliminați. Variabila primul permite afișarea semnului * numai între factori.
Modelul 101 Cel mai mare divizor comun a n numere citite din fișier
Exemplu
Fișierul NUMERE.TXT:
6
12 60 48 24 72 96Se afișează:
12Cum se rezolvă
- Cel mai mare divizor comun a două numere se calculează cu algoritmul lui Euclid, prin împărțiri
repetate, într-un subprogram
cmmdc. - Primul număr din fișier se păstrează în variabila
d. - Pentru fiecare dintre următoarele numere,
ddevine cel mai mare divizor comun dintredși numărul citit. - La final,
deste cel mai mare divizor comun al tuturor celor n numere.
Modelul 102 Partiționarea unui șir de numere întregi după o valoare x
Exemplu
Pentru n = 7, numerele 5 -2 9 4 12 6 7 și x = 6 se afișează:
5 -2 4
9 12 7Elementul egal cu 6 nu este nici mai mic, nici mai mare decât x, deci nu intră în niciun subșir.
Cum se rezolvă
- Se citesc n, cele n elemente ale vectorului
vși valoarea x. - Vectorul se parcurge o singură dată:
- un element mai mic decât x se adaugă la sfârșitul vectorului
a; - un element mai mare decât x se adaugă la sfârșitul vectorului
b.
- un element mai mic decât x se adaugă la sfârșitul vectorului
- Variabilele
nașinbrețin câte elemente are fiecare subșir. - Se afișează vectorul
ape un rând și vectorulbpe rândul următor.
Modelul 103 Rearanjarea unui șir: descrescător până la jumătate, apoi crescător
Modelul 104 Matrice pătratică completată pe linii cu primele n*n numere pare
Modelul 105 Matrice pătratică completată cu primele n*n numere impare, în ordine descrescătoare
Modelul 106 Ordonarea crescătoare a n valori și verificarea că sunt distincte
Modelul 107 Căutarea unei valori într-un vector ordonat crescător
Exemplu
Pentru n = 7, elementele 2 5 8 11 15 20 31 și x = 15 se afișează:
15 se gaseste pe pozitia 5Pentru x = 9 se afișează 9 nu se gaseste in vector.
Cum se rezolvă
Vectorul este ordonat crescător, deci se poate folosi căutarea binară:
- căutarea se face în secvența dintre pozițiile
stșidr, inițial1șin; - se compară x cu elementul din mijlocul secvenței, de pe poziția
m = (st + dr) / 2; - dacă
v[m] == x, valoarea a fost găsită; - dacă
v[m] < x, căutarea continuă în jumătatea din dreapta (st = m + 1); - dacă
v[m] > x, căutarea continuă în jumătatea din stânga (dr = m - 1); - căutarea se oprește când valoarea a fost găsită sau când secvența a rămas fără elemente
(
st > dr).
Modelul 108 Elementul maxim, cu elementele din stânga lui ordonate crescător și cele din dreapta descrescător
Modelul 109 Media aritmetică a elementelor pozitive și elementele pare de pe poziții impare
Exemplu
Pentru n = 7 și elementele 4 0 6 3 8 10 0 se afișează:
6.2
4 6 8 0Elementele pozitive sunt 4, 6, 3, 8 și 10, cu suma 31, deci media este 31 / 5 = 6.2. Pe pozițiile
impare 1, 3, 5 și 7 se află 4, 6, 8 și 0, toate pare.
Cum se rezolvă
- Elementele sunt naturale, deci un element este pozitiv când este diferit de 0.
- Se calculează suma
sși numărulkal elementelor pozitive, iar media estes / k. Suma se transformă îndoubleînainte de împărțire, ca rezultatul să păstreze zecimalele. - Dacă nu există elemente pozitive, media nu se poate calcula și se afișează un mesaj.
- Pozițiile impare se parcurg cu pasul 2, pornind de la 1, și se afișează elementele pare găsite pe ele.
Modelul 110 Metoda bulelor pe un vector de numere reale; ordonarea elementelor pozitive fără a muta elementele negative
Modelul 111 Metoda selecției pe un vector de numere reale; ordonarea elementelor impare fără a muta numerele pare
Modelul 112 Numărul de zerouri și linia cu suma maximă într-o matrice binară citită din fișier
Modelul 113 Numerele dintr-un fișier, sortate crescător și scrise câte n pe linie
Exemplu
În exemplu, coloana din stânga conține fiecare linie din BAC.IN sortată crescător, iar coloana din
dreapta conține toate numerele din BAC.IN sortate crescător, câte 3 pe linie. Programul de mai jos
rezolvă cerința din afara parantezei, deci pentru n = 3 scrie în BAC.OUT:
1 3 3
4 5 8
8 9Cum se rezolvă
Numerele au cel mult 3 cifre, deci iau valori de la 0 la 999. De aceea ordonarea se face cu un vector de frecvență:
f[x]reține de câte ori apare numărulxîn fișier;- numerele se citesc din fișier până la sfârșitul lui, fără să conteze cum sunt așezate pe rânduri;
- valorile
xse parcurg de la 0 la 999, iar fiecare se scrie def[x]ori, deci numerele ies în ordine crescătoare; - variabila
knumără câte numere s-au scris pe linia curentă; când ajunge la n, se trece pe linia următoare.
Modelul 114 Maximul a n numere și numărul lui de apariții
Exemplu
Pentru n = 8 și numerele 12 45 7 45 3 45 20 1 se afișează:
45 3Cum se rezolvă
Maximul și numărul lui de apariții se determină în aceeași parcurgere, pe măsură ce se citesc numerele:
- primul număr devine maximul, cu o apariție;
- un număr mai mare decât maximul devine noul maxim, iar numărul de apariții redevine 1;
- un număr egal cu maximul crește numărul de apariții cu 1.
Modelul 115 Numărul de apariții ale elementului minim într-un șir de numere reale
Exemplu
Pentru n = 6 și numerele 2.5 -1.5 4 -1.5 0 7 se afișează:
2Elementul minim este -1.5 și apare de două ori.
Cum se rezolvă
- Numerele se citesc într-un vector
vde tipdouble. - La o primă parcurgere se determină elementul minim.
- La a doua parcurgere se numără elementele egale cu minimul.
Compararea cu == este corectă aici, pentru că minimul nu este calculat, ci este chiar una dintre
valorile citite.
Modelul 116 Cel mai mic și cel mai mare număr din fiecare linie a unui fișier, cu numărul de apariții
Modelul 117 Numărul de vocale dintr-un text
Exemplu
Pentru textul Informatica este frumoasa se afișează:
11Cum se rezolvă
- Textul poate conține spații, deci se citește cu
cin.getline, care citește tot rândul. - Se parcurge textul caracter cu caracter, până la caracterul nul de la sfârșitul șirului.
- Un caracter este vocală dacă apare în șirul
"aeiouAEIOU"; verificarea se face cu funcțiastrchr, care întoarceNULLcând caracterul nu se găsește în șir.
Modelul 118 Numărul de cifre dintr-un text
Exemplu
Pentru textul Anul 2016 are 366 de zile se afișează:
7Cum se rezolvă
- Textul se citește cu
cin.getline, ca să fie citite și spațiile. - Se parcurge textul caracter cu caracter.
- Un caracter este cifră dacă se află între
'0'și'9', pentru că în codul ASCII cifrele au coduri consecutive.
Modelul 119 Schimbarea literelor mici în litere mari și invers, într-un fișier text
Exemplu
Pentru fișierul BAC.IN din enunț, programul scrie în BAC.OUT:
tATA eSTE LA
pIATa?Litera T de la începutul primului rând este mare, deci devine t.
Cum se rezolvă
- Fișierul se citește linie cu linie, cu
fin.getline, până la sfârșitul lui. - Fiecare caracter al liniei se verifică:
- o literă mică se transformă în literă mare cu
toupper; - o literă mare se transformă în literă mică cu
tolower; - celelalte caractere (spații, semne de punctuație, cifre) rămân neschimbate.
- o literă mică se transformă în literă mare cu
- Linia transformată se scrie în
BAC.OUT, urmată de trecerea la linia următoare.
Modelul 120 Produsul primilor n termeni ai șirului lui Fibonacci
Cum se rezolvă
Termenii șirului se calculează pe rând, fără vector, cu trei variabile:
așibsunt ultimii doi termeni calculați, inițialf₁ = 1șif₂ = 1;- termenul următor este
c = a + b, după careaprimește valoarea luib, iarbvaloarea luic.
Primii doi termeni sunt egali cu 1, deci produsul lor este 1, iar pentru n = 1 sau n = 2
rezultatul este 1. Produsul p pornește de la 1 și se înmulțește, pe rând, cu termenii f₃, ..., fₙ. Pentru
n = 6 termenii sunt 1, 1, 2, 3, 5, 8, iar produsul lor este 240.
Modelul 121 Verificarea că două numere sunt termeni consecutivi ai șirului lui Fibonacci
Exemplu
Pentru numerele 55 și 89 se afișează:
DAPentru numerele 21 și 55 se afișează NU: între ele se află termenul 34.
Cum se rezolvă
- Numerele se citesc în variabilele
xșiy; dacăx > y, se interschimbă, caxsă fie cel mai mic. - Se generează perechile de termeni consecutivi ai șirului
(a, b), pornind de la(1, 1); la fiecare pas, perechea devine(b, a + b). - Generarea continuă cât timp
a < x, adică până când primul termen al perechii ajunge laxsau îl depășește. - Numerele sunt termeni consecutivi numai dacă perechea la care s-a oprit generarea este chiar
(x, y). - Șirul începe cu doi termeni egali cu 1, deci perechea
(1, 2)se verifică separat: pentrux = 1generarea se oprește la perechea(1, 1).
Modelul 122 Suma primelor n numere prime
Modelul 123 Suma 1/2 + 1/3 + ... + 1/n afișată sub formă de fracție
Cum se rezolvă
Suma se păstrează ca fracție p / q, cu numărătorul și numitorul în variabile întregi. Inițial
suma este 0 / 1.
- La fiecare pas
k, de la 2 la n, se adună fracția1 / k:p / q + 1 / k = (p * k + q) / (q * k). - După fiecare adunare, fracția se simplifică prin cel mai mare divizor comun al numărătorului și al numitorului, calculat cu algoritmul lui Euclid. Astfel, numerele rămân cât mai mici, iar la final fracția este ireductibilă.
Pentru n = 5: 1/2 + 1/3 + 1/4 + 1/5 = (30 + 20 + 15 + 12) / 60 = 77/60.
Modelul 124 Suma puterilor S = x + x² + ... + xⁿ
Exemplu
Pentru x = 2 și n = 5 se afișează:
62Suma este 2 + 4 + 8 + 16 + 32 = 62. Pentru x = -3 și n = 3 se afișează -21, adică
-3 + 9 - 27.
Cum se rezolvă
- Variabila
preține puterea curentă a lui x; inițialp = 1. - La fiecare pas
i, de la 1 la n,pse înmulțește cu x, deci devinexla putereai, și se adună la sumă. - Pentru
x = 99șin = 9, puterea are 18 cifre, decipși suma se declară de tiplong long.
Modelul 125 Suma factorialelor E = 1 + 1*2 + 1*2*3 + ... + 1*2*...*n
Exemplu
Pentru n = 4 se afișează:
33Expresia este 1 + 2 + 6 + 24 = 33.
Cum se rezolvă
- Termenul de rang
ial sumei este1 * 2 * ... * i, adicăi!. - Fiecare termen se obține din cel dinaintea lui printr-o singură înmulțire:
i! = (i - 1)! * i. - Variabila
preține termenul curent, iarEsuma termenilor de până acum. - Factorialele cresc foarte repede, deci
pșiEse declară de tiplong long; așa rezultatul este corect până lan = 20.
Modelul 126 Produsul E = 1*(1+2)*(1+2+3)*...*(1+2+...+n)
Exemplu
Pentru n = 4 se afișează:
180Expresia este 1 * 3 * 6 * 10 = 180.
Cum se rezolvă
- Factorul de rang
ieste suma1 + 2 + ... + i. - Fiecare factor se obține din cel dinaintea lui printr-o singură adunare: suma
screște cui. - La fiecare pas, produsul
Ese înmulțește cu sumas. - Pentru
n = 9produsul depășește valoarea maximă a tipuluiint, deciEse declară de tiplong long.
Modelul 127 Suma cu semne alternante E = 1*3 - 2*5 + 3*7 - ... ± n*(2*n+1)
Exemplu
Pentru n = 4 se afișează:
-22Expresia este 3 - 10 + 21 - 36 = -22.
Cum se rezolvă
- Termenul de rang
iestei * (2 * i + 1). - Termenii de rang impar se adună, iar cei de rang par se scad.
- Variabila
semnare valoarea 1 la primul termen și își schimbă semnul la fiecare pas.
Modelul 128 Produsul scalar a doi vectori
Modelul 129 Produsul prin adunări repetate, câtul și restul prin scăderi repetate
Exemplu
Pentru a = 7 și b = 3 se afișează:
Produsul: 21
Catul: 2
Restul: 1Cum se rezolvă
Programul lucrează cu numere naturale.
Produsul a * b se obține adunând numărul a de b ori:
ppornește de la 0;- o structură repetitivă cu
bpași adună la fiecare pas valoarea luia.
Câtul și restul împărțirii lui a la b se obțin scăzând b din a cât timp se poate:
rpornește de laa, iar câtulcde la 0;- cât timp
r >= b, dinrse scadeb, iarccrește cu 1; - când
r < b, scăderile se opresc:ceste câtul, iarreste restul.
Modelul 130 Matrice pătratică simetrică față de diagonala principală
Modelul 131 Verificarea că un vector poate reprezenta o mulțime
Modelul 132 Intersecția a două mulțimi memorate în vectori
Modelul 133 Interschimbarea a două linii ale unei matrice
Modelul 134 Produsul elementelor de sub diagonala secundară
Exemplu
Pentru n = 3 și matricea
1 2 3
4 5 6
7 8 9se afișează:
432Sub diagonala secundară se află elementele 6, 8 și 9, iar 6 * 8 * 9 = 432.
Cum se rezolvă
- Pe diagonala secundară a unei matrice de ordin n se află elementele
a[i][j]cui + j == n + 1. - Sub diagonala secundară se află elementele cu
i + j > n + 1. - Produsul
ppornește de la 1 și se înmulțește cu fiecare element care îndeplinește condiția. - Produsul poate avea multe cifre, deci
pse declară de tiplong long.
Modelul 135 Suma elementelor de deasupra diagonalei secundare
Exemplu
Pentru n = 3 și matricea
1 2 3
4 5 6
7 8 9se afișează:
7Deasupra diagonalei secundare se află elementele 1, 2 și 4.
Cum se rezolvă
- Pe diagonala secundară a unei matrice de ordin n se află elementele
a[i][j]cui + j == n + 1. - Deasupra diagonalei secundare se află elementele cu
i + j < n + 1. - Pe linia
i, aceste elemente sunt pe coloanele de la 1 lan - i, deci se parcurg numai ele.
Modelul 136 Numerele pare dintr-un fișier, scrise în alt fișier, și numărul celor impare
Exemplu
Fișierul NUMERE.TXT:
10 15 21 23 8 4 7Fișierul PARE.TXT:
10
8
4
4Numerele impare din fișier sunt 15, 21, 23 și 7, deci pe ultimul rând se scrie 4.
Cum se rezolvă
- Numerele se citesc din fișier unul câte unul, până la sfârșitul fișierului.
- Un număr par se scrie în
PARE.TXT, urmat de trecerea la linia următoare. - Pentru un număr impar se mărește contorul
imp. - După citirea tuturor numerelor, valoarea lui
impse scrie pe ultimul rând al fișieruluiPARE.TXT.
Modelul 137 Construirea unui vector cu valorile pare dintre n numere citite
Exemplu
Pentru n = 7 și valorile 3 8 5 12 0 7 6 se afișează:
8 12 0 6Cum se rezolvă
- Valorile se citesc una câte una, fără să fie memorate toate.
- O valoare pară se adaugă la sfârșitul vectorului
v: numărul de elementekcrește cu 1, iar valoarea se pune pe pozițiak. - La final se afișează cele
kelemente ale vectorului construit. - Dacă nicio valoare nu este pară, vectorul rămâne fără elemente și se afișează un mesaj.
Modelul 138 Construirea unui vector cu valorile impare dintre n numere citite
Modelul 139 Numărul de perechi de elemente consecutive egale dintr-un vector
Exemplu
Pentru n = 8 și elementele 2 2 5 5 5 1 3 3 se afișează:
4Perechile de elemente consecutive egale sunt pe pozițiile (1, 2), (3, 4), (4, 5) și (7, 8).
Cum se rezolvă
- Elementele consecutive sunt perechile
v[i]șiv[i + 1], cuide la 1 lan - 1. - Pentru fiecare pereche cu elemente egale, contorul
nrcrește cu 1.
Modelul 140 Inserarea mediei aritmetice la mijlocul unui vector
Exemplu
Pentru n = 6 și elementele 3 7 1 9 4 6 se afișează:
3 7 1 5 9 4 6Media aritmetică este 30 / 6 = 5, iar vectorul obținut are 7 elemente, cu media pe poziția 4.
Cum se rezolvă
- Media aritmetică poate avea zecimale, deci vectorul se declară de tip
double. - Se calculează suma elementelor și media
ma = s / n. - Poziția de inserare este
p = n / 2 + 1, adică imediat după primelen / 2elemente. Pentrunimpar, înaintea mediei rămânn / 2elemente, iar după ea cu un element mai mult. - Elementele de pe pozițiile
n, n - 1, ..., pse deplasează cu o poziție spre dreapta, începând cu ultimul, ca să nu se piardă niciun element. - Pe poziția
p, rămasă liberă, se pune media, iar numărul de elemente devinen + 1.
Modelul 141 Elementele pare de pe pozițiile impare ale unui vector și numărul lor
Exemplu
Pentru n = 7 și elementele 4 3 6 8 7 2 10 se afișează:
4 6 10
3Pe pozițiile impare 1, 3, 5 și 7 se află 4, 6, 7 și 10, dintre care pare sunt 4, 6 și 10.
Cum se rezolvă
- Pozițiile se numerotează de la 1, deci pozițiile impare sunt 1, 3, 5, …; ele se parcurg cu pasul 2.
- Un element este par când restul împărțirii lui la 2 este 0; condiția este corectă și pentru numerele negative.
- Fiecare element par găsit se afișează, iar contorul
nrcrește cu 1. - Pe rândul următor se afișează valoarea lui
nr.
Modelul 142 Perechi de elemente consecutive în care al doilea este suma cifrelor primului
Modelul 143 Ștergerea elementului de pe poziția p dintr-un vector
Exemplu
Pentru n = 6, elementele 4 9 2 7 5 1 și p = 3 se afișează:
4 9 7 5 1Cum se rezolvă
- Elementele de pe pozițiile
p + 1, ..., nse deplasează cu o poziție spre stânga:v[i]primește valoarea luiv[i + 1], pentruide laplan - 1. - Astfel, valoarea de pe poziția p este înlocuită de elementul următor.
- Numărul de elemente scade cu 1, apoi se afișează vectorul.
Modelul 144 Interschimbarea valorilor de pe două poziții ale unui vector
Exemplu
Pentru n = 5, elementele 10 20 30 40 50, p = 2 și q = 5 se afișează:
10 50 30 40 20Cum se rezolvă
- Valorile
v[p]șiv[q]se interschimbă printr-o variabilă auxiliarăaux:auxprimește valoarea luiv[p];v[p]primește valoarea luiv[q];v[q]primește valoarea păstrată înaux.
- Vectorul se afișează după interschimbare.
Modelul 145 Verificarea că elementele unui vector sunt ordonate crescător
Exemplu
Pentru n = 5 și elementele 1 3 3 8 12 se afișează:
Vectorul este ordonat crescatorPentru n = 4 și elementele 2 5 4 9 se afișează Vectorul nu este ordonat crescator.
Cum se rezolvă
- Vectorul este ordonat crescător când fiecare element este mai mic sau egal cu elementul următor:
v[i] <= v[i + 1], pentruide la 1 lan - 1. - Variabila
ordonatpornește cu valoareatrue. - Vectorul se parcurge cât timp nu s-a găsit o pereche
v[i] > v[i + 1]; la prima astfel de pereche,ordonatdevinefalse, iar parcurgerea se oprește.
Modelul 146 Numărul de cuvinte de pe un rând al fișierului texte.txt și rândul cu cele mai multe cuvinte
Modelul 147 Elevii din fișierul elevi.txt afișați în ordine alfabetică
Modelul 148 Ștergerea liniilor cu toate elementele pare dintr-o matrice
Modelul 149 Șir de numere reale monoton și numărul elementelor cu valori întregi
Modelul 150 Numărul punctelor din interiorul unui cerc cu centrul în origine
Exemplu
Dacă fișierul puncte.in conține:
4 5
3 4
1 1
-2 3.5
6 0se afișează:
4 5
3 4
1 1
-2 3.5
6 0
2Punctele (1, 1) și (-2, 3.5) se află în interiorul cercului. Punctul (3, 4) se află pe cerc, iar punctul (6, 0) se află în exteriorul lui.
Cum se rezolvă
- un punct de coordonate (x, y) se află în interiorul cercului dacă distanța de la el la O este mai mică decât r, adică x² + y² < r²;
- comparația se face între pătrate, deci nu este necesară funcția
sqrt; - punctele de pe cerc, pentru care x² + y² = r², nu se numără.
Modelul 151 Perechile de numere relativ prime dintr-un fișier
Modelul 152 Literele dintr-un fișier, în ordine alfabetică, cu frecvența de apariție
Modelul 153 Indicii elementelor unui tablou în ordinea crescătoare a valorilor
Exemplu
Dacă fișierul tablou.txt conține:
5
4 1 5 2 3se afișează:
5
4 1 5 2 3
2 4 5 1 3Valoarea 1 se află pe poziția 2, valoarea 2 pe poziția 4, valoarea 3 pe poziția 5, valoarea 4 pe poziția 1, iar valoarea 5 pe poziția 3.
Cum se rezolvă
- elementele tabloului sunt n numere distincte din mulțimea {1, 2, …, n}, deci fiecare valoare de la 1 la n apare o singură dată;
- la citirea elementului de pe poziția
i, cu valoareax, se memoreazăpoz[x] = i; - vectorul
pozse afișează de lapoz[1]lapoz[n], deci indicii apar în ordinea crescătoare a valorilor, fără să fie necesară o ordonare.
Modelul 154 Matricea 10 × 10 cu zone delimitate de cele două diagonale
Modelul 155 Număr divizibil cu suma cifrelor sale
Modelul 156 Media geometrică a celui mai mare și a celui mai mic număr dintr-un șir
Modelul 157 Sufixele unui cuvânt, de la ultima literă la cuvântul întreg
Modelul 158 Maximul de pe un rând al unui tablou bidimensional
Modelul 159 Numerele pare de două cifre și numerele impare de trei cifre dintr-o secvență
Modelul 160 Numerele obținute prin mutarea primei cifre pe ultima poziție
Exemplu
Dacă fișierul date.txt conține:
1234pe ecran se afișează 1234, iar fișierul rez.txt conține:
2341
3412
4123O nouă mutare a primei cifre ar da din nou numărul 1234.
Cum se rezolvă
- se determină numărul de cifre
kal luinși putereap = 10^(k-1); - pentru un număr
xdekcifre:- prima cifră este
x / p; - numărul fără prima cifră este
x % p; - numărul obținut prin mutarea primei cifre pe ultima poziție este
x % p * 10 + x / p;
- prima cifră este
- operația se repetă de
k - 1ori, deoarece ak-a mutare dă din nou număruln; - dacă numărul obținut începe cu cifra 0, el are mai puțin de
kcifre, darprămâne același, deci cifra 0 trece corect pe ultima poziție la mutarea următoare (de exemplu 1203, 2031, 312, 3120).
Modelul 161 Număr egal cu suma factorialelor cifrelor lui
Modelul 162 Numărul de cuvinte dintr-un text și literele cu frecvența maximă
Modelul 163 Numerele de n cifre care adunate cu inversul lor dau pătrate perfecte
Modelul 164 Matrice generată aleator, cu diagonala principală ordonată crescător
Modelul 165 Matricea cu 0 pe diagonala principală, 1 sub ea și 2 deasupra ei
Modelul 166 Matricea cu liniile de indice impar egale cu 1 și cele de indice par egale cu pătratul indicelui
Modelul 167 Matrice simetrică față de diagonala principală
Modelul 168 Literele mari dintr-un fișier, ordonate alfabetic, cu frecvența de apariție
Modelul 169 Primele n numere prime
Modelul 170 Număr din șirul lui Fibonacci
Modelul 171 Conversia unui număr din baza 2 în baza 10
Exemplu
Dacă fișierul binar.in conține:
101101se afișează:
101101
45101101₂ = 1 · 2⁵ + 0 · 2⁴ + 1 · 2³ + 1 · 2² + 0 · 2¹ + 1 · 2⁰ = 32 + 8 + 4 + 1 = 45.
Cum se rezolvă
- numărul se citește ca șir de caractere, deoarece un număr scris în baza 2 are multe cifre;
- cifrele se parcurg de la stânga la dreapta, iar valoarea se calculează cu relația
v = v * 2 + cifra, unde cifra estes[i] - '0'.
Modelul 172 Divizorii primi ai unui număr natural
Modelul 173 Conversia unui număr din baza 10 în baza 2
Modelul 174 Cel mai mare divizor comun al n numere
Modelul 175 Număr palindrom
Modelul 176 Ordonarea descrescătoare a n numere întregi, scrise în fișierul ordonat.out
Modelul 177 Interclasarea a două șiruri ordonate crescător, citite din două fișiere
Modelul 178 Căutarea binară a unui număr într-un șir ordonat crescător
Exemplu
Dacă fișierul numere.in conține:
7
2 5 8 12 16 23 38și de la tastatură se citește x = 16, se afișează:
7
2 5 8 12 16 23 38
Numarul 16 se afla in sir pe pozitia 5Pentru x = 10, ultimul rând afișat este Numarul 10 nu se afla in sir.
Cum se rezolvă
Șirul este ordonat crescător, deci căutarea optimă este căutarea binară:
- secvența în care se caută este cuprinsă între pozițiile
stșidr, inițial 1 șin; - se compară
xcu elementul din mijloc,a[mij], undemij = (st + dr) / 2:- dacă sunt egale, numărul a fost găsit pe poziția
mij; - dacă
a[mij] < x, căutarea continuă în jumătatea din dreapta, cust = mij + 1; - dacă
a[mij] > x, căutarea continuă în jumătatea din stânga, cudr = mij - 1;
- dacă sunt egale, numărul a fost găsit pe poziția
- căutarea se oprește când numărul a fost găsit sau când
st > dr.
La fiecare pas, lungimea secvenței se înjumătățește, deci numărul de comparații este de ordinul log₂ n.
Modelul 179 Suma S = 1 + x/1! + x²/2! + … + xⁿ/n!
Exemplu
Pentru x = 2 și n = 3 se afișează pe ecran și se scrie în fișierul s.txt:
6.3333333333S = 1 + 2/1 + 4/2 + 8/6 = 1 + 2 + 2 + 1.3333… = 6.3333…
Cum se rezolvă
- termenul
tal sumei pornește de la 1, primul termen; - termenul de rang
ise obține din cel de rangi - 1: xⁱ/i! = xⁱ⁻¹/(i-1)! · x/i, decit = t * x / i; - astfel nu se calculează separat puterea și factorialul la fiecare pas;
- suma se memorează într-o variabilă de tip
double, tipul real cu dublă precizie, și se scrie cu 10 zecimale.
Modelul 180 Eliminarea ultimului cuvânt dintr-un text
Modelul 181 Numerele dintr-un fișier, fiecare cu mesajul DA sau NU după cum este prim
Modelul 182 Maximul numerelor pare dintr-un fișier
Modelul 183 Mulțimea elementelor unui șir și numărul elementelor de două cifre
Modelul 184 Înlocuirea elementelor neprime ale unei matrice cu valoarea 1
Modelul 185 Suma numerelor întregi ale căror module sunt pătrate perfecte
Exemplu
Dacă fișierul numere.txt conține:
4 -9 7 0 16 -5 25 3se afișează:
4 -9 7 0 16 -5 25 3
36Modulele 4, 9, 0, 16 și 25 sunt pătrate perfecte, iar 4 + (-9) + 0 + 16 + 25 = 36.
Cum se rezolvă
- numerele se citesc din fișier unul câte unul și se afișează;
- subprogramul
patratPerfectcaută cel mai micrcur * r >= x; numărulxeste pătrat perfect dacăr * r == x; - subprogramul se apelează pentru
abs(x), iar la sumă se adaugă numărulx, cu semnul lui.
Materialul acesta se citește pe educamp.ro și nu se tipărește.
S-a încheiat minutul de citit liber.
Vezi modelele rezolvate ca și cursant
Structura probei — subiectele, punctajele și timpul de lucru — se citește gratuit și integral. Pentru a citi modelele rezolvate, te înscrii la cursul de pregătire.
Te înscrii, alegi în cont când începe cursul și plătești prima lună prin transfer bancar. Pentru a vedea mai întâi ce se cere la probă, poți reveni la structura probei.
Acces la suportul de curs
25 RON / lună, fără ședințe
Ce cuprinde:
- Acces la toate lecțiile disponibile
- Suport de curs pentru tematica științifică și metodică
- Exemple, explicații și exerciții
- Acces la materialele noi adăugate pe platformă
- Posibilitatea de a adresa întrebări