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

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 de Mghetes
1

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;

}


Mghetes: if(k < l ) e conditia, vad ca nu se vede tot, se mai elimina din raspuns uneori
florinhutzu93: merci, dar m-am ametit de tot :)) s-a complicat treaba si nu mai inteleg :-s
Mghetes: logica sta cam asa: luam cifra cu cifra, de la stanga la dreapta, suntem pe pozitia k (cu k parcurgem cifrele din numar, de la 0 la lungimea numarului) si verificam daca putem sa eliminam cifra de pe pozitia k. cand putem elimina? cand cifra ce urmeaza, adica de pe pozitia k+1, este mai mica decat cifra de pe k.
Mghetes: restul sunt ajustari pentru cazurile 905, 1000
florinhutzu93: mai creez o postare pe brainly ca sa-mi copiezi acolo solutia? daca nu se mai poate edita asta... Eu am inteles logica pt care iti multumesc,dar stau mai prost cu codul. nu stiu cum sa ajung pe poz k, adica pe pozitia 0 cum ar veni, stiu ca era ceva cu vectori, da n-am ajuns inca acolo :)
Mghetes: Da, poti face o postare doar cu cerinta, fara partea aia cu max
Mghetes: 3654, nr dat are lungimea l=4. Pentru a lua cifra de pe pozitia k=1, adica pe 3, impartim numarul la 1000, adica la 10^3, 3 fiind = 4-1, adica l-k. Pentru a obtine pe 6, adica cifra de pe pozita k+1, impartim numarul la 100, adica la 10^2, fiind = 10^l-k-1, obtinem 36, apoi luam ultima cifra cu %10.
Mghetes: 3<6, deci nu il pot elimina pe 3, astfel il vom folosi in construirea noului numar minim
Mghetes: Dupa ce am terminat de procesat cifra de pe pozitia k=1, o eliminam, noul nostru nr devenind 654, adica restul impartirii lui 3654 la 1000, adica 3654%1000, 1000 fiind 10^3=10^4-1=10^l-k
florinhutzu93: https://brainly.ro/tema/8532818
Alte întrebări interesante