高精度

注意该模板只能处理正数的+-*/%,如果正数-正数为负数,也可以处理,但不能处理负数的运算,如-1+3

若要处理负数,则需要先转化为正数

另外,此模板不能处理高精/高精和高精%单精

struct bign
{
    int len, s[N];//s[N]里从0~n-1倒序存储大整数,例如12345存储为s[]={5,4,3,2,1},此时len为5
    bign() { memset(s, 0, sizeof(s));  len = 1; }
    bign(int num) { *this = num; }
    bign(char* num) { *this = num; }
    bign operator =(int num)
    {
        char c[N];
        sprintf(c, "%d", num);
        *this = c;
        return *this;
    }
    bign operator =(const char* num)
    {
        len = strlen(num);
        for (int i = 0; i < len; i++) s[i] = num[len - 1 - i] - '0';
        return *this;
    }
    string str()//转化为string,以便输出
    {
        string res = "";
        if (s[len - 1] < 0) res += '-';
        for (int i = len - 1; i >= 0; i--) {
            if (s[i] < 0) s[i] = -s[i];
            res += s[i] + '0';
        }
        return res;
    }
    void clean()//删除前导零
    {
        while (len > 1 && !s[len - 1]) len--;
    }
    bool operator <(const bign& b) const
    {
        if (len != b.len) return len < b.len;
        for (int i = len - 1; i >= 0; i--)
            if (s[i] != b.s[i]) return s[i] < b.s[i];
        return false;
    }
    bool operator >(const bign& b) const
    {
        if (len != b.len) return len > b.len;
        for (int i = len - 1; i >= 0; i--)
            if (s[i] != b.s[i]) return s[i] > b.s[i];
        return false;
    }
    bool operator ==(const bign& b) const
    {
        if (len != b.len) return false;
        for (int i = len - 1; i >= 0; i--)
            if (s[i] != b.s[i]) return false;
        return true;
    }
    bign operator +(const bign& b)
    {
        bign c;
        c.len = 0;
        for (int i = 0, g = 0; g || i < len || i < b.len; i++)
        {
            int x = g;
            if (i < len) x += s[i];
            if (i < b.len) x += b.s[i];
            c.s[c.len++] = x % 10;
            g = x / 10;
        }
        c.clean();
        return c;
    }
    bign operator-(const bign& T) const {
        int l_len;
        bool ctf;
        bign t1, t2;
        if (*this < T) {
            t1 = T;
            t2 = *this;
            ctf = 1;
        }
        else {
            t1 = *this;
            t2 = T;
            ctf = 0;
        }
        l_len = t1.len;
        int j = 0;
        for (int i = 0; i < l_len; i++) {
            t1.s[i] -= t2.s[i];
            if (t1.s[i] < 0) { t1.s[i + 1]--; t1.s[i] += 10; }
        }
        //len++;
        t1.len = l_len;
        t1.clean();
        if (ctf) t1.s[t1.len - 1] = -t1.s[t1.len - 1];
        return t1;
    }
    bign operator *(const bign& b)
    {
        bign c;
        c.len = len + b.len;
        for (int i = 0; i < len; i++)for (int j = 0; j < b.len; j++)c.s[i + j] += s[i] * b.s[j];
        for (int i = 0; i < c.len - 1; i++) { c.s[i + 1] += c.s[i] / 10; c.s[i] %= 10; }
        c.clean();
        return c;
    }
    bign operator/(const int& b) {//高精/单精
        bign res;
        int down = 0;
        for (int i = len - 1; i >= 0;i--) {
            res.s[i] = (s[i] + down * (10)) / b;
            down = s[i] + down * (10) - res.s[i] * b;
        }
        res.len = len;
        res.clean();
        return res;
    }
    int operator%(const int& b) {//高精%单精
        int d = 0;
        for (int i = len - 1; i >= 0; i--) 
            d = (d * (10) % b + s[i]) % b;
        return d;
    }
    bign operator +=(const bign& b)
    {
        *this = *this + b;
        return *this;
    }
    bign operator -=(const bign& b)
    {
        *this = *this - b;
        return *this;
    }
    friend istream& operator>>(istream& in, bign& x) {
        string s;
        in >> s;
        x = s.c_str();
        return in;
    }
    friend ostream& operator<<(ostream& out, bign& x)
    {
        out << x.str();
        return out;
    }
};

高精度/高精度,高精度%高精度

Last updated