码迷,mamicode.com
首页 > 其他好文 > 详细

ACM大数模板(支持正负整数)

时间:2014-10-01 02:13:30      阅读:286      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   使用   ar   for   sp   

之前就保留过简陋的几个用外部数组变量实现的简单大数模板,也没有怎么用过,今天就想着整合封装一下,封装成C++的类,以后需要调用的时候也方便得多。

 

实现了基本的加减乘除和取模运算的操作符重载,大数除以大数难度太大就没实现,另外还实现了比较运算符,方便实际使用贴近内置类型的体验。

话不多说,贴代码。

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <ctype.h>
  4 
  5 #define MAXBIT 1007
  6 #define BITTYPE int
  7 
  8 class BigInt {
  9 private:
 10     BITTYPE bit[MAXBIT];
 11     bool negative;//负数标志
 12 
 13 public:
 14     BigInt();                //默认构造函数,值为0
 15     BigInt(const int);        //构造函数
 16     BigInt(const char *);    //构造函数
 17     BigInt(const BigInt &);    //复制构造函数
 18     
 19     /*重载赋值运算符*/
 20     BigInt& operator=(const BigInt&);
 21     BigInt& operator=(const int        );
 22 
 23     /*重载算数运算符*/
 24     BigInt operator+(const BigInt&    )const;
 25     BigInt operator+(const int        )const;
 26     BigInt operator-(const BigInt&    )const;
 27     BigInt operator-(const int        )const;
 28     BigInt operator*(const BigInt&    )const;
 29     BigInt operator*(const int        )const;
 30     BigInt operator/(const int        )const;
 31     int    operator%(const int        )const;
 32     
 33     /*重载比较运算符*/
 34     bool operator>(const BigInt&    )const;
 35     bool operator>(const int        )const;
 36     bool operator>=(const BigInt&    )const;
 37     bool operator>=(const int        )const;
 38     bool operator<(const BigInt&    )const;
 39     bool operator<(const int        )const;
 40     bool operator<=(const BigInt&    )const;
 41     bool operator<=(const int        )const;
 42     bool operator==(const BigInt&    )const;
 43     bool operator==(const int        )const;
 44     bool operator!=(const BigInt&    )const;
 45     bool operator!=(const int        )const;
 46     
 47     void print()        const;//输出数值
 48     bool isZero()        const;//是否为0
 49     bool isPositive()    const;//是否为正数
 50     bool isNegative()    const;//是否为负数
 51     bool nonNegative()    const;//是否为非负数
 52 
 53 //private:
 54     BigInt opposite()const;//取相反数
 55     BigInt absoluteAdd(const BigInt&)const;//加上绝对值
 56     BigInt absoluteMinus(const BigInt&)const;//减去绝对值小于自身的数的绝对值
 57     bool   absoluteEqual(const BigInt&)const;//绝对值等于
 58     bool   absoluteGreater(const BigInt&)const;//绝对值大于
 59     bool   absoluteEqualGreater(const BigInt&)const;//绝对值大于等于
 60 };
 61 
 62 BigInt::BigInt()
 63 {
 64     memset(bit,0,sizeof(bit));
 65     negative = false;
 66 }
 67 
 68 BigInt::BigInt(const int n)
 69 {
 70     memset(bit,0,sizeof(bit));
 71     int nn = n;
 72     if (nn>=0) negative = false;
 73     else {
 74         negative = true;
 75         nn = -nn;
 76     }
 77     int pos = 0;
 78     while (nn) {
 79         bit[pos++] = nn % 10;
 80         nn /= 10;
 81     }
 82 }
 83 
 84 BigInt::BigInt(const char *s)
 85 {
 86     int len = strlen(s);
 87     bool valid = true;//符合数字格式
 88     if (len >= 2) {
 89         if (s[0]!=+ && s[0]!=- && !isdigit(s[0])) valid = false;
 90         for (int i=1; i<len; ++i) {
 91             if (!isdigit(s[i])) valid = false;
 92         }
 93     }
 94     else if (len == 1) {
 95         if (!isdigit(s[0])) valid = false;
 96     }
 97     if (len==0 || !valid) {
 98         memset(bit,0,sizeof(bit));
 99         negative = false;
100         return;
101     }
102     int beg = 0, end = len-1;
103     if (s[0] == +) {
104         negative = false;
105         ++beg;
106     }
107     else if (s[0] == -) {
108         bool zeroFlag = true;
109         for (int i=1; i<len; ++i) {
110             if (s[i]!=0) {
111                 zeroFlag = false;
112                 break;
113             }
114         }
115         if (zeroFlag) negative = false;
116         else negative = true;
117         ++beg;
118     }
119     else negative = false;
120     memset(bit,0,sizeof(bit));
121     for (int i=beg; i<=end; ++i) {
122         bit[len-1-i] = s[i] - 0;
123     }
124 }
125 
126 BigInt::BigInt(const BigInt& n)
127 {
128     memcpy(bit,n.bit,sizeof(bit));
129     negative = n.negative;
130 }
131 
132 BigInt& BigInt::operator=(const BigInt& n)
133 {
134     memcpy(bit,n.bit,sizeof(bit));
135     negative = n.negative;
136     return *this;
137 }
138 
139 BigInt& BigInt::operator=(const int n)
140 {
141     return *this = BigInt(n);
142 }
143 
144 BigInt BigInt::operator+(const BigInt& n)const
145 {
146     if ((!negative && !n.negative) || (negative && n.negative)) {
147         return this->absoluteAdd(n);
148     }
149     else {
150         if (absoluteEqual(n)) return BigInt();
151         else if (absoluteEqualGreater(n)) return this->absoluteMinus(n);
152         else return n.absoluteMinus(*this);
153     }
154 }
155 
156 BigInt BigInt::operator+(const int n)const
157 {
158     return *this + BigInt(n);
159 }
160 
161 BigInt BigInt::operator-(const BigInt& n)const
162 {
163     return *this + n.opposite();
164 }
165 
166 BigInt BigInt::operator-(const int n)const
167 {
168     return *this - BigInt(n);
169 }
170 
171 BigInt BigInt::operator*(const BigInt& n)const
172 {
173     if (isZero() || n.isZero()) return BigInt();
174     BigInt bi = BigInt();
175     if ((!negative && !n.negative) || (negative && n.negative)) {
176         bi.negative = false;
177     }
178     else bi.negative = true;
179     for (int i=0; i<MAXBIT; ++i) for (int j=0; j<MAXBIT-i; ++j) {
180         bi.bit[i+j] += bit[i] * n.bit[j];
181     }
182     for (int i=0; i<MAXBIT-1; ++i) {//进位
183         bi.bit[i+1] += bi.bit[i] / 10;
184         bi.bit[i] %= 10;
185     }
186     return bi;
187 }
188 
189 BigInt BigInt::operator*(const int n)const
190 {
191     return *this * BigInt(n);
192 }
193 
194 BigInt BigInt::operator/(const int n)const
195 {//除以0直接返回0
196     if (isZero() || n==0) return BigInt();
197     BigInt bi = BigInt();
198     if ((!negative && n>0) || (negative && n<0)) {
199         bi.negative = false;
200     }
201     else bi.negative = true;
202     int div = 0;//累计除数
203     for (int i=MAXBIT-1; i>=0; --i) {
204         div = div * 10 + bit[i];
205         bi.bit[i] = div / n;
206         div %= n;
207     }
208     return bi;
209 }
210 
211 int BigInt::operator%(const int n)const
212 {
213     int mod = 0;//累计余数
214     for (int i=MAXBIT-1; i>=0; --i) {
215         //mod = ((mod*(MAXBIT+1/*??*/)) + bit[i]) % n;
216         mod = ((mod*10) + bit[i]) % n;
217     }
218     return mod;
219 }
220 
221 bool BigInt::operator>(const BigInt& n)const
222 {
223     if (!negative && n.negative) return true;
224     else if (negative && !n.negative) return false;
225     else if (!negative && !n.negative) return absoluteGreater(n);
226     else return n.absoluteGreater(*this);
227 }
228 
229 bool BigInt::operator>(const int n)const
230 {
231     return *this > BigInt(n);
232 }
233 
234 bool BigInt::operator>=(const BigInt& n)const
235 {
236     if (!negative && n.negative) return true;
237     else if (negative && !n.negative) return false;
238     else if (!negative && !n.negative) return absoluteEqualGreater(n);
239     else return n.absoluteEqualGreater(*this);
240 }
241 
242 bool BigInt::operator>=(const int n)const
243 {
244     return *this >= BigInt(n);
245 }
246 
247 bool BigInt::operator<(const BigInt& n)const
248 {
249     return n > *this;
250 }
251 
252 bool BigInt::operator<(const int n)const
253 {
254     return *this < BigInt(n);
255 }
256 
257 bool BigInt::operator<=(const BigInt& n)const
258 {
259     return n >= *this;
260 }
261 
262 bool BigInt::operator<=(const int n)const
263 {
264     return *this <= BigInt(n);
265 }
266 
267 bool BigInt::operator==(const BigInt& n)const
268 {
269     if (negative != n.negative) return false;
270     for (int i=0; i<MAXBIT; ++i) {
271         if (bit[i] != n.bit[i]) return false;
272     }
273     return true;
274 }
275 
276 bool BigInt::operator==(const int n)const
277 {
278     return *this == BigInt(n);
279 }
280 
281 bool BigInt::operator!=(const BigInt& n)const
282 {
283     if (negative != n.negative) return true;
284     for (int i=0; i<MAXBIT; ++i) {
285         if (bit[i] != n.bit[i]) return true;
286     }
287     return false;
288 }
289 
290 bool BigInt::operator!=(const int n)const
291 {
292     return *this != BigInt(n);
293 }
294 
295 void BigInt::print()const
296 {
297     if (negative) printf("-");
298     int pos = MAXBIT - 1;
299     for (; pos>0; --pos) {
300         if (bit[pos]) break;
301     }
302     for (int i=pos; i>=0; --i) printf("%d",bit[i]);
303 }
304 
305 bool BigInt::isZero()const
306 {
307     bool zeroFlag = true;
308     for (int i=0; i<MAXBIT; ++i) {
309         if (bit[i] != 0) {
310             zeroFlag = false;
311             break;
312         }
313     }
314     return zeroFlag;
315 }
316 
317 bool BigInt::isPositive()const
318 {
319     return !negative && !isZero();
320 }
321 
322 bool BigInt::isNegative()const
323 {
324     return negative;
325 }
326 
327 bool BigInt::nonNegative()const
328 {
329     return !negative;
330 }
331 
332 BigInt BigInt::opposite()const
333 {
334     BigInt n(*this);
335     if (!n.isZero()) n.negative = !n.negative;
336     return n;
337 }
338 
339 BigInt BigInt::absoluteAdd(const BigInt& n)const
340 {
341     BigInt bi(*this);
342     int next = 0;//进位
343     for (int i=0; i<MAXBIT; ++i) {
344         bi.bit[i] = (bit[i] + n.bit[i] + next) % 10;
345         next   = (bit[i] + n.bit[i] + next) / 10;
346     }
347     return bi;
348 }
349 
350 BigInt BigInt::absoluteMinus(const BigInt& n)const
351 {
352     BigInt bi(*this);
353     for (int i=MAXBIT-1; i>=0; --i) {
354         if (bi.bit[i]>=n.bit[i]) bi.bit[i] -= n.bit[i];
355         else {//借位
356             int borrow = i + 1;//借位位
357             while (bi.bit[borrow]==0) ++borrow;
358             --bi.bit[borrow];
359             for (int j=i+1; j<borrow; ++j) bi.bit[j] = 9;
360             bi.bit[i] = bi.bit[i] + 10 - n.bit[i];
361         }
362     }
363     return bi;
364 }
365 
366 bool BigInt::absoluteEqual(const BigInt& n)const
367 {
368     for (int i=0; i<MAXBIT; ++i) {
369         if (bit[i] != n.bit[i]) return false;
370     }
371     return true;
372 }
373 
374 bool BigInt::absoluteGreater(const BigInt& n)const
375 {
376     for (int i=MAXBIT-1; i>=0; --i) {
377         if (bit[i]>n.bit[i]) return true;
378         else if (bit[i]<n.bit[i]) return false;
379     }
380     return false;
381 }
382 
383 bool BigInt::absoluteEqualGreater(const BigInt& n)const
384 {
385     for (int i=MAXBIT-1; i>=0; --i) {
386         if (bit[i]>n.bit[i]) return true;
387         else if (bit[i]<n.bit[i]) return false;
388     }
389     return true;
390 }

 

模板写成后特地去poj刷了大数相加和大数相乘两道水题,一次ac的满足感可是刚刚的~

 

欢迎大家参考,测试,批评指正bug和不足之处,感谢~

ACM大数模板(支持正负整数)

标签:style   blog   color   io   os   使用   ar   for   sp   

原文地址:http://www.cnblogs.com/huanglianjing/p/4002872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!