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