Un vector sau tablou unidimensional este un șir de elemente de același tip, care pot memora valori. Toate elementele vectorului au aceeași categorie de date (de exemplu, numere întregi, reale etc.). Fiecare element are o poziție, cu care îl putem accesa sau modifica. Vectorul are o dimensiune fixă (numărul maxim de elemente), dar putem decide câte dintre ele folosim.
Analogie:
Sintaxa:
int v[5];
Ce înseamnă:
#include <iostream>
using namespace std;
int main() {
int v[5]; // bloc cu 5 apartamente
// Citim numărul de locatari în fiecare apartament
for(int i=0; i<5; i++) {
cout << "Cate persoane sunt in apartamentul " << i << "? ";
cin >> v[i];
}
// Afișăm numărul de locatari
cout << "\nStarea blocului:\n";
for(int i=0; i<5; i++) {
cout << "Apartamentul " << i << " are " << v[i] << " locatari.\n";
}
return 0;
}
Cate persoane sunt in apartamentul 0? 2 Cate persoane sunt in apartamentul 1? 3 Cate persoane sunt in apartamentul 2? 0 Cate persoane sunt in apartamentul 3? 1 Cate persoane sunt in apartamentul 4? 4 Starea blocului: Apartamentul 0 are 2 locatari. Apartamentul 1 are 3 locatari. Apartamentul 2 are 0 locatari. Apartamentul 3 are 1 locatari. Apartamentul 4 are 4 locatari.
Blocul de apartamente (vectorul v) cu numărul de locatari:
| Poziția (apartament) | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| Număr locatari | 2 | 3 | 0 | 1 | 4 |
Observații:
v[poziție] = valoare;Teorie. Parcurgerea cu prelucrarea elementelor presupune citirea și analizarea fiecărui element dintr-un vector și aplicarea unor operații asupra lor (filtrare, calcul de sume/medii, determinarea unor proprietăți etc.). Prin intermediul parcurgerii putem rezolva probleme precum găsirea valorii maxime, numărarea elementelor cu o anumită caracteristică sau construirea unui alt tablou pe baza elementelor selectate.
Enunț: Se citește de la tastatură un număr natural n (0 < n <= 100) și un vector v cu n elemente întregi.
Să se calculeze suma elementelor pozitive și să se afișeze rezultatul.
#include <iostream>
using namespace std;
int main() {
int n, v[100], suma = 0;
cin >> n;
for (int i = 0; i < n; i++)
cin >> v[i];
for (int i = 0; i < n; i++)
if (v[i] > 0)
suma += v[i];
cout << "Suma elementelor pozitive este: " << suma;
return 0;
}
1. Se citesc elementele unui tablou unidimensional cu n (n ≤ 100) componente.
Să se calculeze media aritmetică a componentelor.
Exemplu: Pentru n = 5 si vectorul v = 2 8 10 4 6 → media = 6
2. Să se determine valoarea minimă și valoarea maximă dintr-un tablou cu n elemente.
Exemplu: Pentru n=5 si vectorul v = 3 15 7 20 9 → minim = 3, maxim = 20
3. Să se afișeze valoarea componentei cu număr maxim de divizori. Dacă sunt mai multe, se afișează cea mai mică.
Exemplu: Pentru n=6 si vectorul v = 10 49 35 25 6 3 → 6
4. Să se determine valoarea maximă și de câte ori apare aceasta în tablou.
Exemplu: Pentru n=6 si vectorul v = 5 12 7 12 9 12 → maxim = 12, apare de 3 ori
5. Să se verifice dacă tabloul este ordonat (crescător sau descrescător).
Exemplu: Pentru n=4 si vectorul v = 2 5 9 11 → ordonat crescător
6. Prelucrări pe tabloul v:
a) Afișați și numărați elementele pare de pe poziții impare.
b) Numărați elementele pozitive și pare.
c) Calculați produsul elementelor negative.
d) Determinați media aritmetică a elementelor pozitive.
Exemplu: Pentru n=6 si vectorul v = 3 -2 4 7 -5 8 →
a) 4, 8 (2 elemente)
b) 4, 8 (2 elemente)
c) (-2)·(-5) = 10
d) (3+4+7+8)/4 = 5.5
7. Să se determine dacă oricare două elemente alăturate au parități diferite.
Exemplu: Pentru n=5 si vectorul v = 3 6 1 18 13 → DA
8. Să se determine dacă oricare două elemente alăturate au semne diferite.
Exemplu: Pentru n=5 si vectorul v = 3 -6 1 -8 13 → DA
9. Prelucrări pe tabloul v:
a) Afișați valorile prime.
b) Afișați numerele prime a căror invers este tot prim.
Exemplu: Pentru n=5 si vectorul v = 13 17 23 31 37 →
a) 13, 17, 23, 31, 37
b) 13 (inversul 31 este prim), 17 (inversul 71 este prim)
10. Să se determine câte elemente din tabloul a, cu na elemente, sunt strict mai mici decât toate elementele din tabloul b, cu nb elemente.
Exemplu: Pentru na=3, vectorul a = 2 5 7, nb=3 si vectorul b = 10 12 15 → 3 elemente
11. Să se determine elementul cu numărul de ordine k din tabloul ordonat crescător, fără a ordona tabloul.
Exemplu: Pentru n=4 si vectorul v = 7 2 9 4, k = 2 → al doilea element ordonat = 4
12. Să se determine pe ce poziție s-ar situa primul element după ordonarea crescătoare a tabloului.
Exemplu: Pentru n=4 si vectorul v = 8 5 12 7 → primul element este 8, în ordonare ar fi pe poziția 3
13. Să se numere câte elemente sunt egale cu media aritmetică a vecinilor lor.
Exemplu: Pentru n=5 si vectorul v = 2 5 8 6 4 → elementul 6 este media vecinilor (8 și 4) → 1 element
14. Să se verifice dacă elementele unui șir pot forma:
a) progresie aritmetică,
b) progresie geometrică. Dacă da, afișați rația.
Exemplu: Pentru n=5 si vectorul v = 2 4 6 8 10 → progresie aritmetică, rația = 2
15. Să se determine dacă toate elementele tabloului sunt egale.
Exemplu: Pentru n=4 si vectorul v = 7 7 7 7 → DA
16. Pentru un tablou ordonat crescător, afișați fiecare valoare și frecvența sa.
Exemplu: Pentru n=6 si vectorul v = 2 2 3 3 3 5 → 2 apare de 2 ori, 3 apare de 3 ori, 5 apare o dată
17. Se citesc n numere reale. Determinați câte sunt egale cu media aritmetică a celorlalte n-1.
Exemplu: Pentru n=3 si vectorul v = 2 4 6 → media (2,6) = 4 → 1 element
18. Să se afișeze „DA” dacă toate numerele impare sunt ordonate crescător și cele pare descrescător, altfel „NU”.
Exemplu: Pentru n=6 si vectorul v = 9 3 8 6 5 7 → DA
19. Pentru un tablou de numere reale pozitive ordonate crescător, determinați numărul minim de intervale [x; x+1], cu x ∈ ℕ, care acoperă toate valorile.
Exemplu: Pentru n=5 si vectorul v = 1.2 1.5 2.3 2.7 3.8 → 3 intervale
20. Se citesc două numere a, b și un tablou v. Afișați elementele din v care aparțin intervalului [a, b].
Exemplu: Pentru n=3 si vectorul v = 2 5 8 11, a = 4, b = 9 → 5, 8
21. Să se afle câte elemente pot fi scrise ca sumă a celor două elemente alăturate.
Exemplu: Pentru n=8 si vectorul v = 2 7 5 1 4 2 -2 5 → 2 elemente
22. Să se determine câte numere reale din tablou au mai mult de x zecimale (x < 6).
Exemplu: Pentru n=3 si vectorul v = 1.2345 2.1 3.141592, x = 3 → 2 numere
23. Să se afișeze perechile de elemente alăturate cu suma maximă.
Exemplu: Pentru n=5 si vectorul v = 4 9 1 7 6 → perechea (9, 1) suma = 10
24. Să se dubleze valorile egale cu valoarea minimă din tablou.
Exemplu: Pentru n=5 si vectorul v = 4 2 7 2 9 → 4 4 7 4 9
25. Să se genereze un tablou b în care fiecare element este prima cifră a elementului corespunzător din a.
Exemplu: Pentru n=3 si vectorul a = 345 72 804 → b = 3 7 8
26. Să se genereze un tablou b în care fiecare element este cea mai mare cifră a elementului corespunzător din a.
Exemplu: Pentru n=3 si vectorul a = 345 72 804 → b = 5 7 8
27. Să se genereze un tablou b în care fiecare element este numărul de divizori ai elementului corespunzător din a.
Exemplu: Pentru n=3 si vectorul a = 6 10 15 → b = 4 4 4
28. Să se genereze un tablou b în care fiecare element reprezintă numărul de cifre al elementului corespunzător din a.
Exemplu: Pentru n=3 si vectorul a = 6 123 45 → b = 1 3 2
Teorie. Copierea elementelor dintr-un vector v în alt vector w se face parcurgând elementele
vectorului sursă și introducând în vectorul destinație fie toate elementele, fie doar pe cele care respectă o anumită condiție.
Pentru vectorul w vom folosi un contor m, care reprezintă numărul elementelor introduse.
Enunț: Se citește de la tastatură un număr natural n (0 < n < 300) și un vector v cu n elemente.
Scrieți un program C++ care transferă toate elementele prime din vectorul v în vectorul w și afișează vectorul w.
#include <iostream>
using namespace std;
int estePrim(int x) {
if (x < 2) return 0;
for (int d = 2; d * d <= x; d++)
if (x % d == 0) return 0;
return 1;
}
int main() {
int n, v[300], w[300], m = 0;
cin >> n;
for (int i = 0; i < n; i++)
cin >> v[i];
for (int i = 0; i < n; i++)
if (estePrim(v[i])) {
w[m] = v[i];
m++;
}
for (int i = 0; i < m; i++)
cout << w[i] << " ";
return 0;
}
1. Să se genereze vectorul w care conține toate numerele pozitive din vectorul v.
Exemplu: Pentru n=6 și vectorul v = 3 -5 8 -2 7 0 → w = 3 8 7
2. Să se genereze vectorul w care conține doar numerele pare din vectorul v.
Exemplu: Pentru n=5 și vectorul v = 7 4 2 9 8 → w = 4 2 8
3. Să se genereze vectorul w care conține doar numerele negative din vectorul v.
Exemplu: Pentru n=5 și vectorul v = -3 10 -1 0 5 → w = -3 -1
4. Să se genereze vectorul w care conține elementele din v multiplu de 5.
Exemplu: Pentru n=5 și vectorul v = 10 13 25 7 40 → w = 10 25 40
5. Să se genereze vectorul w care conține valorile din v mai mari decât 100.
Exemplu: Pentru n=5 și vectorul v = 50 120 300 90 105 → w = 120 300 105
6. Să se genereze vectorul w care conține doar numerele impare din vectorul v.
Exemplu: Pentru n=5 și vectorul v = 2 7 8 11 4 → w = 7 11
7. Să se genereze vectorul w care conține elementele din v ce au ultima cifră egală cu 7.
Exemplu: Pentru n=4 și vectorul v = 27 45 77 82 → w = 27 77
8. Să se genereze vectorul w care conține numerele pătrat perfect din vectorul v.
Exemplu: Pentru n=5 și vectorul v = 4 16 10 7 25 → w = 4 16 25
9. Să se genereze vectorul w care conține elementele din v aflate pe poziții cu indice par.
Exemplu: Pentru n=5 și vectorul v = 10 20 30 40 50 → w = 10 30 50
10. Să se genereze vectorul w care conține elementele din v aflate pe poziții cu indice impar.
Exemplu: Pentru n=5 și vectorul v = 10 20 30 40 50 → w = 20 40
11. Să se genereze vectorul w care conține elementele din v ce au cifra zecilor egală cu 2.
Exemplu: Pentru n=5 și vectorul v = 23 145 220 57 92 → w = 23 220 92
12. Să se genereze vectorul w care conține elementele din v aflate în intervalul [50, 100].
Exemplu: Pentru n=5 și vectorul v = 40 60 85 120 75 → w = 60 85 75
13. Să se genereze vectorul w care conține elementele din v divizibile cu 3 și cu 5.
Exemplu: Pentru n=5 și vectorul v = 15 22 45 50 90 → w = 15 45 90
14. Să se genereze vectorul w care conține elementele din v formate din exact două cifre.
Exemplu: Pentru n=5 și vectorul v = 7 23 145 88 100 → w = 23 88
15. Să se genereze vectorul w care conține toate elementele din v egale cu primul element al vectorului.
Exemplu: Pentru n=5 și vectorul v = 5 7 5 10 5 → w = 5 5 5
Teorie. Căutarea secvențială este cea mai simplă metodă de căutare într-un vector. Ea constă în parcurgerea elementelor
vectorului de la primul la ultimul și compararea fiecărui element cu valoarea căutată x. Dacă este găsită valoarea,
se reține poziția (sau pozițiile) și căutarea continuă până la final, pentru a verifica întreaga listă. Dacă nu este găsită,
se va afișa că elementul nu există în vector. Complexitatea acestei metode este O(n).
Enunț: Se citesc de la tastatură două numere naturale n (0 < n < 300) și x, apoi un șir de n numere întregi.
Să se afișeze dacă x există în vector și, în caz afirmativ, să se afișeze pozițiile pe care apare,
iar în caz contrar să se afișeze mesajul „Numărul nu există în vector”.
Exemplu: pentru n = 5, x = 2, v = 20 35 2 43 7 se va afișa: Numărul se află pe poziția 3.
#include <iostream>
using namespace std;
int main() {
int n, x, v[300];
cin >> n >> x;
for (int i = 0; i < n; i++)
cin >> v[i];
bool gasit = false;
for (int i = 0; i < n; i++) {
if (v[i] == x) {
cout << "Numarul se afla pe pozitia " << i+1 << "\n";
gasit = true;
}
}
if (!gasit)
cout << "Numarul nu exista in vector";
return 0;
}
1. Să se determine prima poziție pe care apare valoarea x în vectorul v. Dacă nu apare, se va afișa un mesaj corespunzător.
Exemplu: Pentru n=6, x=10 și vectorul v = 5 7 10 12 15 20 → Numărul se află pe poziția 3
2. Să se determine ultima poziție pe care apare valoarea x în vectorul v.
Exemplu: Pentru n=5, x=7 și vectorul v = 3 7 5 7 8 → Numărul se află ultima dată pe poziția 4
3. Să se afișeze toate pozițiile pe care apare valoarea x în vectorul v.
Exemplu: Pentru n=5, x=2 și vectorul v = 2 4 2 6 2 → Numărul apare pe pozițiile 1 3 5
4. Să se verifice dacă valoarea x aparține mulțimii A și să se afișeze „DA” sau „NU”.
Exemplu: Pentru n=5, A = 2 7 -3 10 8 și x=10 → DA
5. Să se înlocuiască în vectorul v toate valorile egale cu valoarea minimă cu valoarea maximă din vector.
Exemplu: Pentru n=5 și vectorul v = 5 2 9 2 7 → v devine 5 9 9 9 7
6. Să se determine media aritmetică a elementelor din vectorul v diferite de valoarea x.
Exemplu: Pentru n=5, x=10 și vectorul v = 10 5 7 10 8 → media = (5+7+8)/3 = 6.67
7. Să se determine câte elemente din vectorul v sunt egale cu primul sau cu ultimul element al vectorului.
Exemplu: Pentru n=6 și vectorul v = 4 7 4 9 2 4 → 3 elemente
8. Să se afișeze indicii elementelor din vectorul v egale cu a doua componentă a vectorului.
Exemplu: Pentru n=6 și vectorul v = 5 8 7 8 2 8 → indicii 1 3 5
Teorie. Căutarea binară este un algoritm eficient de căutare într-un vector ordonat (crescător sau descrescător).
Algoritmul funcționează astfel: se ia mijlocul vectorului și se compară cu valoarea căutată x.
Dacă mijlocul este exact x, atunci valoarea a fost găsită. Dacă mijlocul este mai mare decât x, se caută doar în jumătatea stângă a vectorului,
iar dacă mijlocul este mai mic decât x, se caută în jumătatea dreaptă. Procesul se repetă împărțind de fiecare dată la jumătate zona de căutare.
Complexitatea algoritmului este O(log n), mult mai rapid decât căutarea secvențială. Atenție! Căutarea binară se poate aplica doar pe vectori ordonați.
Enunț: Se citesc de la tastatură două numere naturale n (0 < n < 300) și x, apoi un vector v cu n elemente ordonate crescător.
Să se afișeze dacă x există în vector și, în caz afirmativ, poziția pe care apare.
Exemplu: pentru n = 6, x = 25, v = 10 15 20 25 30 40 se va afișa: Numărul se află pe poziția 4.
#include <iostream>
using namespace std;
int main() {
int n, x, v[300];
cin >> n >> x;
for (int i = 0; i < n; i++)
cin >> v[i];
int st = 0, dr = n - 1;
bool gasit = false;
while (st <= dr) {
int mij = (st + dr) / 2;
if (v[mij] == x) {
cout << "Numarul se afla pe pozitia " << mij+1 << "\n";
gasit = true;
}
if (v[mij] >= x)
dr = mij - 1;
if (v[mij] <= x)
st = mij + 1;
}
if (!gasit)
cout << "Numarul nu exista in vector";
return 0;
}
Enunț: Se citesc elementele a două tablouri unidimensionale v și W cu m (m ≤ 100) respectiv n (n ≤ 100) componente întregi cu maxim patru cifre ordonate strict crescător.
Să se afișeze elementele comune celor două tablouri.
Exemplu: pentru m = 5, v = 1 4 7 10 15, n = 6, W = 2 4 5 7 12 15 se va afișa: Elementele comune sunt: 4 7 15.
#include <iostream>
using namespace std;
bool cauta(int W[], int n, int x) {
int st = 0, dr = n - 1;
while (st <= dr) {
int mij = (st + dr) / 2;
if (W[mij] == x) return true;
if (W[mij] < x) st = mij + 1;
else dr = mij - 1;
}
return false;
}
int main() {
int m, n, v[101], W[101];
cin >> m;
for (int i = 0; i < m; i++) cin >> v[i];
cin >> n;
for (int j = 0; j < n; j++) cin >> W[j];
bool gasit = false;
cout << "Elementele comune sunt: ";
for (int i = 0; i < m; i++) {
if (cauta(W, n, v[i])) {
cout << v[i] << " ";
gasit = true;
}
}
if (!gasit) cout << "Nu exista elemente comune.";
cout << "\n";
return 0;
}
#include <iostream>
using namespace std;
int main() {
int m, n, v[101], W[101];
cin >> m;
for (int i = 0; i < m; i++) cin >> v[i];
cin >> n;
for (int j = 0; j < n; j++) cin >> W[j];
bool gasit = false;
cout << "Elementele comune sunt: ";
for (int i = 0; i < m; i++) {
int x = v[i];
int st = 0, dr = n - 1;
bool ok = false;
while (st <= dr) {
int mij = (st + dr) / 2;
if (W[mij] == x) { ok = true; break; }
if (W[mij] < x) st = mij + 1;
else dr = mij - 1;
}
if (ok) {
cout << x << " ";
gasit = true;
}
}
if (!gasit) cout << "Nu exista elemente comune.";
cout << "\n";
return 0;
}
1. Să se determine dacă valoarea x există în vectorul v ordonat crescător și să se afișeze prima poziție pe care apare.
Exemplu: Pentru n=5, x=15 și vectorul v = 5 10 15 20 25 → Numărul se află pe poziția 3
2. Să se afișeze ultima poziție pe care apare valoarea x în vectorul v.
Exemplu: Pentru n=6, x=6 și vectorul v = 2 4 6 6 6 9 → Numărul apare ultima dată pe poziția 5
3. Să se determine dacă valoarea x apare cel puțin o dată în vectorul v.
Exemplu: Pentru n=5, x=8 și vectorul v = 1 3 5 7 9 → Numărul nu există în vector
4. Să se determine numărul total de apariții ale valorii x în vectorul v.
Exemplu: Pentru n=6, x=2 și vectorul v = 1 2 2 2 3 4 → Numărul apare de 3 ori
5. Să se verifice dacă valoarea x este mai mică decât toate elementele vectorului v.
Exemplu: Pentru n=3, x=2 și vectorul v = 5 6 7 → Numărul este mai mic decât toate elementele
6. Să se verifice dacă valoarea x este mai mare decât toate elementele vectorului v.
Exemplu: Pentru n=3, x=10 și vectorul v = 5 6 7 → Numărul este mai mare decât toate elementele
7. Să se verifice dacă valoarea x se află între valorile minimă și maximă ale vectorului v.
Exemplu: Pentru n=5, x=25 și vectorul v = 10 20 30 40 50 → Numărul se află în interval
8. Să se determine poziția primului element din vectorul v mai mare sau egal cu x.
Exemplu: Pentru n=4, x=25 și vectorul v = 10 20 30 40 → Prima valoare mai mare sau egală este 30, pe poziția 3
9. Să se determine poziția ultimului element din vectorul v mai mic sau egal cu x.
Exemplu: Pentru n=4, x=25 și vectorul v = 10 20 30 40 → Ultima valoare mai mică sau egală este 20, pe poziția 2
10. Să se determine câte elemente din vectorul v sunt mai mici decât valoarea x.
Exemplu: Pentru n=4, x=16 și vectorul v = 5 10 15 20 → Există 3 elemente mai mici decât 16
11. Să se determine câte elemente din vectorul v sunt mai mari decât valoarea x.
Exemplu: Pentru n=4, x=12 și vectorul v = 5 10 15 20 → Există 2 elemente mai mari decât 12
12. Să se determine poziția pe care ar trebui inserată valoarea x în vectorul ordonat v, astfel încât ordinea să se păstreze.
Exemplu: Pentru n=4, x=30 și vectorul v = 10 20 40 50 → Numărul ar trebui inserat pe poziția 3
13. Să se verifice dacă valoarea x este valoarea mediană a vectorului v.
Exemplu: Pentru n=5, x=15 și vectorul v = 5 10 15 20 25 → Numărul este valoarea mediană
14. Să se afișeze elementul din vectorul v care este cel mai apropiat de valoarea x.
Exemplu: Pentru n=4, x=28 și vectorul v = 10 20 30 40 → Cel mai apropiat este 30
15. Să se verifice dacă valoarea x se află în prima sau în a doua jumătate a vectorului v, în funcție de poziția sa.
Exemplu: Pentru n=6, x=50 și vectorul v = 10 20 30 40 50 60 → Numărul se află în a doua jumătate
Teorie. Sortarea prin interschimbare (sau sortarea prin metoda directă) este unul dintre cei mai simpli algoritmi de sortare.
Ideea este următoarea: pentru fiecare element al vectorului se caută în partea dreaptă un element mai mic (dacă se sortează crescător).
Dacă un astfel de element este găsit, cele două valori se interschimbă. Procedeul se repetă până când vectorul devine ordonat.
Complexitatea acestui algoritm este O(n^2), deci este eficient doar pentru volume mici de date.
Enunț: Se citește un număr natural n (0 < n < 300) și un vector v cu n elemente întregi.
Să se sorteze vectorul v în ordine crescătoare prin metoda interschimbării și să se afișeze vectorul rezultat.
Exemplu: pentru n=5 și v=34 12 45 2 18 se va afișa: 2 12 18 34 45.
#include <iostream>
using namespace std;
int main() {
int n, v[300];
cin >> n;
for (int i = 0; i < n; i++)
cin >> v[i];
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (v[i] > v[j]) {
int aux = v[i];
v[i] = v[j];
v[j] = aux;
}
}
}
for (int i = 0; i < n; i++)
cout << v[i] << " ";
return 0;
}
1. Să se sorteze vectorul v în ordine crescătoare.
Exemplu: Pentru n=4 și vectorul v = 4 2 9 1 → v devine 1 2 4 9
2. Să se sorteze vectorul v în ordine descrescătoare.
Exemplu: Pentru n=4 și vectorul v = 3 7 2 5 → v devine 7 5 3 2
3. Să se sorteze doar elementele pare din vectorul v în ordine crescătoare, păstrând pozițiile elementelor impare.
Exemplu: Pentru n=5 și vectorul v = 8 5 4 3 6 → v devine 4 5 6 3 8
4. Să se sorteze doar elementele impare din vectorul v în ordine crescătoare, păstrând pe loc elementele pare.
Exemplu: Pentru n=5 și vectorul v = 9 2 7 4 5 → v devine 5 2 7 4 9
5. Să se sorteze vectorul v în ordine crescătoare și să se elimine valorile duplicate.
Exemplu: Pentru n=5 și vectorul v = 5 2 2 8 5 → v devine 2 5 8
6. Să se sorteze elementele de pe poziții pare în ordine crescătoare și cele de pe poziții impare în ordine descrescătoare.
Exemplu: Pentru n=6 și vectorul v = 8 3 6 5 2 1 → v devine 2 5 6 3 8 1
7. Să se sorteze în ordine crescătoare doar primele k elemente ale vectorului v.
Exemplu: Pentru n=5, k=3 și vectorul v = 7 4 5 1 9 → v devine 4 5 7 1 9
8. Să se sorteze în ordine crescătoare ultimele k elemente ale vectorului v.
Exemplu: Pentru n=5, k=3 și vectorul v = 9 8 7 6 5 → v devine 9 8 5 6 7
9. Să se sorteze vectorul v în ordine crescătoare și să se afișeze primele 3 valori din vectorul sortat.
Exemplu: Pentru n=4 și vectorul v = 9 4 1 6 → se afișează 1 4 6
10. Să se sorteze vectorul v în ordine crescătoare și să se afișeze ultimele 3 valori din vectorul sortat.
Exemplu: Pentru n=4 și vectorul v = 7 2 10 3 → se afișează 3 7 10
11. Să se sorteze vectorul v în ordine crescătoare și să se determine valoarea mediană.
Exemplu: Pentru n=3 și vectorul v = 3 1 4 → mediana este 3
12. Să se sorteze vectorul v în ordine crescătoare și să se afișeze pozițiile elementelor în vectorul inițial.
Exemplu: Pentru n=3 și vectorul v = 50 20 30 → 20 (poz.2), 30 (poz.3), 50 (poz.1)
13. Să se sorteze vectorul v în ordine crescătoare și să se afișeze diferența dintre valoarea maximă și cea minimă.
Exemplu: Pentru n=4 și vectorul v = 4 8 1 6 → diferența este 7
14. Să se sorteze vectorul v în ordine crescătoare și să se verifice dacă vectorul este simetric față de mijloc.
Exemplu: Pentru n=4 și vectorul v = 1 2 2 1 → vectorul este simetric
15. Să se sorteze vectorul v în ordine crescătoare și să se afișeze perechile de elemente consecutive din vectorul sortat.
Exemplu: Pentru n=3 și vectorul v = 7 3 9 → se afișează (3,7), (7,9)
Teorie. Sortarea booleană (numită și sortare prin metoda bulelor sau bubble sort) este un algoritm simplu de sortare. Ideea este următoarea: se parcurge vectorul de mai multe ori și se compară elementele două câte două (cel curent și următorul). Dacă acestea sunt în ordine greșită, se interschimbă. La fiecare trecere prin vector, elementul cel mai mare „urcă” către sfârșitul vectorului, ca o bulă. Algoritmul se repetă până când nu se mai fac interschimbări.
Observație: Spre deosebire de sortarea prin interschimbare, sortarea booleană repetă mai multe „treceri” peste vector,
verificând și interschimbând elementele vecine. Complexitatea este tot O(n^2), dar este mai simplu de înțeles pentru începători.
Enunț: Se citește un număr natural n (0 < n < 300) și un vector v cu n elemente întregi.
Să se sorteze vectorul v în ordine crescătoare prin metoda bulelor (sortare booleană) și să se afișeze vectorul rezultat.
Exemplu: pentru n=5 și v=9 2 7 4 1 se va afișa: 1 2 4 7 9.
#include <iostream>
using namespace std;
int main() {
int n, v[300];
cin >> n;
for (int i = 0; i < n; i++)
cin >> v[i];
bool schimbat = true;
while (schimbat) {
schimbat = false;
for (int i = 0; i < n - 1; i++) {
if (v[i] > v[i + 1]) {
int aux = v[i];
v[i] = v[i + 1];
v[i + 1] = aux;
schimbat = true;
}
}
}
for (int i = 0; i < n; i++)
cout << v[i] << " ";
return 0;
}
1. Să se sorteze vectorul v în ordine crescătoare folosind metoda bulelor.
Exemplu: Pentru n=4 și vectorul v = 5 3 9 1 → v devine 1 3 5 9
2. Să se sorteze vectorul v în ordine descrescătoare folosind metoda bulelor.
Exemplu: Pentru n=4 și vectorul v = 4 8 2 6 → v devine 8 6 4 2
3. Să se sorteze elementele pare din vectorul v în ordine crescătoare și elementele impare în ordine descrescătoare, folosind metoda bulelor separat pentru fiecare categorie.
Exemplu: Pentru n=4 și vectorul v = 8 3 6 5 → v devine 6 5 8 3
4. Să se sorteze în ordine crescătoare doar primele k elemente ale vectorului v, restul elementelor rămânând nemodificate.
Exemplu: Pentru n=5, k=3 și vectorul v = 9 4 7 2 5 → v devine 4 7 9 2 5
5. Să se sorteze în ordine crescătoare ultimele k elemente ale vectorului v.
Exemplu: Pentru n=5, k=2 și vectorul v = 7 2 5 4 1 → v devine 7 2 5 1 4
6. Să se sorteze vectorul v în ordine crescătoare și să se elimine valorile duplicate.
Exemplu: Pentru n=5 și vectorul v = 2 2 5 3 5 → v devine 2 3 5
7. Să se sorteze vectorul v în ordine crescătoare și să se determine valoarea mediană.
Exemplu: Pentru n=3 și vectorul v = 9 1 5 → mediana este 5
8. Să se sorteze vectorul v în ordine crescătoare și să se afișeze valoarea minimă și valoarea maximă.
Exemplu: Pentru n=4 și vectorul v = 10 3 8 6 → minim = 3, maxim = 10
9. Să se sorteze vectorul v în ordine crescătoare și să se determine suma primelor 3 elemente din vectorul sortat.
Exemplu: Pentru n=4 și vectorul v = 6 1 9 2 → suma = 12
10. Să se sorteze vectorul v în ordine crescătoare și să se determine produsul ultimelor 3 elemente din vectorul sortat.
Exemplu: Pentru n=4 și vectorul v = 5 7 2 3 → produs = 105
11. Să se sorteze vectorul v în ordine crescătoare și să se afișeze toate perechile de elemente consecutive.
Exemplu: Pentru n=3 și vectorul v = 4 1 3 → se afișează (1,3), (3,4)
12. Să se sorteze vectorul v în ordine crescătoare și să se afișeze elementele aflate pe poziții pare.
Exemplu: Pentru n=5 și vectorul v = 9 4 2 7 6 → se afișează 2 6
13. Să se sorteze vectorul v în ordine crescătoare și să se verifice dacă elementele formează o progresie aritmetică.
Exemplu: Pentru n=3 și vectorul v = 7 3 5 → da, progresie aritmetică
14. Să se sorteze vectorul v în ordine crescătoare și să se determine câte numere prime conține.
Exemplu: Pentru n=4 și vectorul v = 4 11 7 8 → 2 numere prime
15. Să se sorteze vectorul v în ordine crescătoare și să se verifice dacă vectorul este palindrom.
Exemplu: Pentru n=3 și vectorul v = 3 1 3 → vectorul este palindrom
Teorie. Inserarea într-un vector presupune adăugarea unui element nou într-o anumită poziție. Deoarece vectorii au elementele memorate consecutiv în memorie, pentru a face loc unui element trebuie să deplasăm spre dreapta toate elementele de la poziția de inserare până la sfârșit. Dacă inserarea se face la final, nu este nevoie de deplasări, doar adăugăm noul element după ultimul. Complexitatea inserării depinde de poziția unde se face: la început sau la mijloc este mai costisitoare decât la final.
Enunț: Se citește un număr natural n (0 < n < 300), un vector v cu n elemente întregi,
și două numere x și p. Să se insereze elementul x în vector pe poziția p și să se afișeze noul vector.
Exemplu: pentru n=4, v=1 2 3 4, x=9, p=2, se va afișa: 1 9 2 3 4.
#include <iostream>
using namespace std;
int main() {
int n, v[301], x, p;
cin >> n;
for (int i = 0; i < n; i++)
cin >> v[i];
cin >> x >> p;
for (int i = n; i >= p; i--) {
v[i + 1] = v[i];
}
v[p] = x;
n++;
for (int i = 0; i < n; i++)
cout << v[i] << " ";
return 0;
}
1. Să se insereze numărul x la începutul vectorului v și să se afișeze vectorul rezultat.
Exemplu: Pentru n=3, vectorul v = 2 3 4 și x = 9 → v devine 9 2 3 4
2. Să se insereze numărul x la sfârșitul vectorului v.
Exemplu: Pentru n=2, vectorul v = 5 6 și x = 7 → v devine 5 6 7
3. Să se insereze numărul x pe poziția p în vectorul v.
Exemplu: Pentru n=3, vectorul v = 10 20 30, x = 15 și p = 1 → v devine 10 15 20 30
4. Să se insereze numărul x după fiecare element par din vectorul v.
Exemplu: Pentru n=3, vectorul v = 2 5 4 și x = 9 → v devine 2 9 5 4 9
5. Să se insereze numărul x înaintea fiecărui element impar din vectorul v.
Exemplu: Pentru n=3, vectorul v = 3 6 7 și x = 0 → v devine 0 3 6 0 7
6. Să se insereze valoarea 0 pe poziția din mijlocul vectorului v.
Exemplu: Pentru n=4, vectorul v = 1 2 3 4 → v devine 1 2 0 3 4
7. Să se insereze pe prima poziție valoarea dublă a ultimului element din vectorul v.
Exemplu: Pentru n=2, vectorul v = 4 7 → v devine 14 4 7
8. Să se insereze valoarea maximă a vectorului v după fiecare apariție a valorii minime.
Exemplu: Pentru n=4, vectorul v = 2 1 3 1 → v devine 2 1 3 1 3
9. Să se insereze în vectorul v suma tuturor elementelor pe poziția 2.
Exemplu: Pentru n=3, vectorul v = 1 2 3 → v devine 1 6 2 3
10. Să se insereze numărul x înaintea fiecărui element egal cu 0 din vectorul v.
Exemplu: Pentru n=3, vectorul v = 2 0 5 și x = 7 → v devine 2 7 0 5
11. Să se insereze după ultimul element din vectorul v numărul de elemente pare.
Exemplu: Pentru n=4, vectorul v = 2 3 4 7 → v devine 2 3 4 7 2
12. Să se insereze în mijlocul vectorului v diferența dintre valoarea maximă și valoarea minimă.
Exemplu: Pentru n=3, vectorul v = 5 9 2 → v devine 5 7 9 2
13. Să se insereze pe ultima poziție a vectorului v produsul primelor două elemente.
Exemplu: Pentru n=3, vectorul v = 3 4 7 → v devine 3 4 7 12
14. Să se insereze numărul x în vectorul v astfel încât vectorul să rămână ordonat crescător.
Exemplu: Pentru n=4, vectorul v = 1 3 5 7 și x = 4 → v devine 1 3 4 5 7
15. Să se insereze înaintea fiecărui element din vectorul v numărul de cifre al acelui element.
Exemplu: Pentru n=3, vectorul v = 7 45 123 → v devine 1 7 2 45 3 123
Teorie. Ștergerea unui element dintr-un vector presupune eliminarea lui din secvența de elemente.
Deoarece elementele vectorului sunt memorate consecutiv, după ștergere trebuie să mutăm toate elementele de la dreapta poziției șterse cu o poziție spre stânga, pentru a acoperi golul lăsat.
Dimensiunea vectorului (n) se micșorează cu 1. Complexitatea operației depinde de poziția unde se face ștergerea: la început sau la mijloc este mai costisitoare decât la sfârșit.
Enunț: Se citește un număr natural n (0 < n < 300), un vector v cu n elemente întregi și o poziție p.
Să se șteargă elementul aflat pe poziția p și să se afișeze vectorul obținut.
Exemplu: pentru n=5, v=10 20 30 40 50, p=2 se va afișa: 10 20 40 50.
#include <iostream>
using namespace std;
int main() {
int n, v[301], p;
cin >> n;
for (int i = 0; i < n; i++)
cin >> v[i];
cin >> p;
for (int i = p; i < n - 1; i++) {
v[i] = v[i + 1];
}
n--;
for (int i = 0; i < n; i++)
cout << v[i] << " ";
return 0;
}
1. Să se șteargă primul element din vectorul v și să se afișeze vectorul rezultat.
Exemplu: Pentru n=4, vectorul v = 5 6 7 8 → v devine 6 7 8
2. Să se șteargă ultimul element din vectorul v.
Exemplu: Pentru n=3, vectorul v = 10 20 30 → v devine 10 20
3. Să se șteargă elementul aflat pe poziția p din vectorul v.
Exemplu: Pentru n=4, vectorul v = 1 2 3 4 și p = 1 → v devine 1 3 4
4. Să se șteargă prima apariție a numărului x din vectorul v.
Exemplu: Pentru n=3, vectorul v = 7 8 9 și x = 8 → v devine 7 9
5. Să se șteargă toate aparițiile numărului x din vectorul v.
Exemplu: Pentru n=4, vectorul v = 2 5 2 7 și x = 2 → v devine 5 7
6. Să se șteargă toate elementele pare din vectorul v.
Exemplu: Pentru n=5, vectorul v = 1 2 3 4 5 → v devine 1 3 5
7. Să se șteargă toate elementele impare din vectorul v.
Exemplu: Pentru n=4, vectorul v = 2 4 5 6 → v devine 2 4 6
8. Să se șteargă elementul minim din vectorul v.
Exemplu: Pentru n=3, vectorul v = 5 2 8 → v devine 5 8
9. Să se șteargă elementul maxim din vectorul v.
Exemplu: Pentru n=4, vectorul v = 7 3 9 4 → v devine 7 3 4
10. Să se șteargă toate elementele aflate pe poziții pare din vectorul v.
Exemplu: Pentru n=5, vectorul v = 1 2 3 4 5 → v devine 2 4
11. Să se șteargă toate elementele aflate pe poziții impare din vectorul v.
Exemplu: Pentru n=4, vectorul v = 10 20 30 40 → v devine 10 30
12. Să se șteargă toate numerele negative din vectorul v.
Exemplu: Pentru n=4, vectorul v = -3 5 -2 6 → v devine 5 6
13. Să se șteargă toate numerele pozitive din vectorul v.
Exemplu: Pentru n=4, vectorul v = -1 3 -4 7 → v devine -1 -4
14. Să se șteargă toate elementele care sunt egale cu suma vecinilor lor din vectorul v.
Exemplu: Pentru n=4, vectorul v = 2 5 7 12 → v devine 2 7 12
15. Să se șteargă toate elementele care apar de mai multe ori în vectorul v, păstrând doar prima apariție.
Exemplu: Pentru n=5, vectorul v = 2 3 2 5 3 → v devine 2 3 5
Teorie. Interclasarea reunește doi vectori deja ordonați într-un singur vector ordonat. Folosim doi indici, câte unul pe fiecare vector: comparam elementele curente și copiem în rezultat pe cel mai mic (la ordine crescătoare) sau cel mai mare (la ordine descrescătoare), apoi avansăm în vectorul din care am copiat. Dacă elementele sunt egale: cu dubluri copiem ambele; fără dubluri copiem o singură dată. După ce unul dintre vectori se termină, copiem „coada” celuilalt.
Enunț: Se citesc doi vectori ordonați crescător, v1 cu n elemente și v2 cu m elemente (0<n,m<300).
Să se interclaseze în vectorul w, păstrând dublurile, și să se afișeze w.
Exemplu: pentru n=3, m=3, v1=1 3 5, v2=2 3 6 se va afișa: 1 2 3 3 5 6.
#include <iostream>
using namespace std;
int main() {
int n, m, v1[301], v2[301], w[1000];
cin >> n;
for (int i = 0; i < n; i++) cin >> v1[i];
cin >> m;
for (int i = 0; i < m; i++) cin >> v2[i];
int i = 0, j = 0, k = 0;
while (i < n && j < m) {
if (v1[i] <= v2[j]) {
w[k++] = v1[i];
i++;
} else {
w[k++] = v2[j];
j++;
}
}
while (i < n) { w[k++] = v1[i]; i++; }
while (j < m) { w[k++] = v2[j]; j++; }
for (int p = 0; p < k; p++) cout << w[p] << " ";
return 0;
}
1. Să se interclaseze doi vectori ordonați crescător cu dubluri și să se afișeze vectorul rezultat.
Exemplu: Pentru n=3, m=3, v1 = 1 4 6 și v2 = 2 4 5 → 1 2 4 4 5 6
2. Să se interclaseze doi vectori ordonați crescător fără dubluri.
Exemplu: Pentru n=3, m=3, v1 = 1 3 5 și v2 = 3 4 6 → 1 3 4 5 6
3. Să se interclaseze doi vectori ordonați descrescător într-un vector ordonat descrescător, cu dubluri.
Exemplu: Pentru n=3, m=3, v1 = 9 7 5 și v2 = 8 7 6 → 9 8 7 7 6 5
4. Să se interclaseze doi vectori ordonați crescător fără dubluri și să se afișeze numărul de elemente distincte din rezultat.
Exemplu: Pentru n=4, m=4, v1 = 1 2 2 5 și v2 = 2 3 5 5 → rezultatul este 1 2 3 5, deci 4 elemente distincte
5. Să se interclaseze doi vectori ordonați crescător cu dubluri și să se determine câte valori distincte au frecvența cel puțin 2 în rezultat.
Exemplu: Pentru n=4, m=3, v1 = 1 2 2 4 și v2 = 2 4 4 → valorile {2,4} ⇒ 2 valori
6. Să se interclaseze doi vectori ordonați crescător cu dubluri și să se afișeze rezultatul în ordine descrescătoare.
Exemplu: Pentru n=3, m=3, v1 = 1 3 5 și v2 = 2 4 6 → 6 5 4 3 2 1
7. Să se interclaseze doi vectori ordonați crescător fără dubluri și să se calculeze suma elementelor din rezultat.
Exemplu: Pentru n=4, m=4, v1 = 1 2 2 5 și v2 = 2 3 5 7 → suma este 18
8. Să se afișeze intersecția a doi vectori ordonați crescător, ținând cont de multiplicitate.
Exemplu: Pentru n=5, m=4, v1 = 1 2 2 3 5 și v2 = 2 2 4 5 → 2 2 5
9. Să se afișeze diferența simetrică a doi vectori ordonați crescător.
Exemplu: Pentru n=3, m=3, v1 = 1 2 3 și v2 = 2 3 4 → 1 4
10. Să se determine elementul maxim din vectorul obținut prin interclasarea a doi vectori ordonați crescător cu dubluri.
Exemplu: Pentru n=3, m=2, v1 = 1 5 9 și v2 = 0 10 → 10
11. Să se determine elementul minim din vectorul obținut prin interclasarea a doi vectori ordonați crescător fără dubluri.
Exemplu: Pentru n=2, m=2, v1 = 2 5 și v2 = 3 4 → 2
12. Să se determine numărul total de elemente comune (cu multiplicitate) dintre doi vectori ordonați crescător.
Exemplu: Pentru n=4, m=4, v1 = 1 2 2 3 și v2 = 2 2 2 4 → 2
13. Să se verifice dacă doi vectori ordonați crescător sunt identici.
Exemplu: Pentru n=3, m=3, v1 = 1 2 3 și v2 = 1 2 3 → Vectorii sunt identici
14. Să se verifice dacă vectorul v2 este subsecvență a vectorului v1.
Exemplu: Pentru n=4, m=2, v1 = 1 3 5 7 și v2 = 3 5 → v2 este subsecvență a lui v1
15. Să se interclaseze doi vectori ordonați crescător cu dubluri și să se afișeze elementele aflate pe poziții pare (numerotare de la 1).
Exemplu: Pentru n=3, m=3, v1 = 1 2 4 și v2 = 1 3 5 → 1 3 5
Teorie. Vectorul de frecvență este un tablou în care poziția reprezintă o valoare posibilă, iar elementul de la acea poziție reprezintă de câte ori apare valoarea respectivă în vectorul inițial sau într-un fișier de date. Dacă știm domeniul de valori (ex. cifre, numere de maxim 3 cifre), vectorul de frecvență permite rezolvări rapide și eficiente.
Enunț: În fișierul cifra.txt sunt memorate cel mult un milion de cifre (0–9) separate prin spații.
Să se afișeze toate cifrele ordonate crescător (cu repetări), folosind o metodă eficientă ca timp și memorie (vector de frecvență de dimensiune 10).
Exemplu: dacă fișierul conține 3 1 4 1 2, se afișează: 1 1 2 3 4.
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream fin("cifra.txt");
long long f[10] = {0};
int x;
while (fin >> x)
if (0 <= x && x <= 9) f[x]++;
for (int d = 0; d <= 9; d++)
for (long long k = 0; k < f[d]; k++)
cout << d << " ";
return 0;
}
1. În fișierul cifra.txt sunt memorate cel mult un milion de cifre separate prin spații.
Să se afișeze cifrele ordonate crescător.
Exemplu: Pentru n=5, fișierul conține 3 1 4 1 2 → 1 1 2 3 4
2. În fișierul cifra.txt sunt memorate cel mult un milion de cifre separate prin spații.
Să se afișeze fiecare cifră o singură dată, în ordine crescătoare.
Exemplu: Pentru n=5, fișierul conține 3 1 4 1 2 → 1 2 3 4
3. În fișierul cifre.txt sunt memorate cel mult un milion de cifre separate prin spații.
Să se afișeze cifrele care nu se găsesc în fișier.
Exemplu: Pentru n=3, fișierul conține 0 2 5 → 1 3 4 6 7 8 9
4. În fișierul cifre.txt sunt memorate cel mult un milion de cifre separate prin spații.
Să se afișeze cifrele cu frecvența minimă (care apar cel mai rar).
Exemplu: Pentru n=6, fișierul conține 1 1 2 3 3 3 → 2
5. În fișierul numere.txt sunt memorate cel mult un milion de numere naturale cu cel mult 4 cifre.
Să se afișeze cele mai mari două numere de două cifre care nu se găsesc în fișier.
Exemplu: Pentru n=4, fișierul conține 10 55 99 98 → 97 96
6. În fișierul numere.txt sunt memorate cel mult un milion de numere naturale cu cel mult 4 cifre.
Să se afișeze câte numere au prima și ultima cifră identice.
Exemplu: Pentru n=4, fișierul conține 121 345 77 202 → 2 (numerele 121 și 77)
7. În fișierul numere.txt sunt memorate cel mult un milion de numere naturale cu cel mult 9 cifre.
Să se afișeze cifra sau cifrele care apar de cele mai multe ori.
Exemplu: Pentru n=3, fișierul conține 123 355 59 → 5
8. În fișierul numere.txt sunt memorate maximum 10000 de numere naturale cu cel mult 9 cifre fiecare.
Să se afișeze cel mai mare număr care se poate forma din toate cifrele numerelor din fișier.
Exemplu: Pentru n=3, fișierul conține 267 39628 79 → 9987766322
9. În fișierul numere.txt sunt memorate maximum 10000 de numere naturale cu cel mult 9 cifre fiecare.
Să se afișeze cel mai mic număr care se poate forma din toate cifrele numerelor din fișier.
Exemplu: Pentru n=3, fișierul conține 267 39608 79 → 2036677899
10. În fișierul numere.txt sunt memorate cel mult un milion de numere naturale cu cel mult 3 cifre.
Să se afișeze, în ordine crescătoare, numerele care apar o singură dată.
Exemplu: Pentru n=6, fișierul conține 10 20 10 30 40 30 → 20 40
11. În fișierul medii.txt sunt memorate cel mult un milion de medii (numere reale cu două zecimale între 1 și 10).
Să se afișeze o statistică: câte medii sunt în fiecare interval [1,2], (2,3], ..., (9,10].
Exemplu: Pentru n=4, fișierul conține 1.25 2.50 7.30 9.99 → [1,2]:1, (2,3]:1, (7,8]:1, (9,10]:1
12. În fișierul numere.txt sunt memorate maximum 10000 de numere naturale cu cel mult 9 cifre fiecare.
Să se afișeze câte numere au toate cifrele egale.
Exemplu: Pentru n=6, fișierul conține 234 333 55 56 33 5632 → 3 (numerele 333, 55, 33)
13. Fie un vector v cu n elemente (n ≤ 100), numere naturale cu cel mult 4 cifre fiecare.
Să se afișeze cel mai mare număr format din prima cifră a fiecărui element.
Exemplu: Pentru n=5, v = 78 567 7122 5 123 → 75751
14. În fișierul produse.txt sunt înregistrate vânzările unei firme (max. 2000 de linii).
Fiecare linie conține: tipul produsului (max. 2 cifre), cantitatea (≤100) și prețul/kg (≤100).
Să se afișeze pentru fiecare tip de produs suma totală obținută.
Exemplu: Pentru n=4, fișierul conține:
3 1 5
1 20 5
2 10 3
1 10 5
Se afișează:
1 150
2 30
3 5
Teorie. Mulțimile pot fi reprezentate prin tablouri cu elemente distincte. Operații uzuale: intersecția (elementele comune), diferența (elementele din a care nu sunt în b), reuniunea (toate elementele distincte din ambele).
Enunț: Se citesc două mulțimi ordonate crescător
a și
b.
Să se afișeze intersecția lor.
Exemplu: pentru
a=1 3 5 7 9,
b=3 4 7 10
→ Intersecția este 3 7.
#include <iostream>
using namespace std;
int main() {
int m, n, a[100], b[100];
cin >> m;
for (int i = 0; i < m; i++) cin >> a[i];
cin >> n;
for (int j = 0; j < n; j++) cin >> b[j];
int i = 0, j = 0;
while (i < m && j < n) {
if (a[i] == b[j]) {
cout << a[i] << " ";
i++; j++;
} else if (a[i] < b[j]) {
i++;
} else {
j++;
}
}
return 0;
}
1. Se citesc valori întregi până se memorează m valori distincte în a și n valori distincte în b, reprezentând două mulțimi.
Să se genereze:
a) c – intersecția celor două mulțimi
b) d – diferența dintre mulțimi (a − b)
c) r – reuniunea celor două mulțimi
Exemplu: Pentru m=6, a=1 3 5 7 9 11; n=7, b=0 3 4 7 10 11 12 →
intersecția c=3 7 11, diferența d=1 5 9, reuniunea (ordonată) r=0 1 3 4 5 7 9 10 11 12
2. Din fișierul date.in se citesc n mulțimi astfel: pe prima linie se memorează n (≤100). Pe fiecare dintre următoarele n linii se află o valoare p (≤200) urmată de p numere întregi (≤99999) – elementele mulțimii.
Să se genereze un tablou c care memorează intersecția celor n mulțimi.
Exemplu: Pentru n=3, fișierul conține:
5 1 2 3 4 5
6 0 2 3 5 7 9
4 2 3 5 8
→ intersecția c=2 3 5
Enunț: Se citesc n (n ≤ 100) numere întregi, fiecare cu cel mult patru cifre. Să se verifice dacă toate elementele sunt distincte.
Exemplu:
v = 2 5 7 9 11 → Toate elementele sunt distincte
v = 3 6 3 8 → Nu toate elementele sunt distincte
#include <iostream>
using namespace std;
int main() {
int n, v[101];
cin >> n;
for (int i = 0; i < n; i++) cin >> v[i];
bool distincte = true;
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (v[i] == v[j])
distincte = false;
if (distincte)
cout << "Toate elementele sunt distincte";
else
cout << "Nu toate elementele sunt distincte";
return 0;
}
Enunț: Fișierul intervale.txt conține pe prima linie un număr natural n (n ≤ 1000), iar pe fiecare dintre următoarele n linii câte două numere întregi a și b (1 ≤ a < b ≤ 32000), fiecare pereche reprezentând un interval închis [a,b].
Să se determine intervalele care nu au intersecție cu niciunul dintre celelalte intervale și să se afișeze capetele lor.
Exemplu:
Fișierul intervale.txt:
4
2 6
17 20
10 15
8 16
Rezultat:
2 6
17 20
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream f("intervale.txt");
int n, a[1001], b[1001];
f >> n;
for (int i = 0; i < n; i++)
f >> a[i] >> b[i];
for (int i = 0; i < n; i++) {
bool disjunct = true;
for (int j = 0; j < n; j++)
if (i != j)
if (!(b[i] < a[j] || b[j] < a[i]))
disjunct = false;
if (disjunct)
cout << a[i] << " " << b[i] << "\n";
}
return 0;
}
1. Să se decidă dacă elementele tabloului sunt distincte.
Exemplu: Pentru n=4, v=5 7 9 11 → Toate elementele sunt distincte.
Pentru n=4, v=4 6 6 10 → Elementele nu sunt distincte.
2. Să se determine câte perechi din tablou sunt prime între ele.
Exemplu: Pentru n=3, v=4 5 9 → perechi prime între ele: (4,5), (5,9) ⇒ 2 perechi.
3. Să se determine câte perechi din tablou au valori egale.
Exemplu: Pentru n=4, v=2 2 3 3 → perechi egale: (2,2), (3,3) ⇒ 2 perechi.
4. Să se determine câte perechi din tablou au suma un număr prim cu cifra unităților egală cu 3.
Exemplu 1: Pentru n=4, v=2 5 6 10 → Nicio pereche.
Exemplu 2: Pentru n=3, v=3 10 13 → perechea (10,13)=23, prim și ultima cifră 3 ⇒ 1 pereche.
5. Să se determine câte triplete din tablou au valori egale.
Exemplu: Pentru n=4, v=7 7 7 8 → un singur triplet (7,7,7) ⇒ 1 triplet.
6. Să se determine câte triplete din tablou au proprietatea că una dintre valori este egală cu suma celorlalte două.
Exemplu: Pentru n=4, v=2 3 5 6 → (2,3,5) respectă regula ⇒ 1 triplet.
7. Să se afișeze fiecare valoare din tablou o singură dată și frecvența ei în tablou.
Exemplu: Pentru n=5, v=4 4 7 8 7 → se afișează:
4 apare de 2 ori
7 apare de 2 ori
8 apare de 1 dată
8. Să se afișeze tripletele a căror sumă este egală cu s citit.
Exemplu: Pentru n=5, v=3 5 1 2 4, s=10 → triplete posibile: (3,5,2), (5,1,4) ⇒ 2 triplete.
O secvență de valori alăturate este un șir de elemente consecutive dintr-un tablou. În funcție de cerință, putem căuta secvențe crescătoare, descrescătoare, de numere egale, pare, prime între ele, palindromice sau cu sumă maximă. De obicei se parcurge tabloul cu o variabilă care memorează lungimea curentă și se actualizează lungimea maximă atunci când proprietatea este întreruptă.
Enunț: Se citește un tablou cu n numere întregi. Să se determine câte elemente conține cea mai lungă secvență de valori alăturate ordonate crescător.
Exemplu:
v = 5 7 9 3 4 8 9 10
Cea mai lungă secvență crescătoare este 3 4 8 9 10 → 5 elemente.
#include <iostream>
using namespace std;
int main() {
int n, v[101];
cin >> n;
for (int i = 0; i < n; i++) cin >> v[i];
int lung = 1, maxim = 1;
for (int i = 1; i < n; i++) {
if (v[i] > v[i-1])
lung++;
else
lung = 1;
if (lung > maxim)
maxim = lung;
}
cout << maxim;
return 0;
}
1. Să se determine câte elemente conţine cea mai lungă secvenţă de valori alăturate ordonate crescător din tablou.
Exemplu: Pentru n=7, v=1 2 3 2 4 5 6 → secvența maximă este 2 4 5 6 ⇒ 4 elemente.
2. Să se determine câte elemente conţine cea mai lungă secvenţă de valori egale alăturate din tablou. Dacă sunt mai multe secvenţe de lungime maximă, să se afişeze numărul lor.
Exemplu: Pentru n=8, v=7 7 2 3 3 3 4 4 → cea mai lungă secvență este 3 3 3 ⇒ 3 elemente, număr secvențe maxime = 1.
3. Să se determine câte elemente conţine cea mai lungă secvenţă de valori alăturate din tablou care au exact 2 cifre. Dacă sunt mai multe secvenţe de lungime maximă se va afişa prima.
Exemplu: Pentru n=7, v=5 12 34 56 7 89 90 → secvența maximă este 12 34 56 ⇒ 3 elemente.
4. Să se determine câte elemente conţine cea mai lungă secvenţă de numere pare alăturate din tablou. Dacă sunt mai multe secvenţe de lungime maximă, să se afişeze numărul lor.
Exemplu: Pentru n=7, v=2 4 6 1 8 10 12 → cea mai lungă secvență este 8 10 12 ⇒ 3 elemente.
5. Să se afişeze lungimea maximă a unei secvenţe din tablou cu proprietatea că oricare două elemente aflate pe poziţii consecutive sunt prime între ele.
Exemplu: Pentru n=7, v=16 25 6 12 10 4 5 → secvența maximă este 16 25 6 ⇒ 3 elemente.
6. Să se determine cea mai lungă secvenţă palindromică de elemente alăturate din tablou.
Exemplu: Pentru n=8, v=3 4 7 9 2 9 7 5 → secvența maximă este 7 9 2 9 7 ⇒ 5 elemente.
7. Să se determine secvenţa de elemente alăturate a căror sumă are valoare maximă. Secvenţa se va afişa pe ecran.
Exemplu: Pentru n=7, v=-2 3 5 -1 4 -3 2 → secvența maximă este 3 5 -1 4 ⇒ suma 11.
Schimbarea ordinii elementelor unui tablou se poate face prin mai multe metode:
Enunț: Să se rearanjeze componentele unui tablou de numere întregi astfel încât primul element devine ultimul, iar toate celelalte componente se deplasează cu o poziţie la stânga.
Exemplu:
n = 6, v = (2, 4, 5, 7, 8, 9)
Rezultă: v = (4, 5, 7, 8, 9, 2)
#include <iostream>
using namespace std;
int main() {
int n, v[101];
cin >> n;
for (int i = 0; i < n; i++) cin >> v[i];
int prim = v[0];
for (int i = 0; i < n - 1; i++)
v[i] = v[i+1];
v[n-1] = prim;
for (int i = 0; i < n; i++)
cout << v[i] << " ";
return 0;
}
Enunț: Să se rearanjeze componentele unui tablou de numere întregi astfel încât ultimul element devine primul, iar toate celelalte componente se deplasează cu o poziţie la dreapta.
Exemplu:
n = 6, v = (2, 4, 5, 7, 8, 9)
Rezultă: v = (9, 2, 4, 5, 7, 8)
#include <iostream>
using namespace std;
int main() {
int n, v[101];
cin >> n;
for (int i = 0; i < n; i++) cin >> v[i];
int ultim = v[n-1];
for (int i = n - 1; i > 0; i--)
v[i] = v[i-1];
v[0] = ultim;
for (int i = 0; i < n; i++)
cout << v[i] << " ";
return 0;
}
1. Să se inverseze ordinea componentelor unui tablou unidimensional cu n (n ≤ 100) numere întregi cu cel mult 4 cifre fiecare.
Exemplu: Pentru n=5, v=(1, 3, 5, 7, 9) → v=(9, 7, 5, 3, 1).
2. Permutare circulară la stânga:
a) Să se rearanjeze componentele unui tablou conform permutării circulare la stânga.
b) Să se afişeze componentele tabloului după k permutări circulare la stânga.
Exemplu: Pentru n=6, v=(2, 4, 5, 7, 8, 9), k=3 → v=(7, 8, 9, 2, 4, 5).
3. Permutare circulară la dreapta:
a) Să se rearanjeze componentele unui tablou conform permutării circulare la dreapta.
b) Să se afişeze componentele tabloului după k permutări circulare la dreapta.
Exemplu: Pentru n=6, v=(2, 4, 5, 7, 8, 9), k=2 → v=(8, 9, 2, 4, 5, 7).
4. Să se mute la sfârşitul unui tablou toate elementele nule (nu se vor utiliza secvenţe de ştergere).
Exemplu: Pentru n=7, v=(0, 3, 0, 4, 5, 0, 6) → v=(3, 4, 5, 6, 0, 0, 0).
5. Să se rearanjeze elementele unui tablou astfel încât valorile pare să fie la început, iar cele impare la sfârşit.
Exemplu: Pentru n=6, v=(5, 2, 7, 4, 3, 6) → v=(2, 4, 6, 5, 7, 3).
6. Să se rearanjeze elementele unui tablou astfel încât valorile pare să fie la început crescător, iar cele impare la sfârşit descrescător.
Exemplu: Pentru n=6, v=(5, 2, 7, 4, 3, 6) → v=(2, 4, 6, 7, 5, 3).
7. Să se rearanjeze elementele unui tablou astfel încât numerele prime să fie situate la început crescător, iar cele care nu sunt prime să fie grupate la sfârşit descrescător.
Exemplu: Pentru n=7, v=(4, 7, 6, 5, 9, 2, 8) → v=(2, 5, 7, 9, 8, 6, 4).
8. Să se rearanjeze elementele unui tablou astfel încât valorile reale să fie la început, iar cele întregi la sfârşit.
Exemplu: Pentru n=7, v=(7, 3, 4.21, 4, 10, 56.23, 0.9) → v=(4.21, 56.23, 0.9, 7, 3, 4, 10).
9. Scrieţi un program care citeşte de la tastatură un număr natural nenul n (n ≤ 100), apoi n numere naturale reprezentând elementele unui tablou.
Se vor afişa toate permutările circulare spre stânga ale elementelor tabloului. Fiecare permutare se va afişa pe o linie.
Exemplu: Pentru n=4, v=(10, 20, 30, 49)
Rezultat:
10 20 30 49
20 30 49 10
30 49 10 20
49 10 20 30
În această categorie de probleme, lucrăm cu două sau mai multe tablouri și aplicăm diverse operații matematice:
1. Fie două tablouri unidimensionale x și y care memorează n (n ≤ 100) numere întregi pozitive de cel mult 4 cifre fiecare. Să se calculeze valoarea următoarelor expresii:
2. Să se determine suma și produsul a două polinoame.
Coeficienții celor două polinoame se vor memora în două tablouri unidimensionale.
Exemplu:
Să considerăm n = 3, vectorii:
v1 = [3, 4, 5] → coeficienți pentru P1(x) = 3x² + 4x + 5
v2 = [1, 2, 3] → coeficienți pentru P2(x) = 1x² + 2x + 3
Suma: adunăm coeficienții corespunzători:
(3+1)x² + (4+2)x + (5+3) = 4x² + 6x + 8
Produsul: (3x² + 4x + 5) * (1x² + 2x + 3) = 3x⁴ + 6x³ + 9x² + 4x³ + 8x² + 12x + 5x² + 10x + 15 = 3x⁴ + 10x³ + 22x² + 22x + 15
3. Să se calculeze cel mai mare divizor comun și cel mai mic multiplu comun al componentelor unui tablou unidimensional care memorează n (n ≤ 100) numere naturale nenule.
Exemplu: Pentru n=3, v=(12, 18, 24) → cmmdc = 6, cmmmc = 72.
4. Să se afişeze divizorii comuni ai tuturor componentelor unui tablou unidimensional cu n (n ≤ 100) componente numere întregi nenule cu cel mult patru cifre fiecare.
Exemplu: Pentru n=3, v=(12, 18, 24) → divizori comuni = 1, 2, 3, 6.
5. Fie tabloul unidimensional care memorează n (n ≤ 50) numere întregi.
Să se determine factorul prim care apare la puterea cea mai mare în descompunerea produsului celor n numere.
Exemplu: Pentru n=2, v=(12,18) → produs = 216 = 2³ * 3³ → factorul prim cu puterea maximă = 2 sau 3 (puterea 3).
6. Operații cu fracții:
a) Să se determine suma și produsul a n (n ≤ 100) fracții. Pentru fiecare fracție se citesc valorile numărătorului și numitorului. Rezultatele se vor afişa ca fracții ireductibile.
Exemplu: fracții = 1/2, 2/3 → sumă = 7/6, produs = 1/3.
b) Să se determine cea mai mică fracție din cele n citite.
Exemplu: fracții = 1/2, 2/3, 3/7 → cea mai mică este 3/7.
7. Să se determine dacă radical de ordinul m (m < 10) din (x1 * x2 * ... * xn) este număr natural, unde xi sunt numere naturale de cel mult patru cifre fiecare.
Exemplu: Pentru n=2, v=(4,16), m=2 → produs = 64 → √64 = 8, număr natural.
Se citesc două numere mari, primul cu cel mult n<100 cifre și al doilea cu cel mult m<10000 cifre.
Să se afișeze suma acestor două numere.
Exemplu:
Primul număr: 999
Al doilea număr: 1
Rezultat: 1000
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream f1("nr1.txt"), f2("nr2.txt");
int a[10001], b[10001], s[10002];
int na=0, nb=0, ns=0, carry=0;
while(f1 >> a[++na]);
na--;
while(f2 >> b[++nb]);
nb--;
int i=na, j=nb;
while(i>0 || j>0 || carry) {
int x = (i>0 ? a[i--] : 0);
int y = (j>0 ? b[j--] : 0);
int sum = x + y + carry;
s[++ns] = sum % 10;
carry = sum / 10;
}
for(int k=ns; k>=1; k--) cout << s[k];
return 0;
}
Se citește un număr mare (cu cel mult 1000 cifre) din fișierul nr1.txt și o cifră x de la tastatură.
Să se afișeze produsul dintre acest număr și cifra x.
Exemplu:
Număr mare: 12345
x = 9
Rezultat: 111105
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream f("nr1.txt");
int a[1001], p[1002];
int n=0, np=0, carry=0, x;
cin >> x;
while(f >> a[++n]);
n--;
for(int i=n; i>0; i--) {
int prod = a[i]*x + carry;
p[++np] = prod % 10;
carry = prod / 10;
}
while(carry) {
p[++np] = carry % 10;
carry /= 10;
}
for(int i=np; i>=1; i--) cout << p[i];
return 0;
}
Se citesc două numere mari din fișierele nr1.txt și nr2.txt (fiecare având cel mult 1000 cifre).
Să se afișeze produsul lor.
Exemplu:
Primul număr: 123
Al doilea număr: 45
Rezultat: 5535
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream f1("nr1.txt"), f2("nr2.txt");
int a[1001], b[1001], p[2002]={0};
int na=0, nb=0;
while(f1 >> a[++na]);
na--;
while(f2 >> b[++nb]);
nb--;
for(int i=na; i>0; i--) {
int carry=0;
for(int j=nb; j>0; j--) {
int sum = p[i+j-1] + a[i]*b[j] + carry;
p[i+j-1] = sum % 10;
carry = sum / 10;
}
p[i-1] += carry;
}
int start=0;
while(start < na+nb && p[start]==0) start++;
if(start==na+nb) cout << 0;
else for(int i=start; i<=na+nb; i++) cout << p[i];
return 0;
}
Se citesc două numere mari din fișierele nr1.txt și nr2.txt (fiecare având cel mult 1000 cifre).
Să se determine câtul și restul împărțirii lor.
Exemplu:
Primul număr: 1234
Al doilea număr: 12
Rezultat:
Câtul = 102
Restul = 10
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream f1("nr1.txt"), f2("nr2.txt");
int a[1001], b[1001], q[1001], r[1001];
int na=0, nb=0;
while(f1 >> a[++na]);
na--;
while(f2 >> b[++nb]);
nb--;
int num=0, nq=0;
for(int i=1; i<=na; i++) {
num = num*10 + a[i];
int d=0;
while(num >= b[nb]) {
num -= b[nb];
d++;
}
q[++nq] = d;
}
cout << "Catul = ";
int i=1; while(i<=nq && q[i]==0) i++;
if(i>nq) cout << 0;
else for(; i<=nq; i++) cout << q[i];
cout << "\nRestul = " << num;
return 0;
}
Să se memoreze într-un tablou unidimensional primele n (n ≤ 200) numere prime.
Exemplu:
n = 10
Rezultat: 2 3 5 7 11 13 17 19 23 29
#include <iostream>
using namespace std;
int main() {
int n, a[201], k=0, nr=2;
cin >> n;
while(k < n) {
bool prim = true;
for(int d=2; d*d<=nr; d++)
if(nr % d == 0) prim=false;
if(prim) a[++k]=nr;
nr++;
}
for(int i=1; i<=n; i++) cout << a[i] << " ";
return 0;
}
Să se memoreze într-un tablou unidimensional numerele prime până la n citit (n având cel mult 8 cifre), care, inversate, sunt tot prime.
Exemplu:
n = 100
Rezultat: 2 3 5 7 11 13 17 31 37 71 73 79 97
#include <iostream>
using namespace std;
bool prim(int x) {
if(x<2) return false;
for(int d=2; d*d<=x; d++)
if(x%d==0) return false;
return true;
}
int invers(int x) {
int y=0;
while(x) { y=y*10+x%10; x/=10; }
return y;
}
int main() {
int n, a[10000], k=0;
cin >> n;
for(int i=2; i<=n; i++)
if(prim(i) && prim(invers(i)))
a[++k]=i;
for(int i=1; i<=k; i++) cout << a[i] << " ";
return 0;
}
Să se memoreze într-un tablou unidimensional primele n elemente din șirul lui Fibonacci, unde F[1]=1, F[2]=1, F[n]=F[n-1]+F[n-2].
Exemplu:
n = 8
Rezultat: 1 1 2 3 5 8 13 21
#include <iostream>
using namespace std;
int main() {
int n, f[201];
cin >> n;
f[1]=1; f[2]=1;
for(int i=3; i<=n; i++)
f[i]=f[i-1]+f[i-2];
for(int i=1; i<=n; i++) cout << f[i] << " ";
return 0;
}
Să se genereze toate submulțimile mulțimii {1,2,3,…,n}.
Exemplu:
n = 3
Rezultat:
{}
{1}
{2}
{3}
{1,2}
{1,3}
{2,3}
{1,2,3}
Explicație completă pentru n = 3:
Avem 23 = 8 măști (0..7). Notăm și forma binară pe 3 biți:
mask=0 -> 000 -> {} (0=nu includem nimic)
mask=1 -> 001 -> {1} (1=incluzem elementul 1)
mask=2 -> 010 -> {2} (10 în baza 2: elem.1=0 → nu, elem.2=1 → da)
mask=3 -> 011 -> {1,2} (11 în baza 2: elem.1=1, elem.2=1)
mask=4 -> 100 -> {3} (100 în baza 2: elem.1=0, elem.2=0, elem.3=1)
mask=5 -> 101 -> {1,3} (101 în baza 2: elem.1=1, elem.2=0, elem.3=1)
mask=6 -> 110 -> {2,3} (110 în baza 2: elem.1=0, elem.2=1, elem.3=1)
mask=7 -> 111 -> {1,2,3} (111 în baza 2: elem.1=1, elem.2=1, elem.3=1)
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int total = 1;
for(int i=1; i<=n; i++) total *= 2; // calculam 2^n
for(int mask=0; mask<total; mask++) {
cout << "{";
int x = mask, poz = 1;
while(x > 0) {
if(x % 2 == 1) cout << poz << " ";
x /= 2;
poz++;
}
cout << "}" << "\n";
}
return 0;
}
Să se genereze toate submulțimile mulțimii {a[1], a[2], …, a[n]}.
Exemplu:
n = 3, a = {4,7,9}
Rezultat:
{}
{4}
{7}
{9}
{4,7}
{4,9}
{7,9}
{4,7,9}
Explicație completă pentru n = 3, a = {4,7,9}:
mask=0 -> 000 -> {} (nimic)
mask=1 -> 001 -> {a[1]} = {4} (elem.1=1 → afișăm 4)
mask=2 -> 010 -> {a[2]} = {7} (elem.2=1 → afișăm 7)
mask=3 -> 011 -> {a[1],a[2]}= {4,7} (elem.1=1, elem.2=1)
mask=4 -> 100 -> {a[3]} = {9} (elem.3=1 → afișăm 9)
mask=5 -> 101 -> {a[1],a[3]}= {4,9} (elem.1=1, elem.3=1)
mask=6 -> 110 -> {a[2],a[3]}= {7,9} (elem.2=1, elem.3=1)
mask=7 -> 111 -> {a[1],a[2],a[3]} = {4,7,9} (toți incluși)
#include <iostream>
using namespace std;
int main() {
int n, a[21];
cin >> n;
for(int i=1; i<=n; i++) cin >> a[i];
int total = 1;
for(int i=1; i<=n; i++) total *= 2; // calculam 2^n
for(int mask=0; mask<total; mask++) {
cout << "{";
int x = mask, poz = 1;
while(x > 0) {
if(x % 2 == 1) cout << a[poz] << " ";
x /= 2;
poz++;
}
cout << "}" << "\n";
}
return 0;
}
Se citește un număr natural n impar.
Să se construiască un tablou unidimensional A=(A1, A2,…, An) cu elementele mulțimii {1,2,…,n} astfel încât:
- elementele de pe poziții impare formează șirul crescător 1,2,…,(n+1)/2
- elementele de pe poziții pare formează șirul descrescător n, n-1,…,(n+1)/2+1.
Exemplu:
n = 11
Rezultat: 1 11 2 10 3 9 4 8 5 7 6
#include <iostream>
using namespace std;
int main() {
int n, a[101];
cin >> n;
int st=1, dr=n;
for(int i=1; i<=n; i++) {
if(i%2==1) a[i]=st++;
else a[i]=dr--;
}
for(int i=1; i<=n; i++) cout << a[i] << " ";
return 0;
}