Clasa a X-a · Șiruri de caractereRead in English

Extragerea numerelor dintr-un text în C++

În engleză: Extracting the numbers from a text

O(n)C++1752 de linii2 exemple

Ideea

Parcurgem textul; când întâlnim o cifră, construim numărul ca la clasa a IX-a (nr = nr * 10 + (s[i] - '0')) cât timp urmează cifre. Expresia s[i] - '0' transformă caracterul cifră în valoarea lui ('7' - '0' = 7). Afișăm numerele găsite pe primul rând și suma lor pe al doilea.

Descrierea în engleză

We walk the text; when we meet a digit, we build the number as in grade 9 (nr = nr * 10 + (s[i] - '0')) while digits follow. The expression s[i] - '0' turns the digit character into its value ('7' - '0' = 7). The numbers found are printed on the first line and their sum on the second.

Complexitate
O(L)
Clasa
Clasa a X-a (Grade 10)

Exemple

Exemplul 1

Intrare

Am 3 mere, 12 pere si 105 prune.

Ieșire așteptată

3 12 105
120
Exemplul 2

Intrare

cod2026abc7

Ieșire așteptată

2026 7
2033

Codul C++

Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.

extragerea-numerelor-din-text.cpp
/*
 * Titlu: Extragerea numerelor dintr-un text
 * Clasa: 10
 * Capitol: Șiruri de caractere
 * Descriere: Parcurgem textul; când întâlnim o cifră, construim numărul ca la
 *            clasa a IX-a (nr = nr * 10 + (s[i] - '0')) cât timp urmează cifre.
 *            Expresia s[i] - '0' transformă caracterul cifră în valoarea lui
 *            ('7' - '0' = 7). Afișăm numerele găsite pe primul rând și suma lor pe
 *            al doilea.
 * Complexitate: O(L)
 *
 * Exemplu
 * Intrare: Am 3 mere, 12 pere si 105 prune.
 * Ieșire:
 * 3 12 105
 * 120
 *
 * Exemplu
 * Intrare: cod2026abc7
 * Ieșire:
 * 2026 7
 * 2033
 */
#include <iostream>
using namespace std;

int main()
{
    char s[256];
    cin.getline(s, 256);
    long long suma = 0;
    int i = 0;
    while (s[i] != '\0')
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            long long nr = 0;
            while (s[i] >= '0' && s[i] <= '9')
            {
                nr = nr * 10 + (s[i] - '0');
                i++;
            }
            cout << nr << ' ';
            suma += nr;
        }
        else
            i++;
    }
    cout << '\n' << suma << '\n';
    return 0;
}

Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.