Grade 12 · Baccalaureate exam reviewCitește în română

Subprogram: the number formed from the even digits

Original: Subprogram — numărul format din cifrele pare

O(n)C++1761 lines1 example

The idea

The task (exam part III.1 style): the subprogram pare has a parameter n (0 ≤ n ≤ 10^9) and returns the number formed from the even digits of n, in the order they appear in n, or -1 if n has no even digits. We extract the digits from the units; an even digit must be placed in front of the ones already found, so we multiply it by p (1, 10, 100, ...) and add it. We use do-while so that n = 0 has one digit (0, which is even). Efficiency: one step per digit, with no arrays and no strings. main reads k numbers and prints the result for each, as a test.

Original description (Romanian)

Cerința (tip subiectul III.1): subprogramul pare are un parametru n (0 ≤ n ≤ 10^9) și întoarce numărul format din cifrele pare ale lui n, în ordinea în care apar în n, sau -1 dacă n nu are cifre pare. Extragem cifrele de la unități; o cifră pară trebuie pusă în fața celor găsite deja, deci o înmulțim cu p (1, 10, 100, ...) și o adunăm. Folosim do-while ca n = 0 să aibă o cifră (0, care e pară). Eficiență: un singur pas pe cifră, fără tablouri și fără șiruri de caractere. main citește k numere și afișează rezultatul pentru fiecare, ca test.

Complexity
O(number of digits of n)
Grade
Grade 12 (Clasa a XII-a)

Examples

Example 1

Input

4
2753846 1357 2008 0

Expected output

2846
-1
2008
0

The code

Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.

subprogram-cifre-pare.cpp
/*
 * Titlu: Subprogram — numărul format din cifrele pare
 * Clasa: 12
 * Capitol: Recapitulare pentru bacalaureat
 * Descriere: Cerința (tip subiectul III.1): subprogramul pare are un parametru n
 *            (0 ≤ n ≤ 10^9) și întoarce numărul format din cifrele pare ale lui n,
 *            în ordinea în care apar în n, sau -1 dacă n nu are cifre pare.
 *            Extragem cifrele de la unități; o cifră pară trebuie pusă în fața
 *            celor găsite deja, deci o înmulțim cu p (1, 10, 100, ...) și o
 *            adunăm. Folosim do-while ca n = 0 să aibă o cifră (0, care e pară).
 *            Eficiență: un singur pas pe cifră, fără tablouri și fără șiruri de
 *            caractere. main citește k numere și afișează rezultatul pentru
 *            fiecare, ca test.
 * Complexitate: O(numărul de cifre ale lui n)
 *
 * Exemplu
 * Intrare:
 * 4
 * 2753846 1357 2008 0
 * Ieșire:
 * 2846
 * -1
 * 2008
 * 0
 */
#include <iostream>
using namespace std;

int pare(int n)
{
    int rez = 0, p = 1;
    bool gasit = false;
    do
    {
        int c = n % 10;
        if (c % 2 == 0)
        {
            rez = rez + c * p;
            p = p * 10;
            gasit = true;
        }
        n = n / 10;
    } while (n != 0);
    if (!gasit)
        return -1;
    return rez;
}

int main()
{
    int k;
    cin >> k;
    for (int i = 0; i < k; i++)
    {
        int n;
        cin >> n;
        cout << pare(n) << '\n';
    }
    return 0;
}

Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.