Cifrele unui număr în C++: sumă și invers
Prelucrează cifrele unui număr în C++: numără-le, calculează suma și construiește inversul. Înțelege cazul zero, zerourile finale și limitele.
În acest material
Un număr natural scris în baza 10 poate fi prelucrat cifră cu cifră folosind împărțirea între întregi și restul. Pentru n = 472, expresia n % 10 produce ultima cifră, 2, iar n / 10 produce 47, adică numărul fără ultima cifră.
Recapitulează operatorii aritmetici și buclele. Aici lucrăm numai cu numere naturale; regulile de tratare a semnului pentru intrări negative trebuie stabilite separat.
Numărul și suma cifrelor
Citim n, cu 0 <= n <= 1000000000, și afișăm numărul cifrelor și suma lor.
#include <iostream>
int main() {
long long n = 0;
std::cin >> n;
long long copie = n;
int numarCifre = 0, sumaCifre = 0;
do {
int cifra = static_cast<int>(copie % 10);
sumaCifre += cifra;
++numarCifre;
copie /= 10;
} while (copie > 0);
std::cout << numarCifre << ' ' << sumaCifre << '\n';
return 0;
}
Pentru 472, rezultatul este 3 13. Cifrele sunt prelucrate în ordinea 2, 7, 4. Ordinea nu schimbă suma sau numărul lor. Conversia static_cast<int> este sigură aici: restul pentru un număr natural împărțit la 10 este între 0 și 9.
Variabila copie permite păstrarea lui n pentru alte cerințe. Fiecare împărțire modifică doar copia. După ce ultima cifră a fost eliminată, copia ajunge la zero și bucla se oprește.
De ce folosim do while? Numărul 0 are o cifră, chiar cifra zero. Corpul trebuie executat o dată și pentru el. Programul afișează corect 1 0. O buclă while (copie > 0) ar avea nevoie de un caz separat pentru zero.
Extragerea cifrelor numărului 472, de la dreapta spre stânga.O singură rulare · 17 secunde
Inversarea cifrelor
Construim un număr nou, adăugând la dreapta fiecare cifră extrasă. Dacă rezultatul parțial este r, adăugarea cifrei c se face prin r * 10 + c.
#include <iostream>
int main() {
long long n = 0;
std::cin >> n;
long long copie = n, invers = 0;
do {
invers = invers * 10 + copie % 10;
copie /= 10;
} while (copie > 0);
std::cout << invers << '\n';
return 0;
}
Păstrăm aceleași limite pentru intrare. Pentru 472, rezultatul parțial devine pe rând 2, 27, 274. Pentru 1200, rezultatul numeric este 21, nu un text cu zerouri în față. Un număr întreg nu memorează zerourile inițiale ale reprezentării sale.
Folosește long long pentru rezultatul construit. Chiar dacă numărul de intrare încape într-un tip mai mic, o altă ordine a cifrelor poate produce o valoare mai mare. Pentru limite arbitrar de mari, inversul poate depăși și long long; limitele declarate sunt parte din corectitudinea acestui exemplu.
Alte cerințe folosesc aceeași parcurgere
Pentru numărul cifrelor pare, mărești un contor când cifra % 2 == 0. Zero este cifră pară. Pentru cifra maximă, compari fiecare cifră cu maximul curent, inițializat aici cu zero deoarece toate cifrele sunt între zero și nouă.
Un număr este palindrom dacă valoarea lui este egală cu inversul cifrelor, în convenția uzuală fără zerouri inițiale. Compară inversul cu originalul păstrat, nu cu variabila care a ajuns la zero după extragerea cifrelor.
Greșeli frecvente și cost
Nu uita să împarți copia la 10; altfel extragi mereu aceeași cifră. Nu aduna copia întreagă atunci când cerința se referă la cifră. Stabilește explicit comportamentul pentru zero și pentru zerourile de la sfârșitul numărului.
Dacă numărul are d cifre, fiecare program face d pași. Timpul este O(d), iar memoria suplimentară O(1). Pentru numere pozitive, numărul cifrelor crește logaritmic cu valoarea numărului.
Exersează
- Ce afișează primul program pentru
1002? Dar pentru0? - Care este inversul numeric al lui
900? - Câte cifre pare are
2045? - Este
1221palindrom?
Răspunsuri: 4 3, respectiv 1 0; inversul este 9; sunt trei cifre pare, 2, 0, 4; da, inversul lui 1221 este tot 1221.
Continuă cu divizibilitatea și numerele prime, unde operatorul % verifică dacă împărțirea este exactă.
Întrebări frecvente
Cum extrag ultima cifră a unui număr natural?
Restul împărțirii la zece este ultima cifră. Împărțirea întreagă la zece elimină apoi acea cifră și permite continuarea prelucrării.
De ce numărul zero cere atenție?
O buclă while(n>0) nu pornește pentru zero, deși scrierea sa conține o cifră. Pentru numărarea cifrelor tratezi cazul explicit sau folosești do while.
Cum construiesc inversul cifrelor?
Actualizezi inversul prin invers=invers*10+cifra, în ordinea extragerii. Verifică dacă rezultatul poate depăși tipul numeric folosit.
Ce se întâmplă cu zerourile de la final?
În inversul numeric, ele devin zerouri inițiale și nu se păstrează în reprezentarea obișnuită. Inversul numeric al lui 120 este 21.
De ce păstrez o copie a numărului inițial?
Extragerea repetată modifică numărul până la zero. Dacă trebuie să îl compari ulterior cu inversul sau să îl afișezi, ai nevoie de valoarea originală.
Un pas mai departe
Se încarcă progresul…