您的位置:首页 > 编程语言 > C语言/C++

C++ BigInteger模板

2016-01-06 15:37 351 查看
1 #include <cstdio>
2 #include <cstring>
3 #include <string>
4 #include <iostream>
5 #include <iomanip>
6 #include <algorithm>
7 using namespace std;
8
9 #define MAXN 9999
10 #define MAXSIZE 10
11 #define DLEN 4
12 const long long MOD = 258280327;
13 class BigInteger
14 {
15 private:
16     int a[3000];    //可以控制大数的位数
17     int len;       //大数长度
18 public:
19     BigInteger(){ len = 1; memset(a, 0, sizeof(a)); }   //构造函数
20     BigInteger(const int);       //将一个int类型的变量转化为大数
21     BigInteger(const char*);     //将一个字符串类型的变量转化为大数
22     BigInteger(const BigInteger &);  //拷贝构造函数
23     BigInteger &operator=(const BigInteger &);   //重载赋值运算符,大数之间进行赋值运算
24
25     friend istream& operator>>(istream&, BigInteger&);   //重载输入运算符
26     friend ostream& operator<<(ostream&, BigInteger&);   //重载输出运算符
27
28     BigInteger operator+(const BigInteger &) const;   //重载加法运算符,两个大数之间的相加运算
29     BigInteger operator-(const BigInteger &) const;   //重载减法运算符,两个大数之间的相减运算
30     BigInteger operator*(const BigInteger &) const;   //重载乘法运算符,两个大数之间的相乘运算
31     BigInteger operator/(const int   &) const;    //重载除法运算符,大数对一个整数进行相除运算
32
33     BigInteger operator^(const int  &) const;    //大数的n次方运算
34     long long    operator%(const long long  &) const;    //大数对一个int类型的变量进行取模运算
35     bool   operator>(const BigInteger & T)const;   //大数和另一个大数的大小比较
36     bool   operator>(const int & t)const;      //大数和一个int类型的变量的大小比较
37
38     void print();       //输出大数
39 };
40 BigInteger::BigInteger(const int b)     //将一个int类型的变量转化为大数
41 {
42     int c, d = b;
43     len = 0;
44     memset(a, 0, sizeof(a));
45     while (d > MAXN)
46     {
47         c = d - (d / (MAXN + 1)) * (MAXN + 1);
48         d = d / (MAXN + 1);
49         a[len++] = c;
50     }
51     a[len++] = d;
52 }
53 BigInteger::BigInteger(const char*s)     //将一个字符串类型的变量转化为大数
54 {
55     int t, k, index, l, i;
56     memset(a, 0, sizeof(a));
57     l = strlen(s);
58     len = l / DLEN;
59     if (l%DLEN)
60         len++;
61     index = 0;
62     for (i = l - 1; i >= 0; i -= DLEN)
63     {
64         t = 0;
65         k = i - DLEN + 1;
66         if (k<0)
67             k = 0;
68         for (int j = k; j <= i; j++)
69             t = t * 10 + s[j] - '0';
70         a[index++] = t;
71     }
72 }
73 BigInteger::BigInteger(const BigInteger & T) : len(T.len)  //拷贝构造函数
74 {
75     int i;
76     memset(a, 0, sizeof(a));
77     for (i = 0; i < len; i++)
78         a[i] = T.a[i];
79 }
80 BigInteger & BigInteger::operator=(const BigInteger & n)   //重载赋值运算符,大数之间进行赋值运算
81 {
82     int i;
83     len = n.len;
84     memset(a, 0, sizeof(a));
85     for (i = 0; i < len; i++)
86         a[i] = n.a[i];
87     return *this;
88 }
89 istream& operator>>(istream & in, BigInteger & b)   //重载输入运算符
90 {
91     char ch[MAXSIZE * 4];
92     int i = -1;
93     in >> ch;
94     int l = strlen(ch);
95     int count = 0, sum = 0;
96     for (i = l - 1; i >= 0;)
97     {
98         sum = 0;
99         int t = 1;
100         for (int j = 0; j<4 && i >= 0; j++, i--, t *= 10)
101         {
102             sum += (ch[i] - '0')*t;
103         }
104         b.a[count] = sum;
105         count++;
106     }
107     b.len = count++;
108     return in;
109
110 }
111 ostream& operator<<(ostream& out, BigInteger& b)   //重载输出运算符
112 {
113     int i;
114     cout << b.a[b.len - 1];
115     for (i = b.len - 2; i >= 0; i--)
116     {
117         cout.width(DLEN);
118         cout.fill('0');
119         cout << b.a[i];
120     }
121     return out;
122 }
123
124 BigInteger BigInteger::operator+(const BigInteger & T) const   //两个大数之间的相加运算
125 {
126     BigInteger t(*this);
127     int i, big;      //位数
128     big = T.len > len ? T.len : len;
129     for (i = 0; i < big; i++)
130     {
131         t.a[i] += T.a[i];
132         if (t.a[i] > MAXN)
133         {
134             t.a[i + 1]++;
135             t.a[i] -= MAXN + 1;
136         }
137     }
138     if (t.a[big] != 0)
139         t.len = big + 1;
140     else
141         t.len = big;
142     return t;
143 }
144 BigInteger BigInteger::operator-(const BigInteger & T) const   //两个大数之间的相减运算
145 {
146     int i, j, big;
147     bool flag;
148     BigInteger t1, t2;
149     if (*this>T)
150     {
151         t1 = *this;
152         t2 = T;
153         flag = 0;
154     }
155     else
156     {
157         t1 = T;
158         t2 = *this;
159         flag = 1;
160     }
161     big = t1.len;
162     for (i = 0; i < big; i++)
163     {
164         if (t1.a[i] < t2.a[i])
165         {
166             j = i + 1;
167             while (t1.a[j] == 0)
168                 j++;
169             t1.a[j--]--;
170             while (j > i)
171                 t1.a[j--] += MAXN;
172             t1.a[i] += MAXN + 1 - t2.a[i];
173         }
174         else
175             t1.a[i] -= t2.a[i];
176     }
177     t1.len = big;
178     while (t1.a[t1.len - 1] == 0 && t1.len > 1)
179     {
180         t1.len--;
181         big--;
182     }
183     if (flag)
184         t1.a[big - 1] = 0 - t1.a[big - 1];
185     return t1;
186 }
187
188 BigInteger BigInteger::operator*(const BigInteger & T) const   //两个大数之间的相乘运算
189 {
190     BigInteger ret;
191     int i, j, up;
192     int temp, temp1;
193     for (i = 0; i < len; i++)
194     {
195         up = 0;
196         for (j = 0; j < T.len; j++)
197         {
198             temp = a[i] * T.a[j] + ret.a[i + j] + up;
199             if (temp > MAXN)
200             {
201                 temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
202                 up = temp / (MAXN + 1);
203                 ret.a[i + j] = temp1;
204             }
205             else
206             {
207                 up = 0;
208                 ret.a[i + j] = temp;
209             }
210         }
211         if (up != 0)
212             ret.a[i + j] = up;
213     }
214     ret.len = i + j;
215     while (ret.a[ret.len - 1] == 0 && ret.len > 1)
216         ret.len--;
217     return ret;
218 }
219 BigInteger BigInteger::operator/(const int & b) const   //大数对一个整数进行相除运算
220 {
221     BigInteger ret;
222     int i, down = 0;
223     for (i = len - 1; i >= 0; i--)
224     {
225         ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
226         down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
227     }
228     ret.len = len;
229     while (ret.a[ret.len - 1] == 0 && ret.len > 1)
230         ret.len--;
231     return ret;
232 }
233 long long BigInteger::operator %(const long long & b) const    //大数对一个int类型的变量进行取模运算
234 {
235     int i;
236     long long d = 0;
237     for (i = len - 1; i >= 0; i--)
238     {
239         d = ((d * (MAXN + 1)) % b + (long long)(a[i])) % b;
240     }
241     return d;
242 }
243 BigInteger BigInteger::operator^(const int & n) const    //大数的n次方运算
244 {
245     BigInteger t, ret(1);
246     int i;
247     if (n<0)
248         exit(-1);
249     if (n == 0)
250         return 1;
251     if (n == 1)
252         return *this;
253     int m = n;
254     while (m>1)
255     {
256         t = *this;
257         for (i = 1; i << 1 <= m; i <<= 1)
258         {
259             t = t*t;
260         }
261         m -= i;
262         ret = ret*t;
263         if (m == 1)
264             ret = ret*(*this);
265     }
266     return ret;
267 }
268 bool BigInteger::operator>(const BigInteger & T) const   //大数和另一个大数的大小比较
269 {
270     int ln;
271     if (len > T.len)
272         return true;
273     else if (len == T.len)
274     {
275         ln = len - 1;
276         while (a[ln] == T.a[ln] && ln >= 0)
277             ln--;
278         if (ln >= 0 && a[ln] > T.a[ln])
279             return true;
280         else
281             return false;
282     }
283     else
284         return false;
285 }
286 bool BigInteger::operator >(const int & t) const    //大数和一个int类型的变量的大小比较
287 {
288     BigInteger b(t);
289     return *this>b;
290 }
291
292 void BigInteger::print()    //输出大数
293 {
294     int i;
295     cout << a[len - 1];
296     for (i = len - 2; i >= 0; i--)
297     {
298         cout.width(DLEN);
299         cout.fill('0');
300         cout << a[i];
301     }
302     cout << endl;
303 }


 其实这个也没多大用,大数肯定直接用Java了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: