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

Salut! Am urmatoarea problema care trebuie rezolvata in c++ cu while loop.
Cerinta
Se citeste de la tastatura un numar natural N. Calculati numarul minim care se obtine prin eliminarea unei singure cifre din numarul initial.



Date de intrare
Se citeste de la tastatura numarul natural N.



Date de iesire
Se va afisa numarul minim dupa eliminarea unei cifre.



Restrictii si precizari
0 < N < 1,000,000,000


Exemplu
Date de intrare Date de iesire
5912 512


florinhutzu93: am primit aceasta rezolvare, dar e prea greoaie pt mn. daca poate fi reformulata mai simplu, eventual inlocuind for loop cu while loop.
florinhutzu93: #include

int main( int argc, char** argv )
{

unsigned int number{ 0 };
unsigned int result{ 0 };
unsigned int index{ 0 };

std::cin >> number;

for ( unsigned int _n{ number }, _i{ 1 }; _n != 0; _n /= 10, ++_i )
{

if ( ( _n % 10 ) < ( ( _n / 10 ) % 10 ) )
{
index = _i;
}

}

for ( unsigned int _i{ 1 }; number != 0; number /= 10 )
{

if ( index-- )
{

result += ( number % 10 ) * _i;
_i *= 10;

}

}

std::cout << result << std::endl;

return EXIT_SUCCESS;

}
Mghetes: adaug ezolvarea in cursul zilei de azi. am lipsit de la PC zilele astea.

Răspunsuri la întrebare

Răspuns de Mghetes
1

Răspuns:

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

unsigned long int n, y, min;

int l, c1, c2, k,eliminat = 0;

//cout<<"n=";

cin>>n;

l=0; // lungimea numarului, numarul de cifre

y=n; // copie a lui n, ca sa putem afla lungimea. la final y se distruge si avem nevoie de copie

min = 0; // minimul ce trebuie obtinut la final

// calculam nr de cifre al numarului

while (y != 0) {

   y = y/ 10;

   l++;

}

k=0; // contor de parcurgere a cifrelor din numar, de la stanga la dreapta. plecam de la 0 pentru ca inca nu am intrat in while ca sa procesam vreo cifra

while(n != 0)

{

   k++; //incrementam contorul de parcurgere, marcam cifra pe care o procesam

   

   // prima cifra din numar

   c1 = n/pow(10, l-k);  

   

   // a doua cifra din numar

   c2 = n/pow(10, l-k-1); //aici le iau pe primele 2

   c2 = c2 % 10; // apoi retin doar pe a doua

   //(din cauza tipurilor de date, nu pot scrie intr-0 singura expresie)

   

   //cout<<endl<<k<<" "<<c1<<" " <<c2 << " "<<min ;

   if((k == 1 && c2 == 0) //nu eliminam prima cifra, daca a doua cifra este 0

   || c1 <= c2 // nu eliminam cifra daca urmatoarea din numar este mai mare

   || eliminat == 1 // nu mai eliminam daca am eliminat o cifra deja, dar construim in continuare numarul

   )

   {

      min = min * 10 + c1; // construim noul numar

   }

   else // ajungem pe else cand c1 > c2, asta inseamna ca eliminam cifra c1, adica nu o mai adaugam la min si marcam ca am eliminat o cifra

    // sau a doua cifra din nr este 0

   {

       eliminat = 1;

   }

   

   // dupa ce am procesat cifra de pe pozitia k, o eliminam din numar.

   // p  este variabila de manevra, te poti juca cu tipul variabilelor poate reusesti sa pui direct n = n % pow

   int p = pow(10, l-k);

   n = n % p;

}

if(k<l) // am iesit din while fara sa parcurgem toate cifrele din numar, asta se intampla cand citim un numar cu mai multe zerouri la sfarsit, exemplu 1000 (3200, sau orice alt nr cu mai multi de 0 la sfarsit),  si cand procesam (nu eliminam! vezi prima conditie din while) pe 1 din 1000, ne ramane 000 = 0 si se iese din while

{

   if(eliminat == 1) // daca am eliminat deja o cifra, adaugam toate zerourile din nr initial

    min = min * pow(10, l-k);

   else // daca NU am eliminat o cifra, eliminam un 0, deci adaugam cu unul mai putin

       min = min * pow(10, l-k-1);  

}

cout<<min;

return 0;

}

Alte întrebări interesante