Grade 9 · Digits of a numberCitește în română

Removing the even digits

Original: Eliminarea cifrelor pare

O(n)C++1739 lines2 examples

The idea

We build a new number from the odd digits of n, keeping their order. The digits come from right to left, so every kept digit is placed in front of the ones already placed: rez = rez + digit * p, where p is 1, 10, 100, ... (it grows only when we keep a digit).

Original description (Romanian)

Construim un număr nou din cifrele impare ale lui n, păstrând ordinea lor. Cifrele vin de la dreapta la stânga, așa că fiecare cifră păstrată se pune în fața celor deja puse: rez = rez + cifra * p, unde p este 1, 10, 100, ... (crește doar când păstrăm o cifră).

Complexity
O(k), where k is the number of digits of n
Grade
Grade 9 (Clasa a IX-a)

Examples

Example 1

Input

123456

Expected output

135
Example 2

Input

2468

Expected output

0

The code

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

eliminarea-cifrelor-pare.cpp
/*
 * Titlu: Eliminarea cifrelor pare
 * Clasa: 9
 * Capitol: Cifrele unui număr
 * Descriere: Construim un număr nou din cifrele impare ale lui n, păstrând
 *            ordinea lor. Cifrele vin de la dreapta la stânga, așa că fiecare
 *            cifră păstrată se pune în fața celor deja puse: rez = rez + cifra * p,
 *            unde p este 1, 10, 100, ... (crește doar când păstrăm o cifră).
 * Complexitate: O(k), unde k este numărul de cifre ale lui n
 *
 * Exemplu
 * Intrare: 123456
 * Ieșire: 135
 *
 * Exemplu
 * Intrare: 2468
 * Ieșire: 0
 */
#include <iostream>
using namespace std;

int main()
{
    long long n, rez = 0, p = 1;
    cin >> n;
    while (n > 0)
    {
        int cifra = n % 10;
        if (cifra % 2 == 1)
        {
            rez = rez + cifra * p;
            p = p * 10;
        }
        n = n / 10;
    }
    cout << rez << '\n';
    return 0;
}

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