Advertisement
Guest User

Untitled

a guest
Dec 8th, 2010
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.66 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()) 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[0];
  50.     }
  51.     integer(int i){
  52.         if(negative = i < 0) digit.push_back(-i);
  53.         else digit.push_back(i);
  54.     }
  55.     integer(){}
  56.    
  57.     friend std::ostream& operator << (std::ostream&, const integer&);
  58.     friend std::istream& operator >> (std::istream&, integer&);
  59.     friend bool operator == (const integer&, const 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.  
  66.     integer operator = (const integer& i){
  67.         digit = i.digit;
  68.         negative = i.negative;
  69.         return i;
  70.     }
  71.  
  72.     integer operator += (const integer& i){
  73.         if(negative == i.negative){
  74.             for(unsigned int k = 0; k < i.digit.size(); k++)
  75.                 add(k, i.digit[k]);
  76.         }else{
  77.             if(i.abs_greater(*this)) *this = i - *this;
  78.             else for(unsigned int k = 0; k < i.digit.size(); k++)
  79.                     sub(k, i.digit[k]);
  80.         }
  81.         return *this;
  82.     }
  83.     integer operator + (const integer& i) const{
  84.         integer tmp = *this;
  85.         return tmp += i;
  86.     }
  87.    
  88.     integer operator -= (const integer& i){
  89.         return *this += -i;
  90.     }
  91.     integer operator - (const integer& i) const{
  92.         integer tmp = *this;
  93.         return tmp -= i;
  94.     }
  95.    
  96.     integer operator * (const integer& i)const{
  97.         integer r;
  98.         r.negative = negative ^ i.negative;
  99.    
  100.         for(unsigned int j = 0; j < digit.size(); j++)
  101.             for(unsigned int k = 0; k < i.digit.size(); k++){
  102.                 unsigned long long int val = digit[j];
  103.                 val *= i.digit[k];
  104.                 if(val >> 32 > 0)
  105.                     r.add(j+k+1, val>>32);
  106.                 r.add(j+k, (unsigned int)val);
  107.             }
  108.         return r;
  109.     }
  110.     integer operator *= (const integer& i){
  111.         *this = *this * i;
  112.         return *this;
  113.     }
  114.    
  115.     integer operator / (const integer& i) const{
  116.         return div(i).first;
  117.     }
  118.     integer operator /= (const integer& i){
  119.         *this = *this / i;
  120.         return *this;
  121.     }
  122.    
  123.     integer operator % (const integer& i) const{
  124.         return div(i).second;
  125.     }
  126.     integer operator %= (const integer& i){
  127.         *this = *this % i;
  128.         return *this;
  129.     }
  130.  
  131.     integer operator -() const{
  132.         integer i = *this;
  133.         i.negative = !i.negative;
  134.         return i;
  135.     }
  136. };
  137.  
  138. bool operator == (const integer& a, const integer& b){
  139.     if(a.negative != b.negative || a.digit.size() != b.digit.size()) return false;
  140.    
  141.     for(int i = a.digit.size() -1; i >= 0; i--)
  142.         if(a.digit[i] != b.digit[i]) return false;
  143.    
  144.     return true;
  145. }
  146. bool operator != (const integer& a, const integer& b){
  147.     return !(a==b);
  148. }
  149. bool operator > (const integer& a, const integer& b){
  150.     if(a.negative ^ b.negative) return !a.negative;
  151.     return a.abs_greater(b) ^ a.negative;
  152. }
  153. bool operator < (const integer& a, const integer& b){
  154.     return !(a>b || a==b);
  155. }
  156. bool operator >= (const integer& a, const integer& b){
  157.     return a>b || a==b;
  158. }
  159. bool operator <= (const integer& a, const integer& b){
  160.     return !(a>b);
  161. }
  162.  
  163.  
  164. std::ostream& operator << (std::ostream& out, const integer& i){
  165.     const char d[] = "0123456789abcdef";
  166.  
  167.     if(i.negative) out.put('-');
  168.     bool first = true;
  169.     for(int k = i.digit.size() -1; k >= 0; k--){
  170.         for(int j = 8-1; j >= 0; j--){
  171.             char ch = (i.digit[k] >> j*4) & 0xf;
  172.             if(ch != 0) first = false;
  173.             if(!first || ch != 0) out.put( d[ch] );
  174.         }
  175.     }
  176. }
  177.  
  178. std::istream& operator >> (std::istream& in, integer& i){
  179.     in >> std::ws;
  180.     std::vector<char> vec;
  181.    
  182.     i.negative = 0;
  183.     if(in.peek() == '-') i.negative = 1;
  184.     if(in.peek() == '+' || in.peek() == '-') in.get();
  185.  
  186.     while(1){
  187.         char c = in.peek(), i;
  188.         if(c >= '0' && c <= '9') i = c - '0';
  189.         else if(c >= 'a' && c <= 'f') i = c - 'a' + 10;
  190.         else if(c >= 'A' && c <= 'F') i = c - 'A' + 10;
  191.         else break;
  192.  
  193.         in.get();
  194.         vec.push_back(i);
  195.     }
  196.  
  197.     i.digit.clear();
  198.     for(int k = vec.size() -1, m = 0, s = 0; k >= 0; k--){
  199.         s += vec[k] << m*4;
  200.        
  201.         if(m == 7 || k == 0){
  202.             i.digit.push_back(s);
  203.             s = m = 0;
  204.         }else m++; 
  205.     }
  206.  
  207.     return in;
  208. }
  209.  
  210. int main(){
  211.     integer i, j;
  212.     std::cout << "Enter two numbers.\nnote: use base 16. do not add 0x.\n";
  213.     std::cout << "a = ";
  214.     std::cin >> i;
  215.     std::cout << "b = ";
  216.     std::cin >> j;
  217.  
  218.     std::cout << "a/b = " << i/j;
  219.  
  220.     std::cin.ignore().get();
  221.     return 0;
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement