Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Samsung Galaxy A35

Sfat pentru aprinderea automata a...

Masina de copt paine - pareri

Cum reactivez Google Maps?
 Conectare tableta X220la Tv

Femeile tinere nu mai vor sa munc...

La mulți ani @un_dac!

La multi ani de Sfantul Gheorghe&...
 Job - Facultate sau certificare

Deadpool & Wolverine (2023)

sistem hibrid eoliana + panouri +...

Outlook e muta pe Android
 Constructie Mun. Iasi. Casa P+1.

Cum mai rezolvati cu chiriasii ra...

Tastatura si mouse cu baterie int...

AC Gree duce la palpait de becuri
 

Eliminarea unei cifre dintr-un numar.

- - - - -
  • Please log in to reply
33 replies to this topic

#1
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 54
  • Înscris: 15.03.2022
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
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,946
  • Înscris: 24.04.2013
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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,434
  • Înscris: 10.08.2005

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.
CARE MINGI ?

"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 .
asta pentru ca nu ai defenit corect 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.
din cate am inteles eu problema, rezultatul asteptat ar fi 0.

Problema este una de siruri si caractere, nu de numere si cifre.

 test (numar, cifra) == expected_outut 


#4
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,946
  • Înscris: 24.04.2013
Ce nu e ok la 100300400 0 -> 134? Mie mi se pare corect. (Iar cf enunt c este sigur o cifra. LE: Nu spune si despre ce baza de numeratie este vorba, da’ hai sa nu ne uitam la asemenea amanunte…)

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
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 54
  • Înscris: 15.03.2022
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
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 54
  • Înscris: 15.03.2022
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
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,946
  • Înscris: 24.04.2013
  • Cat rezulta n1 si x daca n (cel initial) este 0? Si ce se intampla cand se evalueaza conditia n1 / x == 1?
  • Si totusi de ce nu crapa programul cand ii furnizezi 0 pentru n? Calculul n1 / x == 1 este facut vreodata? De ce?
  • Daca se ajunge la evaluarea conditiei din ultimul [else] if din functie, este posibil ca x sa fie diferit de 0? Daca da ce scrii in acest caz? Daca nu, la ce mai foloseste sa pui conditia?
  • Odata calculat x, unde e nevoie de el? Daca din raspunsurile anterioare ajungi la concluzia ca nici n1 / x == 1 nu se executa nici x == 0 nu e necesar, atunci la ce mai foloseste x? De ce l-ai mai calcula?
  • Ca o remarca generala, n1 / x == 1 nu este deloc acelasi lucru cu n1 == x. De ce? Hint: citeste despre impartirea intregilor. Aici poate (nu imi dau seama exact) ar functiona avand in vedere natura problemei si modul foarte particular in care sunt calculate, dar codul nu este deloc clar pentru altii iar in alte situatii poate introduce erori.
  • In al doilea while, in logica problemei inv % 10 are o insemnatate anume si parca ar merita o variabila si nu calculat de 3 ori.\
  • Tot acolo logica problemei spune ca inv trebuie impartit la 10 indiferent unde ‘atasezi’ ultima lui cifra, deci locul acelei impartiri nu este in if ci pe langa el. Acest lucru va deveni si mai vizibil/ necesar daca elimini complet partea else (calculul lui x).
  • Nu mi-e foarte clar daca inversarea ordinii cifrelor e o simplificare sau o complicatie. Poate ca in cazul in care lucrezi cu un numar evita sa ai de-a face cu puterile lui 10. Daca vei lucra cu sir de cifre, atunci clar nu mai e nevoie: pe masura ce parcurgi cifrele, pur si simplu sari peste ce nu trebuie sa pastrezi iar ce trebuie sa pastrezi ‘compactezi’ catre inceputul sirului.
Atentie ca observatiile de mai sus vin doar din citirea sursei. Nu am executat codul sa verific deci este posibil sa ma si insel…

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
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 54
  • Înscris: 15.03.2022
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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,434
  • Înscris: 10.08.2005

 sags, on 07 aprilie 2022 - 10:10, said:

Ce nu e ok la 100300400 0 -> 134? Mie mi se pare corect. (Iar cf enunt c este sigur o cifra.
n are cel puțin 1 cifră și maxim 8.

 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.
Daca ne gandim un pic, enuntul este partinitor. Se formeaza un sir de cifre, ca este natural sau intreg este o constrangere pe care ne-o inpunem singuri.
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
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,946
  • Înscris: 24.04.2013
@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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,434
  • Înscris: 10.08.2005
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.
bine, aici am trisat si am lasat sistemul de calcul sa se ocupe de indepartea zerourilor, dar o fac in mod constient, cand fac trecerea de la sir de numere la valoare numerica.
sscanf(numar, "%d", &resultat);

Edited by MarianG, 07 April 2022 - 17:19.


#12
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,946
  • Înscris: 24.04.2013

 MarianG, on 07 aprilie 2022 - 17:18, said:

Asta pentru ca sistemul taie zerourile inainte ca acestea sa poate fi verificate de sistemul evaluator ...
In general sunt de acord cu asta, insa si cea de a doua implementare taie zerourile de la inceput si totusi a obtinut punctaj maxim. Deci fie autorul nu are in vedere acest caz (il considera exclus, mai ales ca spune ‘numar’ despre n, de aici vine dubiul din cauza caruia am scris ‘in general’), fie cazurile de test (banuiesc aceleasi folosite si in primul caz) nu acopera aceasta situatie. Evident programelul poate fi rescris cu siruri si asa ar corespunde mai bine enuntului, dar curiozitatea mea ramane: ce era gresit in prima implementare, asa cum era ea, de natura sa duca la rezultate incorecte?

#13
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,946
  • Înscris: 24.04.2013
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 Posted Image (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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,434
  • Înscris: 10.08.2005
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
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 54
  • Înscris: 15.03.2022
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
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,946
  • Înscris: 24.04.2013
  • inv este numarul format dintr-un 1 urmat de cifrele lui n in ordine inversa. Acel 1 este ca sa nu piarda zerourile de la sfarsitul lui n, care se muta la inceputul lui inv. Aici ar fi de mentionat ca n are cel mult 8 cifre, deci inv are cel mult 9 si incape pe un signed int de 32 de biti.
  • c este una din datele de intrare: cifra dare trebuie eliminata.
  • z este format din succesiunea de cifre ale lui n care difera de c, in ordinea din n. Daca nu exista nici una valoarea lui este 0 (din initializare). De notat ca z == 0 nu poate distinge intre situatia ca exista cifre non-c dar toate sunt 0 si cea in care nu exista cifre non-c deloc.
  • x este similar format din cifrele lui n egale cu c, adica un ccccc. cu atatia de c cati apar in n. Valoarea este 0 daca nu exista nici unul. Cand c este 0 avem si x pe 0 indiferent daca cifra zero apare sau nu in n.
Dupa mine aceasta ‘duplicitate’ a valorii zero pentru z si x face testele finale greu de urmarit si deci e greu de decis daca acopera corect toate cazurile sau se pierde ceva. Si eu zic ca se pierde…

#17
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,434
  • Înscris: 10.08.2005
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?
Conditia este sa te exprimi  in cuvinte si nu in litere.
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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,434
  • Înscris: 10.08.2005
@sags tot ce-mi trece prin cap este ca atunci cand face oglinda numarului pierde zerourile din coada

Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate