Advertisement
Tucancitto

Pb13. Număr mare

Sep 3rd, 2021
1,152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.93 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. class Numar
  6. {
  7. private:
  8.     int* cifre;
  9.     int nrCifre;
  10.  
  11. public:
  12.     int* alocare(int nrCifre)
  13.     {
  14.         int* cifre = new int[nrCifre]();
  15.         return cifre;
  16.     }
  17.     Numar() : nrCifre(0), cifre(nullptr) {}
  18.     Numar(int nrCifre) : nrCifre(nrCifre)
  19.     {
  20.         cifre = alocare(nrCifre);
  21.  
  22.     }
  23.     Numar(const Numar& N)
  24.     {
  25.         nrCifre = N.nrCifre;
  26.         cifre = alocare(nrCifre);
  27.  
  28.         for (int i = 0; i < nrCifre; ++i)
  29.             cifre[i] = N.cifre[i];
  30.     }
  31.  
  32.     ~Numar()
  33.     {
  34.         delete[] cifre;
  35.     }
  36.  
  37.     Numar operator=(const Numar& N)
  38.     {
  39.         if (this != &N)
  40.         {
  41.             this->~Numar();
  42.             nrCifre = N.nrCifre;
  43.             cifre = alocare(nrCifre);
  44.  
  45.             for (int i = 0; i < nrCifre; ++i)
  46.                 cifre[i] = N.cifre[i];
  47.         }
  48.  
  49.         return *this;
  50.     }
  51.  
  52.     friend istream& operator>>(istream& in, Numar& N)
  53.     {
  54.         in >> N.nrCifre;
  55.         N.cifre = N.alocare(N.nrCifre);
  56.  
  57.         for (int i = 0; i < N.nrCifre; ++i)
  58.             in >> N[i];
  59.  
  60.         return in;
  61.     }
  62.     friend ostream& operator<<(ostream& out, Numar N)
  63.     {
  64.         for (int i = 0; i < N.nrCifre; ++i)
  65.             out << N[i];
  66.  
  67.         return out;
  68.     }
  69.  
  70.     friend bool operator==(Numar N1, Numar N2)
  71.     {
  72.         if (N1.nrCifre == N2.nrCifre)
  73.         {
  74.             for (int i = 0; i < N1.nrCifre; ++i)
  75.                 if (N1[i] != N2[i])
  76.                     return false;
  77.             return true;
  78.         }
  79.  
  80.         return false;
  81.     }
  82.     friend bool operator!=(Numar N1, Numar N2)
  83.     {
  84.         return !(N1 == N2);
  85.     }
  86.  
  87.     friend bool operator<(Numar N1, Numar N2) // N1 < N2
  88.     {
  89.         if (N1.nrCifre < N2.nrCifre)
  90.             return true;
  91.  
  92.         if (N1.nrCifre == N2.nrCifre)
  93.         {
  94.             for (int i = 0; i < N1.nrCifre; ++i)
  95.                 if (N1[i] > N2[i])
  96.                     return false;
  97.  
  98.             return true;
  99.         }
  100.  
  101.         return false;
  102.     }
  103.     friend bool operator>(Numar N1, Numar N2) // N1 > N2
  104.     {
  105.         return !(N1 < N2);
  106.     }
  107.  
  108.     int& operator[](int k) throw (out_of_range)
  109.     {
  110.         if (k < 0 or k >= nrCifre)
  111.             throw out_of_range("Indice in afara limitelor");
  112.  
  113.         return cifre[k];
  114.     }
  115.  
  116.     int getCifra(int k) throw (out_of_range)
  117.     {
  118.         if (k < 0 or k >= nrCifre)
  119.             throw out_of_range("Indice in afara limitelor");
  120.  
  121.         return cifre[k];
  122.     }
  123.  
  124.     friend Numar operator+(Numar N1, Numar N2)
  125.     {
  126.         if (N1 < N2)
  127.             swap(N1, N2);
  128.  
  129.         if (N1.nrCifre != N2.nrCifre)
  130.         {
  131.             Numar auxN2(N1.nrCifre);
  132.  
  133.             for (int i = N1.nrCifre - N2.nrCifre; i < N1.nrCifre; ++i)
  134.                 auxN2[i] = N2[i - (N1.nrCifre - N2.nrCifre)];
  135.  
  136.             N2 = auxN2;
  137.         }
  138.  
  139.         Numar Suma(N1.nrCifre);
  140.         int transport = 0;
  141.  
  142.         for (int i = N1.nrCifre - 1; i >= 0; --i)
  143.         {
  144.             transport = N1[i] + N2[i] + transport;
  145.             Suma[i] = transport % 10;
  146.             transport /= 10;
  147.         }
  148.  
  149.         if (transport != 0)
  150.         {
  151.             Numar auxSuma(N1.nrCifre + 1);
  152.             auxSuma[0] = transport % 10;
  153.             transport /= 10;
  154.  
  155.             for (int i = 0; i < N1.nrCifre; ++i)
  156.                 auxSuma[i + 1] = Suma[i];
  157.  
  158.             Suma = auxSuma;
  159.         }
  160.  
  161.         return Suma;
  162.     }
  163. };
  164.  
  165.  
  166. void citire(Numar*& vect, int& dim)
  167. {
  168.     ifstream fin("numereMari.txt");
  169.     fin >> dim;
  170.  
  171.     vect = new Numar[dim];
  172.  
  173.     for (int i = 0; i < dim; ++i)
  174.     {
  175.         Numar N;
  176.         fin >> N;
  177.         vect[i] = N;
  178.     }
  179. }
  180.  
  181. void afisare(Numar* vect, int dim)
  182. {
  183.     for (int i = 0; i < dim; ++i)
  184.         cout << vect[i] << " ";
  185.  
  186.     cout << endl;
  187. }
  188.  
  189. Numar nrMin(Numar* vect, int dim)
  190. {
  191.     Numar Min = vect[0];
  192.  
  193.     for (int i = 1; i < dim; ++i)
  194.         if (vect[i] < Min)
  195.             Min = vect[i];
  196.  
  197.     return Min;
  198. }
  199.  
  200. Numar nrMax(Numar* vect, int dim)
  201. {
  202.     Numar Max = vect[0];
  203.  
  204.     for (int i = 1; i < dim; ++i)
  205.         if (vect[i] > Max)
  206.             Max = vect[i];
  207.  
  208.     return Max;
  209. }
  210.  
  211. int main()
  212. {
  213.     Numar* vect;
  214.     int dim;
  215.  
  216.     citire(vect, dim);
  217.  
  218.     cout << "Elementele sirului: ";
  219.     afisare(vect, dim);
  220.  
  221.     Numar Min = nrMin(vect, dim), Max = nrMax(vect, dim);
  222.     cout << "Cel mai mic numar din sir: " << Min << endl;
  223.     cout << "Cel mai mare numar din sir: " << Max << endl << endl;
  224.  
  225.     cout << "Suma dintre cel mai mic si cel mai mare numar din sir este: " << Min + Max << endl;
  226.  
  227.  
  228.     try
  229.     {
  230.         cout << Min[0] << endl;
  231.         cout << Min.getCifra(12) << endl;
  232.     }
  233.     catch (out_of_range& e)
  234.     {
  235.         cout << "Eroare de tipul: " << e.what();
  236.     }
  237.  
  238.     return 0;
  239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement