Eliminarea unei cifre dintr-un număr în C++
Elimină toate aparițiile unei cifre fără să inversezi rezultatul. Vezi exemplul cu zerouri, reconstrucția numerică și un program C++ verificabil.
În acest material
Eliminarea unei cifre înseamnă păstrarea celorlalte cifre în ordinea inițială. Din 102030, după eliminarea cifrei 0, obținem 123. Dacă extragi cifrele din dreapta și folosești imediat rezultat = rezultat * 10 + cifra, vei obține 321. Soluția trebuie să țină cont de direcția parcurgerii.
Contractul problemei
Citim n, număr natural de cel mult 18 cifre, și cifra c. Eliminăm toate aparițiile lui c și afișăm numărul rămas. Dacă eliminăm toate cifrele, afișăm 0. Zerourile care ajung în față nu apar în rezultatul numeric: din 1002, eliminând 1, rămâne numărul 2.
Din 102030 păstrăm 1, 2 și 3 în ordinea inițială. Contribuțiile sunt 100, 20 și 3.Mărește schema ↗
Reconstrucție prin valoarea poziției
Menținem p = 1, poziția următoarei cifre păstrate în rezultat. Pentru fiecare cifră diferită de c, adăugăm cifra * p, apoi înmulțim p cu 10. Când eliminăm o cifră, nu modificăm p. Astfel, cifrele păstrate ocupă poziții consecutive.
Pentru 102030 și cifra 0, primul zero este ignorat. Cifra 3 adaugă 3, cifra 2 adaugă 20, iar cifra 1 adaugă 100. Rezultatul final este 123. Pentru 1002 și cifra 1, cifra 2 ocupă unitățile, apoi cele două zerouri ocupă pozițiile următoare, fără să schimbe valoarea 2.
Program complet
#include <iostream>
using namespace std;
int main() {
long long n; int c;
cin >> n >> c;
long long rezultat = 0, p = 1;
do {
int cifra = static_cast<int>(n % 10);
if (cifra != c) {
rezultat += cifra * p;
p *= 10;
}
n /= 10;
} while (n != 0);
cout << rezultat << '\n';
}
Limita de 18 cifre este aleasă și pentru variabila p: după păstrarea tuturor cifrelor, ea ajunge cel mult la 10^18, valoare reprezentabilă în long long. Dacă mărești domeniul, verifică toate valorile intermediare, inclusiv o înmulțire al cărei rezultat nu mai este utilizat ulterior.
De ce funcționează
După fiecare pas, rezultatul conține cifrele păstrate din partea deja procesată, iar p este 10 la puterea numărului lor. Cifra următoare se așază în stânga acestora. Cifrele eliminate nu ocupă poziții. La final, fiecare cifră eligibilă apare o singură dată și în ordinea corectă.
Dacă d este numărul de cifre ale lui n, timpul este O(d), iar memoria suplimentară O(1). Două inversări succesive pot fi o alternativă, dar cer atenție la zerourile pierdute; metoda pozițională evită acea problemă.
Exersează
1002 1produce 2, nu 200.4444 4produce 0.0 0produce 0 conform convenției din cerință.12030 2produce 1030: zeroul final se păstrează.
Încearcă să elimini toate cifrele impare. Pentru 123456 rezultatul trebuie să fie 246. Dacă se cere textul exact rămas, inclusiv zerouri inițiale, schimbă reprezentarea și formatul de ieșire, nu doar tipul rezultatului.
Recapitulează prelucrarea cifrelor, alegerea tipului numeric și reprezentarea unui cod numeric ca text.
Întrebări frecvente
Cum elimin o cifră fără să inversez celelalte cifre?
La parcurgerea din dreapta, adaugă fiecare cifră păstrată înmulțită cu puterea lui 10 corespunzătoare. Mărește puterea numai când păstrezi o cifră. Din 102030, eliminarea lui 0 produce 123.
Ce afișez dacă elimin toate cifrele numărului?
În convenția acestei probleme, afișezi 0. De exemplu, eliminarea cifrei 4 din 4444 produce 0. O cerință care solicită un text gol ar avea un alt format de rezultat.
De ce dispar zerourile care ajung la început după eliminare?
Rezultatul este un număr, iar zerourile inițiale nu îi schimbă valoarea. Eliminând cifra 1 din 1002 obții 2. Pentru a păstra exact textul 002 trebuie folosită o reprezentare textuală.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.