【关于高精度】为什么这分代码中减法会出现bug,多次测试正确但依然无法通过系统检查

由于类中各函数存在依赖关系,此处为整份代码。请求检查

 #include<iostream>
#include<string>
#include<cstring>

using namespace std;
class BigInteger {
    int store[3000];

    int len, radix;
    bool positive;
    void tidy() {
        bool flag = false;
        for (int i = 0; i <= len; i++) {
            if (store[i] >= radix)
                flag = true,
                store[i + 1] += store[i] / radix,
                store[i] %= radix;
            while (store[i] < 0) {
                flag = true,
                    store[i + 1] --,
                    store[i] += radix;
            }
            if (flag || store[len])len++, flag = false;
        }
        while (len > 1 && store[len - 1] == 0)len--;
    }

    int newStore[6000], newLen;
public:
    BigInteger() {

    }
    bool operator <(BigInteger &b) {
        if (positive && (!b.positive))return false;
        if (!positive&&b.positive)return true;

        if (positive) {
            if (len < b.len)return true;
            else if (len > b.len)return false;
        }
        else {
            if (len > b.len)return true;
            else if (len < b.len)return false;
        }

        for (int i = 0; i < len; i++) {
            if (this->store[i] < b.store[i])return true;
            if (this->store[i] > b.store[i])return false;
        }
        return false;
    }
    bool operator ==(BigInteger &b) {
        if (len ^ b.len)return false;
        if (positive ^ b.positive)return false;
        for (int i = 0; i < len; i++)if (store[i] ^ b.store[i])return false;
        return true;
    }
    bool operator !=(BigInteger &b) {
        return !(*this == b);
    }
    bool operator >(BigInteger &b) {
        return (!(*this < b) && (*this != b));
    }
    bool operator <=(BigInteger &b) {
        return !(*this > b);
    }
    bool operator >=(BigInteger &b) {
        return !(*this < b);
    }

    BigInteger& operator =(BigInteger &b) {
        radix = b.radix;
        memcpy(store, b.store, sizeof b.store);
        positive = b.positive;
        len = b.len;

        return *this;
    }

    BigInteger& operator +(BigInteger &b) {
        return (*new BigInteger(*this) += b);
    }
    BigInteger& operator +=(BigInteger &b) {
        b >> this->radix;
        int longer = len < b.len ? b.len : len;
        if (positive^b.positive) {
            if (positive) {
                BigInteger temp(b);
                temp.positive = true;
                return *this -= temp;
            }
            else {
                positive = true;
                return (*this = (b - *this));
            }
        }

        for (int i = 0; i < longer; i++)
            store[i] += b.store[i];
        tidy();

        return *this;
    }
    BigInteger& operator -(BigInteger &b) {
        return (*new BigInteger(*this) -= b);
    }
    BigInteger& operator -=(BigInteger &b) {
        if (positive^b.positive) {
            if (positive) {
                BigInteger temp(b);
                temp.positive = true;
                return (*this -= temp);
            }
            else {
                positive = true;
                return (*this = b - *this);
            }
        }
        if ((*this) < b) {
            (*this) = b - (*this);
            positive = false;
            return *this;
        }
        if (*this == b) {
            memset(store, 0, sizeof store);
            len = 1;
            positive = true;
            radix = 10;
            return *this;
        }
        for (int i = 0; i < len; i++)
            store[i] -= b.store[i];
        tidy();
        return *this;
    }
    BigInteger& operator *(int b) {
        return (*new BigInteger(*this) *= b);
    }
    BigInteger& operator *=(int b) {
        int pusher[30000];
        memset(pusher, 0, sizeof pusher);
        for (int i = 0; i < len; i++) {
            int current = i;
            store[current] *= b;
            while (store[current] >= 10) {
                pusher[current + 1] += store[current] / 10;
                store[current] %= 10;
                current++;
            }
            if (current + 1 > len) len = current + 1;
        }
        for (int i = 0; i < len; i++)
            store[i] += pusher[i];
        tidy();
        while (store[len] == 0 && len > 1) len--;
    }
    BigInteger& operator >> (int targetRadix) {
        if (radix == targetRadix)return *this;
        memset(newStore, 0, sizeof newStore);
        newLen = 0;
        while (len) {
            for (int i = len - 1; i > 0; i--) {
                store[i - 1] += store[i] % targetRadix*radix;
                store[i] /= targetRadix;
            }
            newStore[newLen++] = store[0] % targetRadix;
            store[0] /= targetRadix;
            while (len > 0 && !store[len - 1])len--;
        }
        memcpy(store, newStore, sizeof newStore);
        len = newLen;
        radix = targetRadix;

        return *this;
    }

    void read(int radix, string temp) {
        memset(store, 0, sizeof store);
        if (temp[0] == '-')positive = false, temp = temp.substr(1);
        else positive = true;
        for (int i = 0; i < temp.length(); i++)
            store[temp.length() - 1 - i] =
            temp[i] <= '9' ? temp[i] - '0' :
            (temp[i] < 'z' ? temp[i] - 'a' + 10 :
                temp[i] - 'A' + 10);
        len = temp.length();
        this->radix = radix;
    }
    friend istream& operator >> (istream &in, BigInteger &a) {

        memset(a.store, 0, sizeof a.store);
        string temp;
        in >> a.radix >> temp;
        if (temp[0] == '-')a.positive = false, temp = temp.substr(1);
        else a.positive = true;
        for (int i = 0; i < temp.length(); i++)
            a.store[temp.length() - 1 - i] =
            temp[i] <= '9' ? temp[i] - '0' :
            (temp[i] < 'z' ? temp[i] - 'a' + 10 :
                temp[i] - 'A' + 10);
        a.len = temp.length();
        /*if (temp[0] == '-')a.positive = false;
        else a.positive = true;
        for (int i = 0; i < temp.length(); i++) {
        a.multiply(radix);
        if (temp[i] >= 'a'&&temp[i] <= 'z')a.store[0] += temp[i] - 'a' + 10;
        if (temp[i] >= '0'&&temp[i] <= '9')a.store[0] += temp[i] - '0';
        a.tidy();
        }
        a.radix = 10;*/
        return in;
    }
    friend ostream& operator <<(ostream &out, BigInteger &a) {
        if (!a.positive)putchar('-');

        for (int i = a.len - 1; i >= 0; i--) {
            putchar(
                a.store[i] < 10 ? a.store[i] + '0' :
                a.store[i] < 36 ? a.store[i] - 10 + 'a' :
                a.store[i] - 10 + 'A'
            );
        }
        return out;
    }
};
int main() {
    /*ios::sync_with_stdio(false);
    for (int i = -1000; i < 1000; i++) {
        for (int j = -1000; j < 1000; j++) {
            char bufferi[1000]; sprintf(bufferi, "%d", i);
            char bufferj[1000]; sprintf(bufferj, "%d", j);
            BigInteger a, b; a.read(10, bufferi); b.read(10, bufferj);
            cout << i << "+" << j << endl;
            cout << i + j << endl << a + b << endl << endl;

        }
    }*/
    int a, b; cin >> a >> b;
    char bufferi[1000]; sprintf(bufferi, "%d", a);
    char bufferj[1000]; sprintf(bufferj, "%d", b);
    BigInteger A, B; A.read(10, bufferi); B.read(10, bufferj);
    cout << A + B;
}

http://blog.sina.com.cn/s/blog_a2177c6e0101bo3z.html