
#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>using namespace std;const int MAX = 110;class CHugeInt{public: int arr[MAX]{0}; int len; CHugeInt(int n) { arr[0] = n % 1000000000; arr[1] = n / 1000000000; len = (arr[1] == 0) ? 1 : 2; } CHugeInt(const char *s) { len = strlen(s) / 9 + 1; // 一个int元素最多存9位,因为int是10位,防止溢出 const char *p = s + strlen(s) - 1 - 8; // 指向最低9位中的最高位 int i = 0; // 把高位数存在数组的后面,如果出现高位进位,方便处理 for (; p >= s; ++i, p -= 9) // 先读低位,再读高位 { const char *pp = p; // 用pp读取接下来的9位 for (int j = 0; (j < 9); ++j, ++pp) { arr[i] = arr[i] * 10 + (*pp - '0'); // 逐位将字符串读入int数组 } } if (p + 9 != s) // 如果高位还没读取完 { int rest = p + 9 - s; p = s; for (int j = 0; j < rest; ++j, ++p) arr[i] = arr[i] * 10 + (*p - '0'); } } CHugeInt(const CHugeInt &hi) { memcpy(arr, hi.arr, hi.len * sizeof(int)); len = hi.len; } CHugeInt operator+(const CHugeInt &hi) // 把右边的加到左边上 { int i = 0; CHugeInt tmp(*this); int c = 0; // 低位进位 do { int sum = tmp.arr[i] + hi.arr[i] + c; c = sum / 1000000000; tmp.arr[i] = sum % 1000000000; ++i; } while ((i <= hi.len) && (i <= tmp.len)); return tmp; } CHugeInt operator+(int n) // 把右边的加到左边上 { CHugeInt tmp(*this); int sum = tmp.arr[0] + n; int c = sum / 1000000000; tmp.arr[1] += c; tmp.arr[0] = sum % 1000000000; return tmp; } void operator+=(int n) { int sum = arr[0] + n; int c = sum / 1000000000; arr[1] += c; arr[0] = sum % 1000000000; } CHugeInt &operator++() { int sum = arr[0] + 1; if (sum == 1000000000) { arr[0] = 0; arr[1] += 1; } else { arr[0] = sum; } return *this; } CHugeInt operator++(int) { CHugeInt tmp(*this); int sum = arr[0] + 1; if (sum == 1000000000) { arr[0] = 0; arr[1] += 1; } else { arr[0] = sum; } return tmp; } friend CHugeInt operator+(int n, const CHugeInt &hi) { CHugeInt tmp(hi); int sum = tmp.arr[0] + n; int c = sum / 1000000000; tmp.arr[1] += c; tmp.arr[0] = sum % 1000000000; return tmp; } friend ostream &operator<<(ostream &os, const CHugeInt &hi) { int i = hi.len; while (i--) { os << hi.arr[i]; } return os; }};int main(){ char s[210]; int n; while (cin >> s >> n) { CHugeInt a(s); CHugeInt b(n); cout << a + b << endl; // 重载“+”和"<<"运算符 cout << n + a << endl; // 这里需要重载operator+(int, CHugeInt()), cout << a + n << endl; // 不能重载int()类型转换运算符 b += n; // 重载“+=”运算符 cout << ++b << endl; // 重载前置“++”运算符 cout << b++ << endl; // 重载后置“++”运算符 } return 0;}
- 考察各种运算符的重载
- 读取一个大数的时候,要从低位开始读,不能从高位开始读(血的教训。。。)