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
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;
}
Răspunsuri la întrebare
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;
}