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
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)
- Chapter
- Baccalaureate exam review
Examples
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.
/*
* 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.