FrankLi101000100 2016-10-12 16:06 采纳率: 0%
浏览 972
已结题

【关于高精度】为什么这分代码中减法会出现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;
}
  • 写回答

1条回答 默认 最新

  • devmiao 2016-10-12 16:16
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行