Advertisement
ewa_tabor

Duze Liczby, działające

May 20th, 2018
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.39 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3. class duzaLiczba
  4. {
  5.   protected:
  6.   friend ostream & operator << (ostream &s1,const duzaLiczba &o1);
  7.   friend istream & operator >> (istream &s1, duzaLiczba &o1);
  8.   char *wsk;
  9.   int size;
  10.   public:
  11.   duzaLiczba ()
  12.   {
  13.     wsk=NULL;
  14.     size=0;
  15.   }
  16.   duzaLiczba (const duzaLiczba &o1){
  17.     size=o1.size;
  18.     wsk=new char[size];
  19.         for (int i = 0; i < size; i++) wsk[i] = o1.wsk[i];
  20.   }
  21.   ~duzaLiczba ()
  22.   {
  23.     if (wsk!=NULL) delete []wsk;
  24.     wsk=NULL;
  25.     size=0;
  26.   }
  27.   duzaLiczba & operator = ( const duzaLiczba &o1)
  28.   {
  29.     if (this==&o1) return *this;
  30.     if (this->wsk!=NULL) this->~duzaLiczba();
  31.     this->size=o1.size;
  32.     this->wsk=new char [o1.size];
  33.     for (int i=0; i<this->size; i++){
  34.       this->wsk[i]=o1.wsk[i];
  35.     }
  36.     return *this;
  37.   }
  38.   duzaLiczba operator + (duzaLiczba &o1)
  39.   {
  40.     if (o1.wsk==NULL) return *this;
  41.     if (this->wsk==NULL) return o1;
  42.     duzaLiczba wynik;
  43.     int add1,add2,add=0;
  44.     if (o1.size<this->size) wynik.size=this->size+1;
  45.     else wynik.size=o1.size+1;
  46.     int lo1=o1.size,lthis=this->size;
  47.     wynik.wsk=new char [wynik.size];
  48.    
  49.     for (int i=wynik.size-1; i>=0; i--)
  50.     {
  51.       if(lo1>0) add1=o1.wsk[lo1-1]-'0';
  52.       else add1=0;
  53.       if (lthis>0) add2=this->wsk[lthis-1]-'0';
  54.       else add2=0;
  55.       add1=add1+add2+add;
  56.       add=add1/10;
  57.       wynik.wsk[i]=add1%10+'0';
  58.       lo1--;
  59.       lthis--;
  60.     }
  61.     if (wynik.wsk[0]!='0')
  62.       return wynik;
  63.     duzaLiczba temp;
  64.     temp.size=wynik.size-1;
  65.     temp.wsk=new char[temp.size];
  66.     for (int i=0; i<temp.size; i++)
  67.       temp.wsk[i]=wynik.wsk[i+1];
  68.     wynik.~duzaLiczba();
  69.     return temp;
  70.   }
  71. };
  72.  
  73. class duzaLiczba2: public duzaLiczba
  74. {
  75.   public:
  76.   duzaLiczba2():duzaLiczba(){};
  77.   duzaLiczba2 (const duzaLiczba &o1):duzaLiczba(o1){}
  78.   duzaLiczba2 & operator = (const duzaLiczba2 &o1)
  79.   {
  80.     if (this==&o1) return *this;
  81.     if (this->wsk!=NULL) this->~duzaLiczba();
  82.     this->size=o1.size;
  83.     this->wsk=new char [size];
  84.     for (int i=0; i<o1.size; i++)
  85.       this->wsk[i]=o1.wsk[i];
  86.     return *this;
  87.   }
  88.  
  89.   duzaLiczba2 & operator * (const duzaLiczba2 &o1){
  90.     static duzaLiczba2 wynik;
  91.     if (o1.wsk==NULL || this->wsk==NULL){
  92.       return wynik;  
  93.     }
  94.     wynik.size=o1.size+this->size+1;
  95.     wynik.wsk=new char[wynik.size];
  96.     int i,j;
  97.     int mltp1,mltp2,add=0,add1;
  98.     for(int a=0;a<wynik.size;a++) wynik.wsk[a]='0';
  99.     if (o1.size>this->size){
  100.       cout<<this->wsk[0]<<endl;
  101.       for (i=1; i<=this->size;i++){
  102.         mltp1=this->wsk[this->size-i]-'0';
  103.         for (j=0; j<o1.size; j++){
  104.           mltp2=o1.wsk[o1.size-1-j]-'0';
  105.           add1=wynik.wsk[wynik.size-i-j]-'0';
  106.           add1=add1+mltp1*mltp2+add;
  107.           add=add1/10;
  108.           wynik.wsk[wynik.size-i-j]=add1%10+'0';
  109.         }
  110.         wynik.wsk[wynik.size-i-j]=add+'0';
  111.         add=0;
  112.       }
  113.     }
  114.     else {
  115.       for (i=1; i<=o1.size;i++){
  116.         mltp1=o1.wsk[o1.size-i]-'0';
  117.         for (j=0; j<this->size; j++){
  118.           mltp2=this->wsk[this->size-1-j]-'0';
  119.           add1=wynik.wsk[wynik.size-i-j]-'0';
  120.           add1=add1+mltp2*mltp1+add;
  121.           add=add1/10;
  122.           wynik.wsk[wynik.size-i-j]=add1%10+'0';
  123.         }
  124.         wynik.wsk[wynik.size-i-j]=add+'0';
  125.         add=0;
  126.       }
  127.      
  128.     }
  129.     int n=0;
  130.     while (true){
  131.       if (wynik.wsk[n]=='0') n++;
  132.       else break;
  133.     }
  134.     if (n==0) return wynik;
  135.     static duzaLiczba2 temp;
  136.     temp.size=wynik.size-n;
  137.     temp.wsk=new char[temp.size];
  138.     for (int t=0; t<temp.size;t++){
  139.       temp.wsk[t]=wynik.wsk[t+n];
  140.     }
  141.     wynik.~duzaLiczba2();
  142.     return temp;
  143.  
  144. }
  145.  
  146.   bool operator == (const duzaLiczba2 &o1)
  147.   {
  148.     if (this->size!=o1.size)
  149.       return false;
  150.     for (int i=0; i<o1.size; i++)
  151.     {
  152.       if (this->wsk[i]!=o1.wsk[i])
  153.         return false;
  154.     }
  155.     return true;
  156.   }
  157.  
  158.   bool operator != (const duzaLiczba2 &o1)
  159.   {
  160.     if (this->size!=o1.size)
  161.       return true;
  162.     for (int i=0; i<o1.size; i++)
  163.     {
  164.       if (this->wsk[i]!=o1.wsk[i])
  165.         return true;
  166.     }
  167.     return false;
  168.   }
  169.   bool operator > (const duzaLiczba2 &o1)
  170.   {
  171.     if (this->size>o1.size)
  172.       return true;
  173.     if (this->size<o1.size)
  174.       return false;
  175.     for (int i=0; i<o1.size; i++)
  176.     {
  177.       if (this->wsk[i]>o1.wsk[i])
  178.         return true;
  179.     }
  180.     return false;
  181.   }
  182.   bool operator < (const duzaLiczba2 &o1)
  183.   {
  184.     if (this->size<o1.size)
  185.       return true;
  186.     if (this->size>o1.size)
  187.       return false;
  188.     for (int i=0; i<o1.size; i++)
  189.     {
  190.       if (this->wsk[i]<o1.wsk[i])
  191.         return true;
  192.     }
  193.     return false;
  194.   }
  195. };
  196.  
  197.  
  198. ostream & operator << (ostream &s1, const duzaLiczba &o1)
  199. {
  200.   for (int i=0; i<o1.size; i++)
  201.     s1<<o1.wsk[i];
  202.   s1<<endl;
  203.   return s1;
  204. }
  205. istream & operator >> (istream &s1, duzaLiczba &o1)
  206. {
  207.   if (o1.wsk!=NULL)
  208.     o1.~duzaLiczba();
  209.   string a;
  210.   s1>>a;
  211.   o1.size=a.size();
  212.   o1.wsk=new char[o1.size];
  213.   for (int i=0; i<o1.size; i++)
  214.     o1.wsk[i]=a[i];
  215.   return s1;
  216. }
  217. int main()
  218. {
  219.   duzaLiczba2 o1, o2, o3, o4;
  220.   cin>>o1;
  221.   cin>>o2;
  222.   if (o1==o2) cout<<"Liczby są równe"<<endl;
  223.   if (o1!=o2) cout<<"Liczby nie są równe"<<endl;
  224.   if (o1>o2)  cout<<"Liczba pierwsza większa od drugiej"<<endl;
  225.   if (o1<o2)  cout<<"Liczba pierwsza mniejsza od drugiej"<<endl;
  226.  
  227.   o3=o1+o2;
  228.   cout<<o3;
  229.   o4=o1*o2;
  230.   cout<<o4;
  231.   return 0;
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement