高精度

注意该模板只能处理正数的+-*/%,如果正数-正数为负数,也可以处理,但不能处理负数的运算,如-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;
    }
};

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

//arr1为被除数,arr2为被除数,计算后arr为商,arr1为余数
//arr1[0]为arr1的长度,arr2[0]为arr2的长度,arr[0]为arr的长度,temp[0]为temp长度。
#define maxn 100
int arr1[maxn], arr2[maxn], arr[maxn], temp[maxn];
string s1, s2;
int compare(int a[], int b[])//比较a、b,若a>b为1;若a<b为-1;若a=b为0
{
    if (a[0] > b[0]) return 1;
    if (a[0] < b[0]) return -1;
    for (int i = a[0]; i > 0; i--)//从高位到低位比较
    {
        if (a[i] > b[i]) return 1;
        if (a[i] < b[i]) return -1;
    }
    return 0;
}
 
void subduction(int a[], int b[])//计算a=a-b
{
    if (compare(a, b) == 0)//相等
    {
        a[0] = 0;
        return;
    }
    if (compare(a, b) == 1)//大于
    {
        for (int i = 1; i <= a[0]; i++)
        {
            if (a[i] < b[i])//若不够向上借位
            {
                a[i + 1]--;
                a[i] += 10;
            }
            a[i] -= b[i];
        }
        while (a[0] > 0 && a[a[0]] == 0) a[0]--;//删除前导0
    }
}
void division() {
    cin >> s1 >> s2;
    arr1[0] = s1.size();
    arr2[0] = s2.size();
    for (int i = 1; i <= arr1[0]; i++)
        arr1[i] = s1[arr1[0] - i] - '0';
    for (int i = 1; i <= arr2[0]; i++)
        arr2[i] = s2[arr2[0] - i] - '0';
    arr[0] = arr1[0] - arr2[0] + 1;
    for (int i = arr[0]; i > 0; i--)
    {
        memset(temp, 0, sizeof(temp));
        for (int j = 1; j <= arr2[0]; j++)//从i开始的地方,复制数组b到数组temp
            temp[j + i - 1] = arr2[j];
        temp[0] = arr2[0] + i - 1;
 
        while (compare(arr1, temp) >= 0)//减法模拟
        {
            arr[i]++;
            subduction(arr1, temp);
        }
    }
    while (arr[0] > 0 && arr[arr[0]] == 0) arr[0]--;//删除前导0 
//输出
    cout << "商为:";
    if (arr[0] == 0) { arr[1] = 0; arr[0] = 1; }
    for (int i = arr[0]; i > 0; i--)  cout << arr[i]; cout << endl;
    cout << "余数为:";
    if (arr1[0] == 0) { arr1[1] = 0; arr1[0] = 1; }
    for (int i = arr1[0]; i > 0; i--)  cout << arr1[i]; cout << endl;
}
//计算后arr[]为商,arr1[]为余数,arr[0]为arr的长度,arr1[0]为arr1的长度

Last updated