zl程序教程

您现在的位置是:首页 >  后端

当前栏目

非负整数大数高精度加法乘法【c++】

C++ 整数 乘法 高精度 加法 大数
2023-09-11 14:20:51 时间

 高精度模板,效率一般,不过大部分题目可以凑合凑合过。

追求极致的大佬可以忽略了。

class BN {//大数字  比较  加法  乘法  cout
private:
    static const int MAXN = 86;
    int data[MAXN];
    int len;
public:
    BN() { len = 1; data[0] = 0; for (int i = 0; i < MAXN; ++i) { data[i] = 0; } }  //默认初始化为0;
    BN(int a){
        for (int i = 0; i < MAXN; ++i) { data[i] = 0; }
        len = 0;
        do {
            data[len] = a % 10;
            a /= 10;
            len++;
        }while(a);
    }
    bool operator<(const BN& a) const { //这地方的第二个const是必须的 否则就会报错 (可能是用了vector的缘故吧我这么猜)
        if (len < a.size()) {
            return true;
        }
        else if (len == a.size()) {
            for (int i = len-1; i >=0; --i) {
                if (data[i] < a.data[i]) {
                    return true;
                }
                else if (data[i] > a.data[i]) {
                    return false;
                }
            }
        }
        return false;
    }
    BN operator+(const BN& a) {
        BN ret(0);
        int i = 0, j = 0;
        int jin = 0;
        int temp;
        ret.len = 0;
        while (i < len && j < a.size()) {
            temp = jin + data[i++] + a.data[j++];
            ret.data[ret.len++] = temp % 10;
            jin = temp / 10;
        }
        while (i < len) {
            temp = jin + data[i++];
            ret.data[ret.len++] = temp % 10;
            jin = temp / 10;
        }
        while (j < a.size()) {
            temp = jin + a.data[j++];
            ret.data[ret.len++] = temp % 10;
            jin = temp / 10;
        }
        if (jin != 0) {
            ret.data[ret.len++] = jin;
        }
        return ret;
    }
    BN operator*(const BN& a) {
        if ((a.size() == 1&& a.data[0] == 0 )||( len == 1 && data[0] == 0)) {
            return BN(0);
        }
        BN ret(0);
        int jin=0, cur=0, temp=0;
        for (int i = 0; i < len; ++i) {
            jin = 0,cur = i,temp = 0;
            for (int j = 0; j < a.size(); ++j) {
                temp = data[i] * a.data[j] + jin + ret.data[cur];
                ret.data[cur++] = temp % 10;
                jin = temp / 10;
            }
            if (jin) {
                ret.data[cur++] = jin;
            }
        }
        while (cur > 1 && ret.data[cur - 1] == 0) {
            cur--;
        }
        ret.len = cur;
        return ret;
    }
    /*
    friend ostream & operator<<(ostream& cot,BN & a) {
        for (int i = a.len - 1; i >= 0; --i) {
            cot << a.data[i];
        }
        return cot;
    }*/
    friend ostream& operator<<(ostream& cot,const  BN& a) { ///这样就可以使用cout<<a*b 了 分析原因如下:a*b返回一个BN,但是他很快会被释放(因为是返回值) ,const BN & a = xxx 底层上是创建了一个变量来存储xxx 然后对其引用
        for (int i = a.len - 1; i >= 0; --i) {
            cot << a.data[i];
        }
        return cot;
    }
    int size() const {
        return len;
    }
};

有缺陷还请指出!