Exercitii baze de numeratie
7Urmatorul articole este destinat incepatorilor si trateaza diferite tipuri de exercitii cu bazele de numeratie. Vom trece peste partea de citire a vectorilor sau a bazelor, le vom initializa direct, intru-cat acestea sunt chestii de rutina. Programele sunt scrise in limbajul de programare C++, iar ca mediu de lucru am folosit MinGW Developer Studio. Sper sa fie de folos. 🙂
1. Se da un vector cu n componente (1<=n<=1000) numare naturale scirse in baza 10 si o baza b (2<=b<=10). Se cere sa se afiseze componentele vectorului (scrise in baza 10 si in baza b) care in baza b au exact 2 cifre nenule.
Exemplu: pentru n=3 si vectorul 5 8 12, b=2 se va afisa
5 101
12 1100
Vom transforma fiecare numar din vector in baza 2 si vom verifica daca are fix 2 cifre nenule. In caz afirmativ vom afisa corespondentul sau in baza 10 si transformarea sa in baza 2. Puteti observa in codul de mai jos cum am transformat componentele din baza 10 in baza 2.
#include <iostream> using namespace std; int b=2,i,n=4,v[]={0,5,8,12},y[100],aux,nr,k,j; int main() { for (i=1;i<=n;++i) { nr=0; aux=v[i]; k=0; if (aux==0) {k++;y[k]=0;} else { while (aux) { k++; y[k]=aux%b; aux/=b; } } for (j=k;j>0;--j) if (y[j]!=0) nr++; if (nr==2) { cout<<v[i]<<" "; for (j=k;j>0;--j) cout<<y[j]; cout<<"\n"; } } return 0; }
2. Se da un vector cu n componente (1<=n<=100) numere naturale scrisa in baza b (2<=b<=10). Se cere sa se afiseze suma componentelor vectorului in baza 10.
Pentru n=3 si vectorul 101 1010 1100 , b=2 se va afisa 27 (suma numerelor din baza 10 5 10 12).
Vom transforma pe rand componentele vectorului in numere in baza 10 si le vom aduna in variabila s.
#include <iostream> using namespace std; int b=2,v[]={101,1010,1100},n=3,i,j,aux,s,y[100],k,nr,p; int main() { for (i=0;i<n;++i) { aux=v[i]; k=0; if (aux==0) {k++;y[k]=0;} else while (aux) { k++; y[k]=aux%10; aux/=10; } nr=0; p=1; for (j=1;j<=k;++j) { nr+=y[j]*p; p*=b; } s+=nr; } cout<<"suma="<<s<<"\n"; return 0; }
3. Se dau doua numere naturale, unul in baza b1, iar celalalt in baza b2 (2<=b1, b2<=10). Se cere sa se afiseze suma numerelor in baza 10.
Exemplu: pentru 12 in baza 3 si 100 in baza 2, suma este 9 (12 din baza 3=5 in baza 10 si 100 din baza 2=4 in baza 10).
Vom transforma numerele din bazele b1 si b2 in baza 10, apoi le vom calcula suma.
#include <iostream> using namespace std; int b1=3,a=12,b2=2,b=100,x[100],y[100],nr1,nr2,s,i,j,k,aux,p; int main() { k=0; aux=a; if (aux==0) {k++;x[k]=0;} else while (aux) { k++; x[k]=aux%10; aux/=10; } p=1; for (j=1;j<=k;++j) { nr1+=x[j]*p; p*=b1; } k=0; aux=b; if (aux==0) {k++;y[k]=0;} else while (aux) { k++; y[k]=aux%10; aux/=10; } p=1; for (j=1;j<=k;++j) { nr2+=y[j]*p; p*=b2; } s=nr1+nr2; cout<<"suma="<<s<<"\n"; return 0; }
4. Se dau doua numere naturale, unul in baza b1, iar celalat in baza b2 (2<=b1, b2<=10). Se cere sa se calculeze produsul lor in baza cea mai mica dintre b1 si b2.
Exemplu: pentru 12 din baza 3 si 100 din baza 2 se va afisa 10100 (deoarece numerele transformate in baza 10 sunt 5 respectiv 4, iar produsul lor din baza 10 este 20, transformat in baza 2 este 10100).
Mai intai vom transforma numerele in baza 10 si le vom calcula produsul. Vom stabili apoi minimul dintre b1 si b2 si vom transforma produsul in baza minima. Pentru a intelege mai bine urmariti atent urmatorul cod:
#include <iostream> using namespace std; int b1=3,a=12,b2=2,b=100,Min,nr1,nr2,x[100],y[100],z[100],i,j,aux,k,p,produs,rez; int main() { k=0; aux=a; if (aux==0) {k++;x[k]=0;} else while (aux) { k++; x[k]=aux%10; aux/=10; } p=1; for (j=1;j<=k;++j) { nr1+=x[j]*p; p*=b1; } k=0; aux=b; if (aux==0) {k++;y[k]=0;} else while (aux) { k++; y[k]=aux%10; aux/=10; } p=1; for (j=1;j<=k;++j) { nr2+=y[j]*p; p*=b2; } if (nr1>nr2) Min=b2; else Min=b1; produs=nr1*nr2; k=0; aux=produs; if (aux==0) {k++;z[k]=0;} else while (aux) { k++; z[k]=aux%Min; aux/=Min; } for (j=k;j>0;--j) cout<<z[j]; return 0; }
5. Se cere sa se afiseze (transformat in baza 10) cel mai mare numar in baza 2 format din n cifre (1<=n<=100). Vom avea pentru n=4 numarul 15.
Cel mai mare numar format din 4 cifre in baza 2 este 1111, pentru n=3 vom avea numarul 111. Vom calcula acest numar in variabila nr (in baza 2), apoi vom transforma nr in baza 10.
#include <iostream> using namespace std; int n,i,nr,aux,p,k,y[1000],rez,j; int main() { cout<<"Dati n: ";cin>>n; for (i=1;i<=n;++i) nr=nr*10+1; k=0; aux=nr; if (aux==0) {k++;y[k]=0;} else while (aux) { k++; y[k]=aux%10; aux/=10; } p=1; for (j=1;j<=k;++j) { rez+=y[j]*p; p*=2; } cout<<"rezultat: "<<rez<<"\n"; return 0; }
6. Se dau doua numere in doua baze de numeratie b1 si b2 (2<=b1, b2<=10). Se cere sa se determine toate solutiile eucatiei xy(b1)+yx(b2)=20. Numarul 20 va fi considerat in baza 10.
Exemplu: pentru bazele de numeratie 4 si 9 exista o singura solutie x=2 si y=1.
Parcurgem toate valorile posibile pentru x si y verificand conditia din enunt. Perechile de numere x si y ce corespund cerintei vor fi afisate.
#include <iostream> using namespace std; int b1,b2,x,y,Min; int main() { cout<<"b1=";cin>>b1; cout<<"b2=";cin>>b2; if (b1>b2) Min=b2; else Min=b1; for (x=1;x<Min;++x) for (y=1;y<Min;++y) if (x*b1+y+y*b2+x==20) cout<<x<<" "<<y<<"\n"; return 0; }
Sper ca ati priceput cum se lucreaza cu bazele de numeratie, in curand cred ca voi pune si o problema bazata pe asta. Astept feedback 😀 .
Am citit doar problemele propuse si mi s-au parut interesante. Pentru inceput formateaza de acum codul ce il folosesti pentru ca este mai usor de urmarit cu ‘sintax highlighting’. Imi cer scuze pentru absenta indelungata din programarea in C++ insa voi reveni curand cu lucruri noi! 😀
Multumesc Andrei, data viitoare voi fi mai atenta!
Și inca o chestie in legatura cu codul. Este mult mai usor de urmarit daca il formatezi puțin mai mult (funcțiile din cadrul unui for sa fie un tab mai in dreapta, pentru if-uri la fel, etc.).
Eu il formatez cand il scriu in IDE, dar aici nu stiu de ce apare asa. 😐
Pentru ca nu il incadrezi unde trebuie,daca il pui in Visual nu va aparea cum trebuie, tu trebuie sa lucrezi pe HTML. 😛
Am priceput acum. 🙂
Progamare de clasa 1 , nu poti fi mic programator ori stii ori taci din gura simplu ,cel mai bine utilizati limbaju binar e cel mai simplu „01100110011011110111001001101101011000010111010000 100000011000110011101001011100
0010000000101111010100010010111101011000” nu e nimic greu doar il introduceti in notepad salvati cu extensia .exe si gata programu .