Eliminarea unei cifre dintr-un numar.
#1
Posted 06 April 2022 - 22:02
Date de intrare:
Se citesc de pe aceași linie numărul n și cifra c, reprezentând numărul format cu cifrele mingilor, respectiv cifra ce apare pe mingile ce trebuie eliminate. Date de iesire: Se afișează numărul obținut în urma efectuării eliminărilor. Restrictii : n are cel puțin 1 cifră și maxim 8. Dacă în urma eliminării tuturor aparițiilor cifrei c nu mai rămâne nicio cifră, se va afișa -1, iar dacă vor rămâne numai cifre nule se va afișa 0. Dacă, în urma eliminărilor, noul număr începe cu unul sau mai mulți de 0 și există alte cifre nenule în noul număr, se vor elimina și acei 0 de la început. Ca explicatie generala, eu m-am gandit sa rezolv problema in felul urmator: Numarul natural cititit de la tastatura care reprezinta cifrele mingilor , l-am luat cifra cu cifra si l-am comparat cu cifra ce ulterior trebuie eliminata. In cazul in care cifra numarului va fii egala cu cifra ce trebuie eliminata se va ingloba intr-o variabila, iar in cazul in care cifra numarului nu este egala cu cifra ce trebuie eliminata se va ingloba in alta variabila. Deci vom avea o variabila care este lipsita de cifra ce trebuie eliminata si o variabila care va avea doar cifra ce trebuie eliminata , in functie de cate ori apare in numar. Am realizat asta cu ajutorul unui "while" si a doua conditii! La final conditia de afisare a fost ca atunci cand impartirea numarul citit de la tastatura, ( a carui valoare am salvato intr-o alta variabila) cu variabila care contine doar cifra ce trebuie eliminata se va afisa "-1" , daca nu, se va afisa variabila ce este lipsita de cifra ce trebuie eliminata. Programul arata cam asa: #include <iostream> using namespace std; int main() { int n , c , z = 0 , x = 0 , inv = 1; cin >> n >> c; int n1 = n; while (n > 0){ inv = inv * 10 + n % 10; n = n / 10; } while ( inv > 1){ if ( inv % 10 != c){ z = z * 10 + inv % 10; inv = inv / 10; } else if ( inv % 10 == c) { x = x * 10 + inv % 10 ; inv = inv / 10; } } if ( z > 0){ cout << z; } else if ( n1 == 0 && c != 0) { cout << 0; } else if ( n1 == 0 && c == 0 || n1 / x == 1) { cout << -1; } else if (x == 0){ cout << n1; } return 0; }Eu am impresia ca am acoperit toate testele dar nu e asa iar problema nu este decat de 80 de pcte. Nustiu unde gresesc fiindca am impresia ca-mi ies toate testele .
Spoiler
Edited by MarianG, 08 April 2022 - 00:09. |
#2
Posted 07 April 2022 - 09:00
Nu stiu daca autorii au avut in vedere acest caz, dar programelul da rezultat eronat pentru 00999 9.
Altfel, codul tau mi se pare inutil de complicat si contine erori dar nu vad ceva evident care sa duca la rezultate gresite, mai putin daca ‘numarul’ are voie sa inceapa cu zerouri nesemnificative. (Din intamplare/ noroc chior, erorile din cod nu au efecte vizibile…) |
#3
Posted 07 April 2022 - 09:37
Quote Date de intrare: Se citesc de pe aceași linie numărul n și cifra c, reprezentând numărul format cu cifrele mingilor, respectiv cifra ce apare pe mingile ce trebuie eliminate. Date de iesire: Se afișează numărul obținut în urma efectuării eliminărilor. "100300400 0 - 134" zici tu ca este bun, dar eu spun ca este gresit Ce se intampla cand "c" nu este doar o cifra ? Irbaa, on 06 aprilie 2022 - 22:02, said:
Eu am impresia ca am acoperit toate testele dar nu e asa iar problema nu este decat de 80 de pcte. Nustiu unde gresesc fiindca am impresia ca-mi ies toate testele . sags, on 07 aprilie 2022 - 09:00, said:
Nu stiu daca autorii au avut in vedere acest caz, dar programelul da rezultat eronat pentru 00999 9. Problema este una de siruri si caractere, nu de numere si cifre. test (numar, cifra) == expected_outut |
#4
Posted 07 April 2022 - 10:10
Ce nu e ok la 1
Insa da, si eu as zice ca problema ar fi de siruri de caractere - sir de cifre in acest caz -, nu prea ar trebui sa fie de numere desi in enunt se vorbeste de ‘numar’ de intrare iar la iesire destul de clar e numar din modul cum trateaza zerourile de la inceput. Edited by sags, 07 April 2022 - 10:13. |
#5
Posted 07 April 2022 - 10:16
Va salut!
sags ai putea sa imi arati cum as putea sa-l simplific? Si da, am vazut si eu ca am ceva erori ,dar nu se interpune cu rezultatul. Marian, am uitat textul . Textul e asta : Andrei, jucător amator de fotbal, are acasă o colecție de mingi. Fiecărei mingi i-a asociat o cifră. Într-o zi a așezat toate mingile într-o linie și și-a dat seama că cifrele de pe mingi formau un număr natural. Și-a mai dat seama și că toate mingile ce aveau scrise cifra c pe ele aveau o nuanță stridentă, așa că a hotărât să le elimine din șir. Care este noul număr format după eliminarea tuturor mingilor cărora le corespunde cifra c? Acum rămâne în sarcina ta să îți dai seama. De aici si mingile din explicatie. Iar eu nu cred ca "c" poate fii un numar. Dar in cazul in care este se pare ca programul imi afiseaza numarul initial. |
#6
Posted 07 April 2022 - 13:09
Am reusit in cele din urma sa obtin cele 100 de pcte, si cred eu ca de data aceasta nu mai am nici erori. Oricum, inca nu m-am lamurit de ce codul initial nu a fost bun fiindca practic imi dadea aceleasi rezultate. Noul cod arata cam asa :
#include <iostream> using namespace std; int main() { int n , c , z = 0 , inv = 1, nr = 1; cin >> n >> c; if (n == 0 && c == 0){ cout << -1; }else if (n == 0 && c != 0){ cout << 0; }else { while (n > 0){ inv = inv * 10 + n % 10; n = n / 10; } while ( inv > 1){ if ( inv % 10 != c){ z = z * 10 + inv % 10; nr = nr * 10; } inv = inv / 10; } if (nr == 1){ cout << -1; } else { cout << z % nr; } } return 0; } Edited by Dany_Darke, 07 April 2022 - 13:27. |
#7
Posted 07 April 2022 - 14:03
LE: Cele de mai sus se refera la coul initial. Vad ca intre timp ai rescris parti din el. Edited by sags, 07 April 2022 - 14:06. |
#8
Posted 07 April 2022 - 15:15
Poi m-am gandit asa, sa calculez x-u pentru a avea conditii de afisare in functie de el. Acel n1/x == 1 s-a referit strict la operatia in care numarul citit are toate cifrele egale cu cifra ce trebuie eliminata. Aia a fost logica mea. Dar acum citind ce mi-am scris ma indoiesc ca s-a executat vreodata. Iar inversul numarului l-am calculat ca sa respect oridinea de afisare, asa m-am gandit. Iar la impartirea variabilei inv la 10 , initial am facut asa : while ( inv > 1){
if ( inv % 10 != c){ z = z * 10 + inv % 10; inv = inv / 10; } else { inv = inv / 10;} Iar apoi mi-a venit ideea geniala de a stoca de cate ori apare cifra c in numar intr-o variabila pentru a putea face ce am scris mai sus. Iar apoi mi-am dat seama ca else - u e absolut inutil si ca putea pun inafara if-ului operatia inv = inv / 10; Da, multumesc frumos pentru observatii, m-au ajutat mult ! |
#9
Posted 07 April 2022 - 16:08
sags, on 07 aprilie 2022 - 10:10, said:
Ce nu e ok la 1 Irbaa, on 07 aprilie 2022 - 10:16, said:
Va salut! sags ai putea sa imi arati cum as putea sa-l simplific? Si da, am vazut si eu ca am ceva erori ,dar nu se interpune cu rezultatul. Marian, am uitat textul . Textul e asta : Andrei, jucător amator de fotbal, are acasă o colecție de mingi. Fiecărei mingi i-a asociat o cifră. Într-o zi a așezat toate mingile într-o linie și și-a dat seama că cifrele de pe mingi formau un număr natural. Și-a mai dat seama și că toate mingile ce aveau scrise cifra c pe ele aveau o nuanță stridentă, așa că a hotărât să le elimine din șir. Care este noul număr format după eliminarea tuturor mingilor cărora le corespunde cifra c? Acum rămâne în sarcina ta să îți dai seama. De aici si mingile din explicatie. Iar eu nu cred ca "c" poate fii un numar. Dar in cazul in care este se pare ca programul imi afiseaza numarul initial. In cazul asta daca alegem sa fie numar, o sa avem probleme cu restrictiile mentionate, si asta pentru ca nu mai suntem noi cei care gestioneaza zerourile de la inceput ci sistemul de calcul. Edited by MarianG, 07 April 2022 - 16:08. |
#10
Posted 07 April 2022 - 16:10
@MarianG: Corect, buna observatie. Dar raspunsul e altfel corect, adica afiseaza corect cifrele ce raman dupa eliminarea zerourilor (in acest caz). Eu consider ca limitarea aceea referitoare la datele de intrare are ca singur rol sa faca problema ‘gestionabila cu resurse obisnuite’.
Sunt curios totusi in ce situatii implementarea initiala dadea rezultate incorecte. Nu mi-e foarte clar ca de la zerourile de la inceput i s-ar trage fiindca in enunt apare ‘numar’ la datele de intrare si mai ales fiindca a doua implementare a obtinut punctaj maxim desi si ea ignora eventualele zerouri nesemnificative. Dupa o examinare a codului, din avion ce-i drept, nu imi dau seama care e cauza. |
|
#11
Posted 07 April 2022 - 17:18
Asta pentru ca sistemul taie zerourile inainte ca acestea sa poate fi verificate de sistemul evaluator ...
#include <stdio.h> #include <string.h> int main() { char minge[8] = {'\0'}; char numar[8] = {'\0'}; int resultat; char sterge; scanf("%8s %1s", &minge, &sterge); int pozitie, cifra=0; /* facem o copie dupa sir */ for (pozitie = 0; pozitie < 8; pozitie++) { if (minge[pozitie] != '\0') // daca avem cifre if (sterge != minge[pozitie]) // diferera de input numar[cifra++] = minge[pozitie]; } if (strlen(numar)==0) { //daca numarul nu mai are cifre resultat = -1; } else { // indepartam zerourile de la inceput sscanf(numar, "%d", &resultat); } printf("%d", resultat); return 0; } Quote Dacă în urma eliminării tuturor aparițiilor cifrei c nu mai rămâne nicio cifră, se va afișa -1, iar dacă vor rămâne numai cifre nule se va afișa 0. if (strlen(numar)==0) resultat = -1; Quote Dacă, în urma eliminărilor, noul număr începe cu unul sau mai mulți de 0 și există alte cifre nenule în noul număr, se vor elimina și acei 0 de la început. sscanf(numar, "%d", &resultat); Edited by MarianG, 07 April 2022 - 17:19. |
#12
Posted 07 April 2022 - 17:28
MarianG, on 07 aprilie 2022 - 17:18, said: Asta pentru ca sistemul taie zerourile inainte ca acestea sa poate fi verificate de sistemul evaluator ... |
#13
Posted 07 April 2022 - 18:07
Cred ca am gasit situatia cand programelul initial da rezultat incorect, chiar fara a exista zerouri nesemnificative: cand c = X o cifra nenula si n este format doar din X si 0 (fara zerouri la inceput). Treaba este ca z > 0 daca si numai daca n contine cel putin o cifra care este diferita atat de c cat si de 0; logica din if-ul final o ia pe aratura in cazul de care zic si cred ca nu scrie nimic. (Tot lene imi este sa compilez programelul si sa il rulez/testez, deci tot exista posibilitatea sa ma insel… Da’ initatoru’ o sa il testeze cu 10 1, nu-i asa?)
Edited by sags, 07 April 2022 - 18:08. |
#14
Posted 07 April 2022 - 18:09
nu-mi dau seama, atat ma invarte cu inv, n, c, z, x ca nu inteleg unde si ce trebuie sa fac cu ele
|
#15
Posted 07 April 2022 - 18:34
Asa este, pentru 10 1 , programul e invalid. Dar atunci conditia care sa fie sa functioneze? z > 0 si c != x si z != c?
|
|
#16
Posted 07 April 2022 - 18:34
|
#17
Posted 07 April 2022 - 18:47
pai daca este sa tratam cazul pur matematic, hai sa urmam formula de construire a numerelor, Suma de cifra * 10pozitie
do { cifra = numar % 10; if (cifra != sterge) { rezultat += cifra * magnitudine; magnitudine *= 10; // line stearsa in mod voit } numar /= 10; }while(numar); // linie stearsa in mod voit printf("%d\n", rezultat); Irbaa, on 07 aprilie 2022 - 18:34, said:
Dar atunci conditia care sa fie sa functioneze? z > 0 si c != x si z != c? Cuvintele au inteles, literele au semnifiicatie ascunsa. Sunt 10 cazuri in care cifrele pot fi si numere. Cum este cazul tau 'z' si 'x' sunt numere, de ce compari numere cu cifre ? Edited by MarianG, 07 April 2022 - 18:53. |
#18
Posted 07 April 2022 - 19:04
@sags tot ce-mi trece prin cap este ca atunci cand face oglinda numarului pierde zerourile din coada
|
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users