Algoritmi elementari

Sume, produse și numărări în C++

Calculează sume și produse și numără valorile care respectă o condiție. Învață să inițializezi acumulatoarele și verifică exemple C++ pas cu pas.

Multe probleme cer să prelucrezi o listă de valori: să calculezi totalul, să numeri valorile care respectă o condiție sau să obții un produs. Nu trebuie să păstrezi toate numerele dacă rezultatul se poate actualiza imediat după fiecare citire.

Înainte de lecție, recapitulează structurile repetitive și condițiile. Vei învăța să alegi valoarea inițială și să explici ce reprezintă fiecare variabilă după un pas al buclei.

Suma și numărul valorilor pozitive

Citim n, apoi n numere întregi. Calculăm suma tuturor numerelor și câte dintre ele sunt strict pozitive. Presupunem 0 <= n <= 100000 și valori între -1000000 și 1000000.

#include <iostream>

int main() {
    int n = 0;
    std::cin >> n;
    long long suma = 0;
    int pozitive = 0;
    for (int i = 0; i < n; ++i) {
        long long x = 0;
        std::cin >> x;
        suma += x;
        if (x > 0) {
            ++pozitive;
        }
    }
    std::cout << suma << ' ' << pozitive << '\n';
    return 0;
}

Pentru intrarea:

5
4 -2 0 7 -1

se afișează 8 2. Suma include toate valorile. Contorul pozitive crește doar pentru 4 și 7; zero nu este strict pozitiv.

La început, suma este zero deoarece nu am citit nimic. După primul număr, starea este suma = 4, pozitive = 1. După al doilea avem 2 și 1, după zero rămân 2 și 1, iar după 7 avem 9 și 2. Ultima valoare schimbă doar suma, care devine 8.

Pentru 4, -2, 0, 7, -1 sumele sunt 4, 2, 2, 9, 8, iar numărul valorilor pozitive este 1, 1, 1, 2, 2.Suma se actualizează pentru fiecare valoare; contorul doar pentru cele pozitive.

Ce păstrezi după fiecare pas

După k citiri, suma este suma primelor k valori, iar pozitive este numărul celor strict pozitive dintre ele. Această afirmație explică de ce algoritmul funcționează: este adevărată înainte de prima citire, este păstrată la fiecare pas și, după n citiri, descrie exact rezultatul cerut.

Suma poate ajunge în modul la 100000 * 1000000, deci folosim long long. Contorul nu poate depăși n. Alegerea tipului pornește de la limitele rezultatului, nu doar de la mărimea unui singur număr.

Pentru suma numerelor pozitive, mută adunarea în interiorul condiției. Nu schimba însă problema fără să observi: suma tuturor valorilor și suma doar a celor pozitive sunt rezultate diferite.

Produsul începe de la unu

Citim cel mult 10 valori, fiecare între 1 și 9, și calculăm produsul lor. În aceste limite, rezultatul încape în long long.

#include <iostream>

int main() {
    int n = 0;
    std::cin >> n;
    long long produs = 1;
    for (int i = 0; i < n; ++i) {
        int x = 0;
        std::cin >> x;
        produs *= x;
    }
    std::cout << produs << '\n';
    return 0;
}

Pentru 3 urmat de 2 3 4, rezultatul este 24. Inițializarea cu 1 permite primului factor să fie păstrat. Dacă ai porni de la 0, fiecare înmulțire ar păstra rezultatul zero.

În acest exemplu acceptăm și n = 0, cu rezultatul 1, numit produsul vid. O problemă poate impune altă convenție sau poate cere n >= 1; urmează întotdeauna enunțul. Dacă intrarea permite zero printre factori, produsul întregii liste devine zero după primul factor nul, dar trebuie să citești în continuare datele cerute.

Greșeli frecvente și cost

Inițializează acumulatoarele înainte de buclă. Dacă declari suma sau produsul în corp și le resetezi la fiecare pas, pierzi rezultatele precedente. Nu confunda contorul valorilor citite cu numărul valorilor care trec testul.

Ambele programe parcurg lista o singură dată: timpul este O(n), iar memoria suplimentară O(1). Nu ai nevoie de vector pentru aceste cerințe.

Exersează

  1. Pentru 3 valori, -4 0 4, ce afișează primul program?
  2. Numără valorile pare în locul celor pozitive.
  3. Calculează suma valorilor strict negative.
  4. Ce afișează cele două programe pentru n = 0?

Răspunsuri: 0 1; folosești condiția x % 2 == 0; aduni numai când x < 0; primul afișează 0 0, iar al doilea 1, conform convenției explicate.

Continuă cu maxime și minime, unde valoarea inițială trebuie aleasă diferit.

Întrebări frecvente

Cu ce valoare inițializez suma și produsul?

Suma pornește de la zero, element neutru pentru adunare. Produsul pornește de la unu. Alegerea greșită schimbă toate rezultatele ulterioare.

Care este diferența dintre sumă și numărare?

Suma adună valorile selectate, iar numărarea adaugă câte unu pentru fiecare valoare eligibilă. Ambele pot folosi aceeași condiție, dar răspund la întrebări diferite.

Ce fac dacă nu există valori eligibile?

Suma și contorul rămân zero. Pentru produs trebuie precizată convenția produsului vid sau tratat separat cazul cerut de enunț.

De ce poate depăși produsul tipul numeric?

Produsul crește mult mai repede decât valorile individuale. Verifică limita rezultatului și operațiile intermediare înainte să alegi int sau long long.

Trebuie să memorez toate numerele?

Nu dacă fiecare valoare este folosită doar pentru actualizarea acumulatorilor. Poți prelucra datele imediat după citire și folosi memorie suplimentară constantă.

Un pas mai departe

Se încarcă progresul…

Exersează cu o problemă →