Advertisement
wilk_maciej

duze_liczby2

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