Jump to content

Recommended Posts

Posted

Problema suna asa:

"Scrie un program care sa elimine cifra 0 dintr-un numar natural citit de la tastatura".  

Exemplu: daca n=10207, sa se afiseze 127.  

Sunt clasa a IX-a, profil mate info simplu, de abea ne-a predat algoritmul de prelucrare a cifrelor unui nr si algoritmul de determinare a max/min dintr-un sir de numere.Am rezolvat toata tema pana acum, me-a mai ramas aceasta problema.Stiu ca pentru multi de aici aceasa este o chestiune banala, dar chiar nu mai am nici o idee.  

 

 

off topic: Salut tuturor, sunt nou pe forum, aceasta este primul meu post :D, stiu ca e tarziu si etc, poate ca de asta nu reusesc sa gasesc o solutie, dar vreau sa aflu cum se rezolva, nu din criza de timp deoarece am timp pana joi si nici nu imi pune cineva '2' daca nu termin tema.Sunt doar foarte curios sa aflu raspunsul pentru ca pana acum imi place aceasta materie si vreau sa invat.  

ps: folosim C++, codeblocks.

 

Posted

sa zicem ca numarul tau e salvat in variabila x

 

vei vrea sa ai acces la fiecare litera a lui x. Cel mai usor e sa iei toate literele din dreapta numarului, folosind      numar % 10          (adica restul impartirii cu 10).

 

Apoi, verificam daca cifra este 0, si daca nu, construim noul numar. Il inmultim cu 10 (practic asa adaugam un 0 la coada) si adunam cifra obtinuta mai sus.

 

presupunand ca ai citit numarul deja, si lai salvat in variabila 'numar':

rezultatat = 0;     // initializam rezultatul cu 0
while ( numar != 0 )    //adica cat timp mai avem cifre
{
       cifra = numar % 10 ;      //luam ultima cifra, luand restul impartirii la 10
       numar = numar / 10 ;     // stergem ultima cifra din numar, impartind la 10
       if ( cifra != 0 )        // daca cifra nu e 0
       rezultat = (rezultat * 10 ) + cifra     /// cum ziceam mai sus.. adaugam cifra la sfarsitul rezultatului
}
 
// acum, rezultat va contine numarul initial fara 0.

Sper ca nu am gresit cu nimic :D

  • Upvote 1

love is a verb
Love is a doing word

  • Moderators
Posted

// acum, rezultat va contine numarul initial fara 0.

 

 

Dupa calculezi inversul :D

 

Pseudocod:

 natural n,x,y
 citeşte n
 x<-0
 y<-0
┌cât timp (n!=0) execută
|  ┌dacă (n%10!=0) atunci
|  |   x<-x*10+n%10
|  └■
|  n<-n/10
└■
┌cât timp (x!=0) execută
|   y<-y*10+x%10
|   x<-x/10
└■
 scrie y

C++

#include <iostream>
using namespace std;
int main(void)
{
    int n,x=0,y=0;
    cin>>n;
    while (n)
    {
        if (n%10)
            x=x*10+n%10;
        n/=10;
    }
    while (x)
    {
        y=y*10+x%10;
        x/=10;
    }
    cout<<y;
    return 0;
}
Posted

Ca sa ii faci inversul iarasi trebuie sa scrii algoritmul.Mai bine faci diferit.

 

In loc sa scrii partea cu : rezultat = (rezultat * 10 ) + cifra , faci ceva de genul:

initializezi o variabila p cu 1

rezultatul = c * p + rezultatul ;

p=p*10;

  • Upvote 1
  • Moderators
Posted

initializezi o variabila p cu 1

rezultatul = c * p + rezultatul ;

p=p*10;

 

Cam aşa?

#include <iostream>
using namespace std;
int main(void)
{
    int n,x=0,p=1;
    cin>>n;
    while (n)
    {
        if (n%10)
        {
             x=n%10*p+x;
             p=p*10;
        }
        n/=10;
    }
    cout<<x;
    return 0;
}
Posted

Da , cam asa ceva.

 

E mai usor sa faci in felul asta pentru ca nu mai ai de facut si inversul dupa while.In plus ai mai putine structuri repetitive care iarasi e un avantaj.(bine... nu te deranjeaza mult la programe mici)

Posted
#include <iostream>
using namespace std;
int main()
{ unsigned n,c,r=0,p=1;
cout<<"Introduceti numarul:";cin>>n;
while(n!=0) {
c=n%10;
n=n/10;
if(c!=0){r=c*p+r;p=p*10;}
}
cout<<"Rezultatul este:"<<r;
    return 0;

Multumesc tuturor pentru raspunsuri! 

Am analizat primul reply al lui GodsOtherHand si am observat ca il elimina pe 0 dar rezultatul era "in oglinda", de "invers" nu ne-a spus proful nimic pana acum si am mers pe mana lui hiey19 editand putin programul anterior si am obtinut rezultatul dorit. Seamana cu programul lui Courage dar eu am mai initializat variabila 'c'. Multumesc inca o data!

  • Moderators
Posted

Ca idee, e bine să faci algoritmul cât mai uşor de citit.

 

De exemplu

#include <iostream>
#include <math.h>
using namespace std;
int main(void)
{int n,d,ok;
cout<<"n=";cin>>n;
if (n%2==0){
if{n==2) cout<<"Este prim";
else cout<<"Nu este prim";}
else{d=3;ok=1;
while (d<=sqrt(n)&&ok)
if (n%d==0) ok=0;
else d+=2;
if (ok) cout<<"Este prim";
else cout<<"Nu este prim";}
return 0;}

şi

#include <iostream>
#include <math.h>
using namespace std;
int main(void)
{
    int n,d,ok;
    cout<<"n=";cin>>n;
    if (n%2==0)
    {
        if (n==2)
            cout<<"Este prim";
        else
            cout<<"Nu este prim";
    }
    else
    {
        d=3;
        ok=1;
        while (d<=sqrt(n)&&ok)
            if (n%d==0)
                ok=0;
            else
                d+=2;
        if (ok)
            cout<<"Este prim";
        else
            cout<<"Nu este prim";
    }
    return 0;
}
Posted

Am gasit o lista cu exercitii suplimentare pentru "A02. PROGRAM C++ PENTRU CALCUL SUMEI ŞI PRODUSULUI CIFELOR UNUI NUMĂR"    

Asa ca m-am decis sa incep sa le rezolv in ordine, de la prima problema la ultima.         

1. Se citeste un număr natural n. Să se afiseze suma si produsul cifrelor pare.
(exp : n=1234 => s=2+4=6, p=2*4=8)
(la rezolvare am mai adaugat suma si produsul cifrelor impare.  

#include <iostream>
using namespace std;
int main()
{
    unsigned n,c,p1=1,s1=0,p2=1,s2=0;
    cout<<"Introduceti numarul:";
    cin>>n;
    while(n!=0)
    {
        c=n%10;
        if(c%2==0){s1=c+s1;
         p1=c*p1;}
         else{s2=c+s2;   
         p2=c*p2;}
        n=n/10;
    }
    cout<<"Suma cifrelor pare este:"<<s1<<endl;
    cout<<"Suma cifrelor impare este:"<<s2<<endl;
    cout<<"Produsul cifrelor pare este:"<<p1<<endl;
    cout<<"Produsul cifrelor impare este:"<<p2;
    return 0;
}


Am ajuns la exercitiul 2:  

2. Se citeste un număr natural n. Să se afiseze suma si produsul cifrelor din pozitiile pare.
Numerotarea pozitiilor se face începând cu cifra cea mai semnificativă.
(exp : n=27156 => s=7+5=12, p=7*5=35)   

 

Incerc sa gasesc o solutie pentru "pozitia para", dar pana acum nu cred ca voi gasi una. 

Sfaturi?

Posted

poti folosi un fel de contor. 

La inceput contorul este 0.

Apoi,  extragi prima cifra. contor++ . Acum contor e 1. 

Verifici daca contorul e numar par (nu uita, contorul tine minte a cata cifra o ai acolo) luand restul impartirii la 2.  ( contor % 2)

Daca e diferit de 0, inseamna ca cifra e pe pozitie impara, si sari peste ea.

love is a verb
Love is a doing word

Posted

Da, poti folosi un fel de contor cum a zis si GodsOtherHand.

 

Mai ai si varianta urmatoare. Poti sa faci ceva de genul :

 

c= (n%100)/10;

 

c sa fie cifra pe care vrei sa o extragi. n e numarul tau. cu %100 vei lua ultimele doua cifre ,iar cu /10 vei ramane numai cu cifra de pe pozitia para.

s=s+c;

p=p*c;

n=n/100;

Va trebui sa le pui toate intr-un while.

 

Nu stiu cat de bine ar merge, e doar o idee.

 
Posted

poti folosi un fel de contor. 

La inceput contorul este 0.

Apoi,  extragi prima cifra. contor++ . Acum contor e 1. 

Verifici daca contorul e numar par (nu uita, contorul tine minte a cata cifra o ai acolo) luand restul impartirii la 2.  ( contor % 2)

Daca e diferit de 0, inseamna ca cifra e pe pozitie impara, si sari peste ea.

Merciiii, cred ca acesta va fi primul program scris de mine in care folosesc contorul, gonna be funny :D  

 

EDIT: nu stiu ce sa zic atata timp cat sunt incepator, cred ca mai conteaza si daca numarul are un numar par sau impar de cifre. Suna ciudat dar ati inteles ce vreau sa zic...Si la contor valoarea finala as pune-o 6, din moment ce folosesc "unsigned",nu?Am grija sa nu introduc un nr mai mare de 6 cifre si aia e...Da sa vad cum il duc la cap intai :))

Posted
#include <iostream>
using namespace std;
int main()
{
    unsigned n,c,s=0,p=1,a;
    cout<<"Introduceti numarul:";cin>>n;
    for(a=1;a<=6;a++)
    if(a%2==0){c=n%10;s=s+c;p=p*c;n=n/10;}//am verificat daca  contorul e par si am dat instructiunile pentru s si p
    cout<<"Suma cifrelor este:"<<s<<endl;
    cout<<"Produsul cifrelor este:"<<p;
    return 0;
}

Nu stiu ce are da nu me-a dat, am scris-o acum pe moment ce de abea am intrat in casa, pareri?

Posted

Nu ai facut bine pentru ca ai facut un for de la 1 la 6. Nu merge asa, iti trebuie un while.

 

Daca tu dai un numar de trei cifre, instructiunea ta va continua, numarul tau devine 0 si va inmultii produsul tau cu 0 la al patrulea pas din for spre exemplu.

Posted

Nu neaparat. Poti calcula inainte cate cifre are numarul. 

De exemplu, il salvezi in alta variabila, pe care o imparti la 10, pana cand devine 0. Numeri de cate ori ai impartit..si ai obtinut numarul de cifre.

love is a verb
Love is a doing word

Posted

E prea mult de lucru ca sa-i calculezi si numarul de cifre.

 

Incearca cu un while si cu contor sau incearca cu acele impartiri ca sa scoti cifrele de pe pozitiile pare.

Posted

Nu e vorba ca ar fi el lung in sine. Oricine il poate face intr-un timp foarte scurt.Idea e sa nu treci prin atat de multe etape doar ca sa rezolvi o problema simpla.

Posted

nr_cifre=0;

temp = numar;

while(temp)

{  

     nr_cifre++;

     temp = temp / 10;

}

 

nu e chiar asa lung..

Smart, nu m-as fi gandit la asa ceva :))  

Am sa incerc maine sa combin contorul cu treaba asta, pana atunci poate sa imi spuna cineva ce mai e gresit la incercarea mea cu contor de mai sus, in afara de maxima valoarea lui a? I-am dat lui n si 6 cifre si tot nu a mers.

 

Si apropo: while(temp) spre exemplu este echivalent cu while(temp!=0) ?

Posted

Cam asa ceva ar trebui sa fie cu while+contor.

 

int n,c,cf,s,p=1;
int main()
{
    cout<<"n=";cin>>n;
    while(n!=0)
    {
      c++;
      if(c%2==0)
      {
          cf=n%10;
          s=s+cf;
          p=p*cf;
      }
      n=n/10;
    }
    cout<<s<<" "<<p;
    return 0;
}
 

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.