效率一般,凑合题可以凑合过:
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 };