效率一般,凑合题可以凑合过:

 1 class BN {//大数字  比较  加法  乘法  cout
 2 private:
 3     static const int MAXN = 86;
 4     int data[MAXN];
 5     int len;
 6 public:
 7     BN() { len = 1; data[0] = 0; for (int i = 0; i < MAXN; ++i) { data[i] = 0; } }  //默认初始化为0;
 8     BN(int a){
 9         for (int i = 0; i < MAXN; ++i) { data[i] = 0; }
10         len = 0;
11         do {
12             data[len] = a % 10;
13             a /= 10;
14             len++;
15         }while(a);
16     }
17     bool operator<(const BN& a) const { //这地方的第二个const是必须的 否则就会报错 (可能是用了vector的缘故吧我这么猜)
18         if (len < a.size()) {
19             return true;
20         }
21         else if (len == a.size()) {
22             for (int i = len-1; i >=0; --i) {
23                 if (data[i] < a.data[i]) {
24                     return true;
25                 }
26                 else if (data[i] > a.data[i]) {
27                     return false;
28                 }
29             }
30         }
31         return false;
32     }
33     BN operator+(const BN& a) {
34         BN ret(0);
35         int i = 0, j = 0;
36         int jin = 0;
37         int temp;
38         ret.len = 0;
39         while (i < len && j < a.size()) {
40             temp = jin + data[i++] + a.data[j++];
41             ret.data[ret.len++] = temp % 10;
42             jin = temp / 10;
43         }
44         while (i < len) {
45             temp = jin + data[i++];
46             ret.data[ret.len++] = temp % 10;
47             jin = temp / 10;
48         }
49         while (j < a.size()) {
50             temp = jin + a.data[j++];
51             ret.data[ret.len++] = temp % 10;
52             jin = temp / 10;
53         }
54         if (jin != 0) {
55             ret.data[ret.len++] = jin;
56         }
57         return ret;
58     }
59     BN operator*(const BN& a) {
60         if ((a.size() == 1&& a.data[0] == 0 )||( len == 1 && data[0] == 0)) {
61             return BN(0);
62         }
63         BN ret(0);
64         int jin=0, cur=0, temp=0;
65         for (int i = 0; i < len; ++i) {
66             jin = 0,cur = i,temp = 0;
67             for (int j = 0; j < a.size(); ++j) {
68                 temp = data[i] * a.data[j] + jin + ret.data[cur];
69                 ret.data[cur++] = temp % 10;
70                 jin = temp / 10;
71             }
72             if (jin) {
73                 ret.data[cur++] = jin;
74             }
75         }
76         while (cur > 1 && ret.data[cur - 1] == 0) {
77             cur--;
78         }
79         ret.len = cur;
80         return ret;
81     }
82     /*
83     friend ostream & operator<<(ostream& cot,BN & a) {
84         for (int i = a.len - 1; i >= 0; --i) {
85             cot << a.data[i];
86         }
87         return cot;
88     }*/
89     friend ostream& operator<<(ostream& cot,const  BN& a) { ///这样就可以使用cout<<a*b 了 分析原因如下:a*b返回一个BN,但是他很快会被释放(因为是返回值) ,const BN & a = xxx 底层上是创建了一个变量来存储xxx 然后对其引用 
90         for (int i = a.len - 1; i >= 0; --i) {
91             cot << a.data[i];
92         }
93         return cot;
94     }
95     int size() const {
96         return len;
97     }
98 };