De ce contează?
La un joc de zaruri aduni scorurile de pe fiecare față: 3, 1, 4 → total 8. Exact același pattern se aplică cifrelor unui număr: parcurgi fiecare cifră și o adaugi la un acumulator. Suma cifrelor este unul dintre cele mai frecvente exerciții de concurs și se rezolvă în cinci rânduri de cod.
Ideea de acumulator
Un acumulator este o variabilă care colectează un rezultat parțial. La fiecare pas adaugi sau înmulțești cifra curentă cu acumulatorul existent.
| Operație | Inițializare | Actualizare |
|---|---|---|
| Sumă | suma = 0 | suma += cifra |
| Produs | produs = 1 | produs *= cifra |
Inițializarea contează! Pentru sumă folosești 0 (elementul neutru al adunării), pentru produs folosești 1 (elementul neutru al înmulțirii). Confuzia dintre 0 și 1 este una dintre cele mai frecvente greșeli la concurs — și una dintre cele mai ușor de evitat dacă înțelegi de ce.
Algoritmul
Aceeași structură ca la extragerea cifrelor, cu un acumulator în plus. Urmărește pentru n = 3042:
n = 3042, suma = 0, produs = 1
cifra = 2: suma = 2, produs = 2
cifra = 4: suma = 6, produs = 8
cifra = 0: suma = 6, produs = 0
cifra = 3: suma = 9, produs = 0Observă cum cifra 0 nu schimbă suma, dar anulează produsul imediat.
Implementare C++
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
if (n == 0) {
cout << "Suma: 0, Produs: 0" << endl;
return 0;
}
int suma = 0, produs = 1;
int temp = n;
while (temp > 0) {
int cifra = temp % 10;
suma += cifra; // aduna cifra la acumulator
produs *= cifra; // inmulteste cifra la produs
temp /= 10;
}
cout << "Suma: " << suma << ", Produs: " << produs << endl;
return 0;
}Exemplu: Input 3042 → Suma: 9, Produs: 0
Complexitate
| Caz | Timp | Spațiu |
|---|---|---|
| Număr cu d cifre | O(log n) | O(1) |
Greșeala 1: Inițializezi produs = 0 în loc de produs = 1. Rezultatul va fi mereu 0, indiferent de cifre.
Greșeala 2: Modifici n direct în buclă și ai nevoie de valoarea originală după. Salvează-o în temp înainte de buclă.
Greșeala 3: Nu tratezi n = 0 separat. Bucla while nu rulează, deci produsul rămâne 1 — incorect matematic. Tratează explicit cazul n == 0.
Greșeala 4: Overflow la produs pentru numere cu cifre mari. 9^9 = 387.420.489 intră în int, dar 9^10 depășește. Folosește long long dacă n poate fi mare.