Clasa a XII-a · Recapitulare pentru bacalaureatRead in English

Subprogram — numărul format din cifrele pare în C++

În engleză: Subprogram: the number formed from the even digits

O(n)C++1761 de linii1 exemplu

Ideea

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.

Descrierea în engleză

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.

Complexitate
O(numărul de cifre ale lui n)
Clasa
Clasa a XII-a (Grade 12)

Exemple

Exemplul 1

Intrare

4
2753846 1357 2008 0

Ieșire așteptată

2846
-1
2008
0

Codul C++

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

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;
}

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