Advertisement
Guest User

Untitled

a guest
Nov 26th, 2010
1,111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.51 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement