Salut! Am urmatoarea problema care trebuie rezolvata in c++ cu while loop.
Mai jos am pus o rezolvare, dar primesc 2/4 teste corecte.
Atentie! Trebuie sa elimin 1 singura cifra din numar, chiar daca aceeasi cifra apare de 2 sau mai multe ori.
Daca luam nr 4832851, trebuie sa elimin prima cifra 8 de la stanga la dreapta, rezultand astfel numarul final 432851. Cum as putea sa o elimin doar pe aceea, si nu pe ambele sau nu pe cealalta cifra 8?
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
Rezolvare
#include
using namespace std;
int main()
{
unsigned long int N, copieN, noulN;
int cifMax = 0, prod = 1;
int counter = 1;
cin >> N;
copieN = N;
noulN = 0;
while (N != 0) {
if (N % 10 > cifMax) {
cifMax = N % 10;
}
N = N / 10;
}
while (copieN != 0) {
if (copieN % 10 != cifMax || counter == 0) {
noulN = (copieN % 10) * prod + noulN;
prod = prod * 10;
}
else if (copieN % 10 == cifMax && counter == 1) {
counter = 0;
}
copieN = copieN / 10;
}
cout << noulN;
return 0;
}
Răspunsuri la întrebare
Răspuns:
cand calculam maximul, retinem si ultima pozitie in care se afla .
la construirea noului numar, sarim peste pozitia maximului. pozitia maximului se numara de la dreapta la stanga, tinand cont ca eliminam tot ultima cifra din numar.
numar 4 8 3 2 8 5 1
pozitie 7 6 5 4 3 2 1
cifra maxima este 8, iar ultima pozitie in care acesta se afla, este pozitia 6
#include <iostream>
using namespace std;
int main()
{
unsigned long int N, copieN, noulN, poz, pozMax;
int cifMax = 0, prod = 1;
cout<<"N="; cin >> N;
copieN = N;
noulN = 0;
poz = 0;
while (N != 0) {
poz++;
if (N % 10 >= cifMax) {
cifMax = N % 10;
pozMax = poz;
}
N = N / 10;
}
cout<<endl<<cifMax<<" se afla pe poz "<<pozMax<<endl;
poz = 0;
while (copieN != 0) {
poz++;
if (copieN % 10 != cifMax || poz != pozMax) { //daca ultima cifra din numar este diferita de max sau daca e maxim, nu e ultima pozitie in care acesta se alfa
noulN = (copieN % 10) * prod + noulN;
prod = prod * 10;
}
copieN = copieN / 10;
}
cout << noulN;
return 0;
}