来自小白书的大数bign

来源:互联网 发布:淘宝补差价链接买东西 编辑:程序博客网 时间:2024/06/05 20:59
#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int maxn = 1000;struct bign{    int len, s[maxn];    bign()    {        memset(s, 0, sizeof(s));        len = 1;    }    bign(int num)    {        *this = num;    }    bign(const char* num)    {        *this = num;    }    bign operator = (int num)    {        char s[maxn];        sprintf(s, "%d", num);        *this = s;        return *this;    }    bign operator = (const char* num)    {        len = strlen(num);        for(int i = 0; i < len; i++) s[i] = num[len-i-1] - '0';        return *this;    }    string str() const    {        string res = "";        for(int i = 0; i < len; i++) res = (char)(s[i] + '0') + res;        if(res == "") res = "0";        return res;    }    bign operator + (const bign& b) const//大数加法    {        bign c;        c.len = 0;        for(int i = 0, g = 0; g || i < max(len, 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;        }        return c;    }    void clean()    {        while(len > 1 && !s[len-1]) len--;    }    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 bign& b)//大数减法    {        bign c;        c.len = 0;        for(int i = 0, g = 0; i < len; i++)        {            int x = s[i] - g;            if(i < b.len) x -= b.s[i];            if(x >= 0) g = 0;            else            {                g = 1;                x += 10;            }            c.s[c.len++] = x;        }        c.clean();        return c;    }    //大数比较    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    {        return b < *this;    }    bool operator <= (const bign& b)    {        return !(b > *this);    }    bool operator >= (const bign& b)    {        return !(*this < b);    }    bool operator != (const bign& b)    {        return b < *this || *this <b;    }    bool operator == (const bign& b)    {        return !(b < *this) && !(*this < b);    }    bign operator += (const bign& b)//重定义+=运算符    {        *this = *this + b;        return *this;    }};istream& operator >> (istream &in, bign& x)//重定义>>运算符{    string s;    in >> s;    x = s.c_str();    return in;}ostream& operator << (ostream &out, const bign& x)//重定义<<运算符{    out << x.str();    return out;}int main(){    bign a;    cin >> a;    return 0;}

0 0
原创粉丝点击