Pentru a determina maximul a două valori trebuie să facem o comparație. Pentru a determina maximului a trei, patru sau mai multe valori va trebui să realizăm mai multe comparații. Scopul acestui articol este să clarifice modul de determinare a maximului/minimului unui număr fix de valori cu cât mai puține comparații.
Să presupunem că dorim să determinăm maximul valorilor a trei variabile: n
, m
și p
. Evident, o singură comparație nu este suficientă! Putem scrie mai multe variante de program C++ care să determine maximul lor. Iată una dintre ele:
#include <iostream> using namespace std; int main(){ int n , m, p; cin >> n >> m >> p; if(m > n) if(m > p) cout << m; else cout << p; else if(n > p) cout << n; else cout << p; return 0; }
Programul de mai sus rezolvă problema dată, dar face 3 comparații. Nu pare mult, dar pentru a determina cu aceeași idee maximul a patru valori vom avea nevoie de 7 comparații, iar pentru 5 valori vom face 15 comparații, ceea ce devine complicat, iar riscul de a greși editarea programului este foarte mare!
Secretul stă în faptul că nu trebuie să știm care dintre cele trei variabile (m
, n
sau p
) este maximul, ci doar valoarea maximului. Putem folosi următoarea variantă:
#include <iostream> using namespace std; int main(){ int m , n , p; cin >> m >> n >> p; int max; max = m; if(n > max) max = n; if(p > max) max = p; cout << max; return 0; }
În programul de mai sus s-au făcut numai două comparații. Dezavantajul, nesemnificativ de altfel, este că nu mai știm care dintre cele trei variabile are valoarea mai mare.
Calculul maximului/minimului a 4 variabile devine banal. Pur și simplu mai facem o comparație, cu a patra valoare.
Programul următor determină minimul a patru numere naturale. Mai mult, evită folosirea a patru variabile. Procedăm astfel:
- citim prima valoarea pentru
x
- inițializăm
max
cu valoarea luix
- de trei ori:
- citim valoarea lui
x
- comparăm pe
x
cumax
, și, dacă este cazul, actualizăm valoarea luimax
.
- citim valoarea lui
#include <iostream> using namespace std; int main(){ int max; int x; cin >> x; max = x; cin >> x; if(x > max) max = x; cin >> x; if(x > max) max = x; cin >> x; if(x > max) max = x; cout << max; return 0; }
Programul de mai sus este echivalent cu următorul, mai scurt:
#include <iostream> using namespace std; int main(){ int max; int x; cin >> x; max = x; for(int i =1 ; i <= 3 ; i ++) { cin >> x; if(x > max) max = x; } cout << max; return 0; }
Probleme ataşate
Nr. | Problema | Clasa | Dificultate | Operații I/O |
---|---|---|---|---|
1 | #0106 - minim3 | 9 | ușoară | consola |
2 | #0009 - maxmin | 9 | ușoară | consola |
3 | #0559 - 5numere | 9 | medie | consola |