Guest User

Untitled

a guest
Dec 15th, 2010
459
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.14 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4.  
  5. struct integer{
  6. private:
  7.     bool negative;
  8.     std::vector<unsigned int> digit;
  9.  
  10.     void add(unsigned int pos, unsigned int val){
  11.         if(pos >= digit.size()) digit.insert(digit.end(), pos-digit.size()+1, 0);
  12.         if(digit[pos] > (unsigned int)(0-val)) add(pos+1, 1);
  13.         digit[pos] += val;
  14.     }
  15.     void sub(unsigned int pos, unsigned int val){
  16.         if(digit[pos] < val) sub(pos+1, 1);
  17.         digit[pos] -= val;
  18.         if(digit[pos] == 0 && pos+1 == digit.size() && pos != 0) digit.pop_back();
  19.     }
  20.     bool abs_greater(const integer& i) const{
  21.         if(digit.size() != i.digit.size()) return digit.size() > i.digit.size();
  22.        
  23.         for(int k = digit.size()-1; k >= 0; k--)
  24.             if(digit[k] != i.digit[k]) return digit[k] > i.digit[k];
  25.        
  26.         return 0;
  27.     }
  28.     integer& shift(unsigned i){
  29.         digit.insert(digit.begin(), i, 0);
  30.         return *this;
  31.     }
  32.     std::pair<integer, integer> div(const integer& i) const{
  33.         std::pair<integer, integer> p(0, *this);
  34.         p.second.negative ^= i.negative;
  35.    
  36.         while(!i.abs_greater(p.second)){
  37.             int s = p.second.digit.size() - i.digit.size();
  38.             int k = p.second.digit.back()/(i.digit.back()+1);
  39.             if(k == 0) k = 1;
  40.            
  41.             p.second -= (i*k).shift(s);
  42.             p.first += integer(k).shift(s);
  43.         }
  44.         return p;
  45.     }
  46.  
  47. public:
  48.     int to_int() const{
  49.         return digit.size() > 0 ? digit[0] : 0;
  50.     }
  51.     integer(int i){
  52.         digit.clear();
  53.         if(negative = i < 0) digit.push_back(-i);
  54.         else digit.push_back(i);
  55.     }
  56.     integer(){}
  57.    
  58.     friend std::ostream& operator << (std::ostream&, integer);
  59.     friend std::istream& operator >> (std::istream&, integer&);
  60.     friend bool operator == (const integer&, const integer&);
  61.     friend bool operator != (const integer&, const integer&);
  62.     friend bool operator > (const integer&, const integer&);
  63.     friend bool operator <= (const integer&, const integer&);
  64.     friend bool operator < (const integer&, const integer&);
  65.     friend bool operator >= (const integer&, const integer&);
  66.  
  67.     integer operator = (const integer& i){
  68.         digit = i.digit;
  69.         negative = i.negative;
  70.         return i;
  71.     }
  72.  
  73.     integer operator += (const integer& i){
  74.         if(negative == i.negative){
  75.             for(unsigned int k = 0; k < i.digit.size(); k++)
  76.                 add(k, i.digit[k]);
  77.         }else{
  78.             if(i.abs_greater(*this)) *this = i - *this;
  79.             else for(unsigned int k = 0; k < i.digit.size(); k++)
  80.                     sub(k, i.digit[k]);
  81.         }
  82.         return *this;
  83.     }
  84.     integer operator + (const integer& i) const{
  85.         integer tmp = *this;
  86.         return tmp += i;
  87.     }
  88.    
  89.     integer operator -= (const integer& i){
  90.         return *this += -i;
  91.     }
  92.     integer operator - (const integer& i) const{
  93.         integer tmp = *this;
  94.         return tmp -= i;
  95.     }
  96.    
  97.     integer operator * (const integer& i)const{
  98.         integer r = 0;
  99.         r.negative = negative ^ i.negative;
  100.    
  101.         for(unsigned int j = 0; j < digit.size(); j++)
  102.             for(unsigned int k = 0; k < i.digit.size(); k++){
  103.                 unsigned long long int val = digit[j];
  104.                 val *= i.digit[k];
  105.                 if(val >> 32 > 0)
  106.                     r.add(j+k+1, val>>32);
  107.                 r.add(j+k, (unsigned int)val);
  108.             }
  109.         return r;
  110.     }
  111.     integer operator *= (const integer& i){
  112.         *this = *this * i;
  113.         return *this;
  114.     }
  115.    
  116.     integer operator / (const integer& i) const{
  117.         return div(i).first;
  118.     }
  119.     integer operator /= (const integer& i){
  120.         *this = *this / i;
  121.         return *this;
  122.     }
  123.    
  124.     integer operator % (const integer& i) const{
  125.         return div(i).second;
  126.     }
  127.     integer operator %= (const integer& i){
  128.         *this = *this % i;
  129.         return *this;
  130.     }
  131.  
  132.     integer operator -() const{
  133.         integer i = *this;
  134.         i.negative ^= 1;
  135.         return i;
  136.     }
  137. };
  138.  
  139. bool operator == (const integer& a, const integer& b){
  140.     if(a.negative != b.negative || a.digit.size() != b.digit.size()) return false;
  141.    
  142.     for(int i = a.digit.size() -1; i >= 0; i--)
  143.         if(a.digit[i] != b.digit[i]) return false;
  144.    
  145.     return true;
  146. }
  147. bool operator != (const integer& a, const integer& b){
  148.     return !(a==b);
  149. }
  150. bool operator > (const integer& a, const integer& b){
  151.     if(a.negative ^ b.negative) return !a.negative;
  152.     return a.abs_greater(b) ^ a.negative;
  153. }
  154. bool operator < (const integer& a, const integer& b){
  155.     return !(a>b || a==b);
  156. }
  157. bool operator >= (const integer& a, const integer& b){
  158.     return a>b || a==b;
  159. }
  160. bool operator <= (const integer& a, const integer& b){
  161.     return !(a>b);
  162. }
  163.  
  164. std::ostream& operator << (std::ostream& out, integer i){
  165.     std::string str;
  166.     if(i == 0) return out << 0;
  167.     while(i > 0){
  168.         str = char((i % 10).to_int()+'0') + str;
  169.         i /= 10;
  170.     }
  171.     return out << str;
  172. }
  173.  
  174. std::istream& operator >> (std::istream& in, integer& i){
  175.     std::string str;
  176.     in >> str;
  177.     integer p = 1;
  178.     i = 0;
  179.     for(int j = str.length()-1; j >= 0; j--){
  180.         i += integer(str[j]-'0')*p;
  181.         p *= 10;
  182.     }
  183.     return in;
  184. }
  185.  
  186. int main(){
  187.     integer i, j;
  188.     std::cout << "Enter two numbers.\n";
  189.     std::cout << "a = ";
  190.     std::cin >> i;
  191.     std::cout << "b = ";
  192.     std::cin >> j;
  193.  
  194.     std::cout << "a/b = " << i/j;
  195.  
  196.     std::cin.ignore().get();
  197.     return 0;
  198. }
Advertisement
Add Comment
Please, Sign In to add comment