大整数C++补充下列代码

 

测试进位,对的。

99999999999999999999999999999999999999999999999999999999999 999999999
100000000000000000000000000000000000000000000000000999999998
100000000000000000000000000000000000000000000000000999999998
100000000000000000000000000000000000000000000000000999999998
1999999999
1999999999
2000000000

你贴文字吧。这样帮你的人不需要手工输入已有的代码和测试数据,节省时间。

我还是手工敲了。代买调试通过了。如下:


#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

const int MAXLEN = 210;

class ChugeInt
{
public:
    ChugeInt(const string& s): digits(s)
    {
        reverse(digits.begin(), digits.end());
        digits.reserve(MAXLEN);
    }
    ChugeInt(int n):digits("0")
    {
        digits.reserve(MAXLEN);
        if (n > 0) 
        {
            digits.resize(0);
            while (n > 0)
            {
                digits.append(1, n % 10 + '0');
                n /= 10;
            }
        }
    }

    ChugeInt& operator++()
    {
        int carry = 1;
        for (int i = 0; carry > 0 && i < digits.length(); ++i)
        {
            int d = (digits[i] - '0') + carry;
            carry = d / 10;
            d -= carry * 10;
            digits[i] = d + '0';
        }
        
        if (carry > 0)
        {
            digits.append(1, carry + '0');
        }
        
        return *this;
    }

    ChugeInt operator++(int)
    {
        ChugeInt temp(*this);
        
        int carry = 1;
        for (int i = 0; carry > 0 && i < digits.length(); ++i)
        {
            int d = (digits[i] - '0') + carry;
            carry = d / 10;
            d -= carry * 10;
            digits[i] = d + '0';
        }
        
        if (carry > 0)
        {
            digits.append(1, carry + '0');
        }
        
        return temp;
    }

    ChugeInt& operator+=(const ChugeInt& rhs)
    {
        if (digits.length() < rhs.digits.length())
        {
            digits.resize(rhs.digits.length(), '0');
        }
        
        int carry = 0;
        int i = 0;
        for (; i < rhs.digits.length(); ++i)
        {
            int d = (digits[i] - '0') + (rhs.digits[i] - '0') + carry;
            carry = d / 10;
            d -= carry * 10;
            digits[i] = d + '0';
        }
        
        for (; carry > 0 && i < digits.length(); ++i)
        {
            int d = (digits[i] - '0') + carry;
            carry = d / 10;
            d -= carry * 10;
            digits[i] = d + '0';
        }
        
        if (carry > 0)
        {
            digits.append(1, carry + '0');
        }
        
        return *this;
    }
    


    friend ChugeInt operator+(const ChugeInt& lhs, const ChugeInt& rhs)
    {
        ChugeInt result(lhs);
        result += rhs;
        return result;
    }
    
    friend ostream& operator<<(ostream& os, const ChugeInt& hi)
    {
        string s(hi.digits);
        reverse(s.begin(), s.end());
        os << s;
        return os;
    }
    
private:
    string digits; // big ending digits of the huge integer.
};

int main()
{
    char s[MAXLEN];
    int n;
    
    while (cin >> s >> n)
    {
        ChugeInt a(s);
        ChugeInt b(n);
        
        cout << a + b << endl;
        cout << n + a << endl;
        cout << a + n << endl;
        b += n;
        cout << ++b << endl;
        cout << b++ << endl;
        cout << b << endl;
    }
    
    return 0;
}

// Output
999999999988888888881234567890123456789 12
999999999988888888881234567890123456801
999999999988888888881234567890123456801
999999999988888888881234567890123456801
25
25
26
6 6 
12
12
12
13
13
14