Want more features on Pastebin? Sign Up, it's FREE!
Guest

Untitled

By: a guest on Nov 25th, 2010  |  syntax: C++  |  size: 4.69 KB  |  views: 703  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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. }
clone this paste RAW Paste Data