Check out the Pastebin Gadgets Shop. We have thousands of fun, geeky & affordable gadgets on sale :-)Want more features on Pastebin? Sign Up, it's FREE!
tweet

# Untitled

By: a guest on Nov 25th, 2010  |  syntax: C++  |  size: 4.69 KB  |  views: 1,000  |  expires: Never
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++)
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)
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
Top