image.png

    1. #include <iostream>
    2. #include <cstring>
    3. #include <cstdlib>
    4. #include <cstdio>
    5. using namespace std;
    6. const int MAX = 110;
    7. class CHugeInt
    8. {
    9. public:
    10. int arr[MAX]{0};
    11. int len;
    12. CHugeInt(int n)
    13. {
    14. arr[0] = n % 1000000000;
    15. arr[1] = n / 1000000000;
    16. len = (arr[1] == 0) ? 1 : 2;
    17. }
    18. CHugeInt(const char *s)
    19. {
    20. len = strlen(s) / 9 + 1; // 一个int元素最多存9位,因为int是10位,防止溢出
    21. const char *p = s + strlen(s) - 1 - 8; // 指向最低9位中的最高位
    22. int i = 0;
    23. // 把高位数存在数组的后面,如果出现高位进位,方便处理
    24. for (; p >= s; ++i, p -= 9) // 先读低位,再读高位
    25. {
    26. const char *pp = p; // 用pp读取接下来的9位
    27. for (int j = 0; (j < 9); ++j, ++pp)
    28. {
    29. arr[i] = arr[i] * 10 + (*pp - '0'); // 逐位将字符串读入int数组
    30. }
    31. }
    32. if (p + 9 != s) // 如果高位还没读取完
    33. {
    34. int rest = p + 9 - s;
    35. p = s;
    36. for (int j = 0; j < rest; ++j, ++p)
    37. arr[i] = arr[i] * 10 + (*p - '0');
    38. }
    39. }
    40. CHugeInt(const CHugeInt &hi)
    41. {
    42. memcpy(arr, hi.arr, hi.len * sizeof(int));
    43. len = hi.len;
    44. }
    45. CHugeInt operator+(const CHugeInt &hi) // 把右边的加到左边上
    46. {
    47. int i = 0;
    48. CHugeInt tmp(*this);
    49. int c = 0; // 低位进位
    50. do
    51. {
    52. int sum = tmp.arr[i] + hi.arr[i] + c;
    53. c = sum / 1000000000;
    54. tmp.arr[i] = sum % 1000000000;
    55. ++i;
    56. } while ((i <= hi.len) && (i <= tmp.len));
    57. return tmp;
    58. }
    59. CHugeInt operator+(int n) // 把右边的加到左边上
    60. {
    61. CHugeInt tmp(*this);
    62. int sum = tmp.arr[0] + n;
    63. int c = sum / 1000000000;
    64. tmp.arr[1] += c;
    65. tmp.arr[0] = sum % 1000000000;
    66. return tmp;
    67. }
    68. void operator+=(int n)
    69. {
    70. int sum = arr[0] + n;
    71. int c = sum / 1000000000;
    72. arr[1] += c;
    73. arr[0] = sum % 1000000000;
    74. }
    75. CHugeInt &operator++()
    76. {
    77. int sum = arr[0] + 1;
    78. if (sum == 1000000000)
    79. {
    80. arr[0] = 0;
    81. arr[1] += 1;
    82. }
    83. else
    84. {
    85. arr[0] = sum;
    86. }
    87. return *this;
    88. }
    89. CHugeInt operator++(int)
    90. {
    91. CHugeInt tmp(*this);
    92. int sum = arr[0] + 1;
    93. if (sum == 1000000000)
    94. {
    95. arr[0] = 0;
    96. arr[1] += 1;
    97. }
    98. else
    99. {
    100. arr[0] = sum;
    101. }
    102. return tmp;
    103. }
    104. friend CHugeInt operator+(int n, const CHugeInt &hi)
    105. {
    106. CHugeInt tmp(hi);
    107. int sum = tmp.arr[0] + n;
    108. int c = sum / 1000000000;
    109. tmp.arr[1] += c;
    110. tmp.arr[0] = sum % 1000000000;
    111. return tmp;
    112. }
    113. friend ostream &operator<<(ostream &os, const CHugeInt &hi)
    114. {
    115. int i = hi.len;
    116. while (i--)
    117. {
    118. os << hi.arr[i];
    119. }
    120. return os;
    121. }
    122. };
    123. int main()
    124. {
    125. char s[210];
    126. int n;
    127. while (cin >> s >> n)
    128. {
    129. CHugeInt a(s);
    130. CHugeInt b(n);
    131. cout << a + b << endl; // 重载“+”和"<<"运算符
    132. cout << n + a << endl; // 这里需要重载operator+(int, CHugeInt()),
    133. cout << a + n << endl; // 不能重载int()类型转换运算符
    134. b += n; // 重载“+=”运算符
    135. cout << ++b << endl; // 重载前置“++”运算符
    136. cout << b++ << endl; // 重载后置“++”运算符
    137. }
    138. return 0;
    139. }
    • 考察各种运算符的重载
    • 读取一个大数的时候,要从低位开始读,不能从高位开始读(血的教训。。。)