Advertisement
Guest User

Untitled

a guest
Nov 25th, 2010
1,966
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <vector>
  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.  
  29. public:
  30.     integer(int i){
  31.         if(negative = i < 0) digit.push_back(-i);
  32.         else digit.push_back(i);
  33.     }
  34.     integer(){}
  35.    
  36.     friend integer operator * (const integer&, const integer&);
  37.     friend integer operator + (integer, integer);
  38.     friend integer operator - (integer, integer);
  39.     friend std::ostream& operator << (std::ostream&, const integer&);
  40.     friend std::istream& operator >> (std::istream&, integer&);
  41.     friend bool operator == (const integer&, const integer&);
  42.     friend bool operator != (const integer&, const integer&);
  43.     friend bool operator > (const integer&, const integer&);
  44.     friend bool operator <= (const integer&, const integer&);
  45.     friend bool operator < (const integer&, const integer&);
  46.     friend bool operator >= (const integer&, const integer&);
  47.  
  48.     integer operator = (const integer& i){
  49.         digit = i.digit;
  50.         negative = i.negative;
  51.         return i;
  52.     }
  53.  
  54.     integer operator += (const integer& i){
  55.         *this = *this + i;
  56.         return *this;
  57.     }
  58.     integer operator -= (const integer& i){
  59.         *this = *this - i;
  60.         return *this;
  61.     }
  62.    
  63.     integer operator *= (const integer& i){
  64.         *this = *this * i;
  65.         return *this;
  66.     }
  67.  
  68.     integer operator -(){
  69.         integer i = *this;
  70.         i.negative = !i.negative;
  71.         return i;
  72.     }
  73. };
  74.  
  75. integer operator + (integer a, integer b){
  76.     if(a.negative == b.negative){
  77.         for(unsigned int k = 0; k < b.digit.size(); k++)
  78.             a.add(k, b.digit[k]);
  79.     }else{
  80.         if(b.abs_greater(a)) std::swap(a, b);
  81.         for(unsigned int k = 0; k < b.digit.size(); k++)
  82.             a.sub(k, b.digit[k]);
  83.     }
  84.     return a;
  85. }
  86. integer operator - (integer a, integer b){
  87.     return a + (-b);
  88. }
  89.  
  90. integer operator * (const integer& a, const integer& b){
  91.     integer r;
  92.     r.negative = a.negative ^ b.negative;
  93.  
  94.     for(unsigned int j = 0; j < a.digit.size(); j++)
  95.         for(unsigned int k = 0; k < b.digit.size(); k++){
  96.             unsigned long long int val = a.digit[j];
  97.             val *= b.digit[k];
  98.             if(val >> 32 > 0)
  99.                 r.add(j+k+1, val>>32);
  100.             r.add(j+k, (unsigned int)val);
  101.         }
  102.     return r;
  103. }
  104.  
  105. bool operator == (const integer& a, const integer& b){
  106.     if(a.negative != b.negative || a.digit.size() != b.digit.size()) return false;
  107.    
  108.     for(int i = a.digit.size() -1; i >= 0; i--)
  109.         if(a.digit[i] != b.digit[i]) return false;
  110.    
  111.     return true;
  112. }
  113. bool operator != (const integer& a, const integer& b){
  114.     return !(a==b);
  115. }
  116. bool operator > (const integer& a, const integer& b){
  117.     if(a.negative ^ b.negative) return !a.negative;
  118.     return a.abs_greater(b) ^ a.negative;
  119. }
  120. bool operator < (const integer& a, const integer& b){
  121.     return !(a>b || a==b);
  122. }
  123. bool operator >= (const integer& a, const integer& b){
  124.     return a>b || a==b;
  125. }
  126. bool operator <= (const integer& a, const integer& b){
  127.     return !(a>b);
  128. }
  129.  
  130.  
  131. std::ostream& operator << (std::ostream& out, const integer& i){
  132.     const char d[] = "0123456789abcdef";
  133.  
  134.     if(i.negative) out.put('-');
  135.     bool first = true;
  136.     for(int k = i.digit.size() -1; k >= 0; k--){
  137.         for(int j = 8-1; j >= 0; j--){
  138.             char ch = (i.digit[k] >> j*4) & 0xf;
  139.             if(ch != 0) first = false;
  140.             if(!first || ch != 0) out.put( d[ch] );
  141.         }
  142.     }
  143.  
  144.     return out;
  145. }
  146.  
  147. std::istream& operator >> (std::istream& in, integer& i){
  148.     in >> std::ws;
  149.     std::vector<char> vec;
  150.    
  151.     i.negative = 0;
  152.     if(in.peek() == '-') i.negative = 1;
  153.     if(in.peek() == '+' || in.peek() == '-') in.get();
  154.  
  155.     while(1){
  156.         char c = in.peek(), i;
  157.         if(c >= '0' && c <= '9') i = c - '0';
  158.         else if(c >= 'a' && c <= 'f') i = c - 'a' + 10;
  159.         else if(c >= 'A' && c <= 'F') i = c - 'A' + 10;
  160.         else break;
  161.  
  162.         in.get();
  163.         vec.push_back(i);
  164.     }
  165.  
  166.     i.digit.clear();
  167.     for(int k = vec.size() -1, m = 0, s = 0; k >= 0; k--){
  168.         s += vec[k] << m*4;
  169.        
  170.         if(m == 7 || k == 0){
  171.             i.digit.push_back(s);
  172.             s = m = 0;
  173.         }else m++; 
  174.     }
  175.  
  176.     return in;
  177. }
  178.  
  179. int main(){
  180.     integer i = 1;
  181.     integer j;
  182.     std::cout << "Enter a number.\nnote: use base 16. do not add 0x.\n";
  183.     std::cin >> j;
  184.     for(integer k = j; k > 0; k -= 1) i *= k;
  185.  
  186.     std::cout << j << "! = " << i;
  187.  
  188.     std::cin.ignore().get();
  189.     return 0;
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement