ALGO25 / BLOG

Compararea numerelor scrise ca text în C++

De ce textul 10 poate fi mai mic decât 2? Separă ordinea lexicografică de valoarea numerică și tratează zerourile inițiale înainte de comparare.

Două texte se compară caracter cu caracter. Două numere se compară după valoare. De aceea, șirul 10 apare înaintea șirului 2 în ordinea lexicografică obișnuită, deși numărul 10 este mai mare decât numărul 2.

Prima diferență decide ordinea textelor

Ordinea lexicografică urmărește caracterele de la stânga la dreapta. La prima diferență, caracterul mai mic decide. Pentru cifrele zecimale, caracterul 1 precedă caracterul 2, astfel că textul 10 precedă textul 2 fără să mai conteze caracterul următor.

Dacă un text este prefixul celuilalt și toate caracterele comune coincid, textul mai scurt este primul. Această regulă este potrivită pentru cuvinte și identificatori, dar nu înlocuiește comparația numerică atunci când lungimile numerelor diferă.

Numere naturale prea mari pentru un tip întreg

Pentru reprezentări zecimale nevide care conțin numai cifre, elimină mai întâi zerourile inițiale. Dacă toate cifrele sunt zero, păstrează reprezentarea canonică 0. Abia apoi compară lungimile: numărul cu mai multe cifre este mai mare.

Dacă lungimile sunt egale, comparația lexicografică a cifrelor dă ordinea numerică. De exemplu, 1234 și 1290 au aceeași lungime; prima diferență este între 3 și 9, deci primul număr este mai mic. Nu este necesară conversia într-un tip întreg limitat.

Lexicografic, 10 precedă 2 deoarece caracterul 1 precedă 2. Numeric, 2 este mai mic decât 10. Pentru naturale normalizate, comparăm întâi lungimile.Lexicografic, 10 precedă 2 deoarece caracterul 1 precedă 2. Numeric, 2 este mai mic decât 10. Pentru naturale normalizate, comparăm întâi lungimile.Mărește schema ↗

Zerourile inițiale schimbă lungimea, nu valoarea

Textele 0009 și 9 descriu aceeași valoare naturală. Compararea lungimilor înainte de normalizare ar produce un rezultat greșit. În schimb, dacă textele sunt coduri pentru care zerourile au semnificație, nu le elimina: contractul datelor este diferit.

Metoda descrisă nu se aplică automat numerelor negative, fracțiilor sau notației cu exponent. Pentru numere negative trebuie tratat semnul și inversată ordinea modulelor atunci când ambele valori sunt negative. Stabilește formatul acceptat înainte de algoritm.

Teste pentru comparator

Verifică perechile 2 și 10, 0010 și 10, 0 și 000, apoi două numere foarte lungi cu aceeași lungime și diferență aproape de final. Testează egalitatea, nu doar ordinea strictă. Un comparator de sortare trebuie să răspundă fals când valorile comparate sunt egale.

Recapitulează șirurile de caractere, operațiile pe texte și sortarea.

Întrebări frecvente

De ce textul 10 este înaintea textului 2 la comparare?

Comparația lexicografică începe cu primul caracter. Cifra 1 precedă cifra 2, deci textul 10 este considerat mai mic, deși numeric 10 este mai mare decât 2.

Cum compar numere naturale foarte mari scrise ca text?

Elimină zerourile inițiale păstrând o reprezentare pentru zero, compară lungimile, apoi lexicografic dacă lungimile sunt egale. Metoda evită conversia într-un tip numeric prea mic.

Pot aplica aceeași regulă direct numerelor negative?

Nu. Trebuie tratat mai întâi semnul, iar pentru două valori negative ordinea magnitudinilor se inversează. Stabilește formatul permis înainte de comparare.