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

5 Se citeşte un număr natural cu toate cifrele nenule, n, şi se cere să se scrie numărul obţinut prin eliminarea tuturor cifrelor impare din n, respectiv -1 dacă nu există astfel de cifre sau dacă toate cifrele lui n sunt impare.
Exemplu: dacă n= 23541 se scrie 24, iar dacă n=28 se scrie -1.
Daca poate cineva sa imi zica ce e gresit in rezolvarea problemei (poza) sau daca e gresita complet sa ma ajute sa o rezolv.
Multumesccc!​

Anexe:

Sergetec: Prima problema pe care o observ e ca tu ai pus n = n / 10 in if ul care verifica daca ultima cifra e para
Sergetec: Astfel, cand intalneste un nr impar se blocheaza si nu mai face nimic
melif2006: si ce ar trebui sa modific si cum?
melif2006: mai degraba cu ce ar trebui sa modific?

Răspunsuri la întrebare

Răspuns de Sergetec
2

Salut!

Greselile din rezolvarea ta:

  • nu ai inclus si o verificare daca numarul contine doar cifre pare (nu contine cifre impare)
  • instructiunea n=n/10 ai pus-o in interiorul if-ului care iti verifica daca ultima cifra a numarului n este para, si atunci cand se va ajunge la un nr impar programul nu va face nimic si se va opri
  • la sfarsitul programului tu verifici daca r % 2 != 0 ceea ce se traduce ca si "daca ultima cifra a numarului format doar cu cifre pare este impara" ceea ce va fi o afirmatie falsa intotdeauna, asadar programul tau nu va afisa niciodata "-1"

Cum ai putea sa iti rezolvi greselile si cateva sfaturi:

  • in primul rand, sa adaugi o variabila "semafor" (de tip bool, care tine minte true sau false) care la inceputul programului va fi false, iar daca exista cel putin o cifra impara aceasta devine true
  • evident, sa iti pui comanda n=n/10 in afara if-ului care verifica paritatea ultimei cifre
  • la sfarsitul programului, sa verifici daca numarul nou format este 0 sau daca variabila "semafor" este false, daca se intampla oricare dintre aceste cazuri atunci se va afisa "-1", altfel se afiseaza numarul respectiv pt ca este bun

Rezolvarea cerintei:

#include <iostream>

using namespace std;

int main() {

   int n, p = 1, nrNou = 0;

   bool existaImp = false; //variabila "semafor"

   cin >> n;

   while (n) {

       if (n % 2 != 0) { //daca exista cel putin o cifra impara

           existaImp = true;

       }

       if (n % 10 % 2 == 0) { //daca ultima cifra e para

           nrNou += n % 10 * p; //o adaug in numarul nou

           p *= 10; //si cresc  puterea

       }

       n /= 10; //de fiecare data elimin ultima cifra a lui n

   }

   if (nrNou == 0 || !existaImp) { //daca numarul nou este 0 (nu exista nr pare) sau nu exista nr impare

       cout << "-1";

   }

   else {

       cout << nrNou;

   }

   return 0;

}


melif2006: Multumesc mult!!!!!
Sergetec: Cu placere! Sper ca totul e clar acum
melif2006: cum as putea face fara sa folosesc true si fals? N-am facut la liceu inca
Sergetec: 1 si 0
1 = true, 0 = false
melif2006: multumesc!
Alte întrebări interesante