Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Untitled

By: a guest on Nov 26th, 2010  |  syntax: C++  |  size: 5.51 KB  |  views: 356  |  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. #define DEC
  6.  
  7. struct integer{
  8. private:
  9.         bool negative;
  10.         std::vector<char> digit;
  11.  
  12.         void add(unsigned int pos, unsigned int val){
  13.                 if(pos >= digit.size()) digit.insert(digit.end(), pos-digit.size()+1, 0);
  14. #ifdef DEC
  15.                 if(digit[pos] + val >= 10){
  16.                         add(pos+1, 1);
  17.                         digit[pos] += val-10;
  18.                 }else digit[pos] += val;
  19. #else
  20.                 if(digit[pos] > (unsigned int)(0-val)) add(pos+1, 1);
  21.                 digit[pos] += val;
  22. #endif
  23.         }
  24.         void sub(unsigned int pos, unsigned int val){
  25. #ifdef DEC
  26.                 if(digit[pos] < val){
  27.                         sub(pos+1, 1);
  28.                         digit[pos] -= val-10;
  29.                 }else digit[pos] -= val;
  30. #else
  31.                 if(digit[pos] < val) sub(pos+1, 1);
  32.                 digit[pos] -= val;
  33. #endif
  34.  
  35.                 if(digit[pos] == 0 && pos+1 == digit.size()) digit.pop_back();
  36.         }
  37.         bool abs_greater(const integer& i) const{
  38.                 if(digit.size() != i.digit.size()) return digit.size() > i.digit.size();
  39.                
  40.                 for(int k = digit.size()-1; k >= 0; k--)
  41.                         if(digit[k] != i.digit[k]) return digit[k] > i.digit[k];
  42.                
  43.                 return 0;
  44.         }
  45.  
  46. public:
  47.         integer(int i){
  48.                 if(negative = i < 0) digit.push_back(-i);
  49.                 else digit.push_back(i);
  50.         }
  51.         integer(){}
  52.        
  53.         friend integer operator * (const integer&, const integer&);
  54.         friend integer operator + (integer, integer);
  55.         friend integer operator - (integer, integer);
  56.         friend std::ostream& operator << (std::ostream&, const integer&);
  57.         friend std::istream& operator >> (std::istream&, integer&);
  58.         friend bool operator == (const integer&, const 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.  
  65.         integer operator = (const integer& i){
  66.                 digit = i.digit;
  67.                 negative = i.negative;
  68.                 return i;
  69.         }
  70.  
  71.         integer operator += (const integer& i){
  72.                 *this = *this + i;
  73.                 return *this;
  74.         }
  75.         integer operator -= (const integer& i){
  76.                 *this = *this - i;
  77.                 return *this;
  78.         }
  79.        
  80.         integer operator *= (const integer& i){
  81.                 *this = *this * i;
  82.                 return *this;
  83.         }
  84.  
  85.         integer operator /= (const integer& i){
  86.                 *this = *this / i;
  87.                 return *this;
  88.         }
  89.  
  90.         integer operator -(){
  91.                 integer i = *this;
  92.                 i.negative = !i.negative;
  93.                 return i;
  94.         }
  95. };
  96.  
  97. integer operator + (integer a, integer b){
  98.         if(a.negative == b.negative){
  99.                 for(unsigned int k = 0; k < b.digit.size(); k++)
  100.                         a.add(k, b.digit[k]);
  101.         }else{
  102.                 if(b.abs_greater(a)) std::swap(a, b);
  103.                 for(unsigned int k = 0; k < b.digit.size(); k++)
  104.                         a.sub(k, b.digit[k]);
  105.         }
  106.         return a;
  107. }
  108. integer operator - (integer a, integer b){
  109.         return a + (-b);
  110. }
  111.  
  112. integer operator * (const integer& a, const integer& b){
  113.         integer r;
  114.         r.negative = a.negative ^ b.negative;
  115.  
  116.         for(unsigned int j = 0; j < a.digit.size(); j++)
  117.                 for(unsigned int k = 0; k < b.digit.size(); k++){
  118. #ifdef DEC
  119.                         char val = a.digit[j]*b.digit[k];
  120.                         if(val >= 10) r.add(j+k+1, val/10);
  121.                         r.add(j+k, val%10);
  122. #else
  123.                         unsigned long long int val = a.digit[j];
  124.                         val *= b.digit[k];
  125.                
  126.                         if(val >> 32 > 0)
  127.                                 r.add(j+k+1, val>>32);
  128.                         r.add(j+k, (unsigned int)val);
  129. #endif
  130.                        
  131.                 }
  132.         return r;
  133. }
  134.  
  135. bool operator == (const integer& a, const integer& b){
  136.         if(a.negative != b.negative || a.digit.size() != b.digit.size()) return false;
  137.        
  138.         for(int i = a.digit.size() -1; i >= 0; i--)
  139.                 if(a.digit[i] != b.digit[i]) return false;
  140.        
  141.         return true;
  142. }
  143. bool operator != (const integer& a, const integer& b){
  144.         return !(a==b);
  145. }
  146. bool operator > (const integer& a, const integer& b){
  147.         if(a.negative ^ b.negative) return !a.negative;
  148.         return a.abs_greater(b) ^ a.negative;
  149. }
  150. bool operator < (const integer& a, const integer& b){
  151.         return !(a>b || a==b);
  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);
  158. }
  159.  
  160.  
  161. std::ostream& operator << (std::ostream& out, const integer& i){
  162.         if(i.negative) out.put('-');
  163. #ifdef DEC
  164.         for(int k = i.digit.size() -1; k >= 0; k--) out.put('0'+i.digit[k]);
  165.         if(i.digit.size() == 0) out.put('0');
  166. #else
  167.         const char d[] = "0123456789abcdef";
  168.  
  169.         bool first = true;
  170.         for(int k = i.digit.size() -1; k >= 0; k--){
  171.                 for(int j = 8-1; j >= 0; j--){
  172.                         char ch = (i.digit[k] >> j*4) & 0xf;
  173.                         if(ch != 0) first = false;
  174.                         if(!first || ch != 0) out.put( d[ch] );
  175.                 }
  176.         }
  177. #endif
  178.         return out;
  179. }
  180.  
  181. std::istream& operator >> (std::istream& in, integer& i){
  182.         in >> std::ws;
  183.  
  184.         i.negative = 0;
  185.         if(in.peek() == '-') i.negative = 1;
  186.         if(in.peek() == '+' || in.peek() == '-') in.get();
  187. #ifdef DEC
  188.         while(1){
  189.                 char c = in.peek();
  190.                 if(c >= '0' && c <= '9') i.digit.push_back(in.get() - '0');
  191.                 else break;
  192.         }
  193.         for(int k = 0; k*2 < i.digit.size()-1; k++) std::swap(i.digit[k], i.digit[i.digit.size()-1-k]);
  194. #else
  195.         std::vector<char> vec;
  196.  
  197.         while(1){
  198.                 char c = in.peek(), i;
  199.                 if(c >= '0' && c <= '9') i = c - '0';
  200.                 else if(c >= 'a' && c <= 'f') i = c - 'a' + 10;
  201.                 else if(c >= 'A' && c <= 'F') i = c - 'A' + 10;
  202.                 else break;
  203.  
  204.                 in.get();
  205.                 vec.push_back(i);
  206.         }
  207.  
  208.         i.digit.clear();
  209.         for(int k = vec.size() -1, m = 0, s = 0; k >= 0; k--){
  210.                 s += vec[k] << m*4;
  211.                
  212.                 if(m == 7 || k == 0){
  213.                         i.digit.push_back(s);
  214.                         s = m = 0;
  215.                 }else m++;     
  216.         }
  217. #endif
  218.         return in;
  219. }
  220.  
  221. int main(){
  222.         integer i = 1;
  223.         integer j;
  224.  
  225.         std::cout << "Enter a decimal number.\n";
  226.         std::cin >> j;
  227.  
  228.         for(integer k = j; k > 0; k -= 1) i *= k;
  229.  
  230.         std::cout << j << "! = " << i;
  231.         std::cin.ignore().get();
  232.         return 0;
  233. }