Informatică, întrebare adresată de bosumesi3, 8 ani în urmă

Var 36. Subprogramul cifra primeşte prin intermediul parametrului a un număr natural cu cel mult 4 cifre şi returnează ultima cifră pară a sa. Dacă numărul nu conţine cifre pare, subprogramul returnează valoarea -1. De exemplu, dacă a=8345, subprogramul va returna 4.
a) Să se scrie definiţia completă a subprogramului cifra.
b) Pe prima linie a fişierului bac.in se află un număr natural nenul n (n≤15000), iar pe a doua linie a fişierului se află un şir de n numere naturale, despărţite prin câte un spaţiu, fiecare număr fiind format din cel mult 4 cifre.
Scrieţi un program C/C++ care citeşte numerele din fişier şi afişează pe ecran, folosind apeluri utile ale subprogramului cifra, cel mai mare număr care se poate forma cu ultimele cifre pare ale fiecărui element, dacă acestea există. Alegeţi o metodă de rezolvare eficientă ca timp de executare. Dacă toate numerele de pe a doua linie a fişierului au numai cifre impare, programul va afişa mesajul NU EXISTA.
Exemplu: dacă fişierul bac.in are conţinutul alăturat, pe ecran se va afişa: 64220
7

Răspunsuri la întrebare

Răspuns de Apollyon
2

Răspuns:

#include <algorithm>

#include <fstream>

#include <iostream>

using std::cout, std::cin, std::endl, std::ifstream, std::sort;

/* Returnează numărul de cifre al unui număr */

static int lungimeNumar(int numar) {

 int contorCifre{};

 while (numar) {

   ++contorCifre;

   numar /= 10;

 }

 return contorCifre;

}

/* returnează ultima cifră pară a nr. sau -1 dacă nu are cifre pare */

static int cifra(int numar) {

 int ultimaCifra{-1};

 while (numar) {

   ultimaCifra = numar % 10;

   if (ultimaCifra % 2 == 0) return ultimaCifra;

   numar /= 10;

 }

 return ultimaCifra;

}

static void celMaiMareNumar(int *vectorNumere, const size_t &lungimeVector) {

 // dacă am găsit cel puțin o cifră pară setăm la true

 bool gasitCifraPara{false};

 int ultimaCifraPara;

// parcurgem vectorul (în care avem salvat numerele din fișier)

 for (size_t i = 0; i < lungimeVector; ++i) {

   ultimaCifraPara = cifra(vectorNumere[i]);  // salvăm ultima cifră pară a nr.

   // dacă cifra găsită e pară și găsitCifrăPară e diferit de true setăm

   // gasitCifraPară la true

   if (ultimaCifraPara != -1 && gasitCifraPara != true) gasitCifraPara = true;

   vectorNumere[i] = ultimaCifraPara;  // și în locul numărului salvăm cifra

 }

 // sortăm vectorul descrescător ( ceea ce ne și creează cel mai mare număr format din cifrele pare )

 sort(vectorNumere, vectorNumere + lungimeVector,

      [](int &primulNumar, int &alDoileaNumar) {

        return primulNumar > alDoileaNumar;

      });

 // dacă s-a găsit cel puțin o cifră pară ( că altfel în vector am avea doar -1 )

 if (gasitCifraPara == true)

   // printăm toate cifrele pare (cele impare vor fi -1 pe care nu le afișăm)

   for (size_t i = 0; i < lungimeVector; i++) {

     if (vectorNumere[i] != -1) cout << vectorNumere[i];

   }

 // dacă nu există cifre pare în vector afișăm NU EXISTĂ

 else

   cout << "NU EXISTA" << endl;

}

int main() {

 size_t n;                // n va conține câte numere citim din fișier

 ifstream fin("bac.in");  // deschidem fișierul

 // dacă fișierul nu s-a deschis cu succes închidem programul

 if (!fin.good()) exit(EXIT_FAILURE);

 fin >> n;                           // citim n

 if (n > 15000) exit(EXIT_FAILURE);  // dacă nr. de pe prima linie > 15000

 int *vectorCifre = new int[n]; // creăm un vector de n numere

 // citim n numere de pe a doua linie

 for (size_t i = 0; i < n; i++) {

   fin >> vectorCifre[i];

   if (lungimeNumar(vectorCifre[i]) > 4)

     exit(EXIT_FAILURE);  // dacă numărul are mai mult de 4 cifre ieșim din program

 }

 fin.close();  // închidem fișierul

 /*

funcția returnează cel mai mare număr format din ultimele cifre pare ale numerelor citite de pe a doua linie

*/

 celMaiMareNumar(vectorCifre, n);

 delete[] vectorCifre; // ștergem vectorul alocat

 return 0;

}

Așa aș face-o eu, nu o fi cea mai rapidă rezolvare dar 100% funcționează cum trebuie )).

Alte întrebări interesante