C++高精度计算模板

2024-08-20

最近发现了一个特别神奇的代码,可以轻松的进行C++高精度运算:

namespace Bigint
{
    class bigint
    {
    private:	
        int value[10005];
        short leng;
        bool fuhao;
        bigint plus(bigint a);
        friend bigint minus(bigint a, bigint b);
        bigint cheng(int a);
    public:
        bigint(int n);
        bigint();
        int length() { return leng; }
        friend std::ostream& operator << (std::ostream& output, bigint c);
        friend std::istream& operator >> (std::istream&, bigint&);
        friend bigint operator+(bigint a, bigint b);
        friend bigint operator+(bigint a, int b);
        friend bigint operator+(int a, bigint b);
        friend bigint operator-(bigint a, bigint b);
        friend bigint operator-(bigint a, int b);
        friend bigint operator-(int a, bigint b);
        friend bool operator>(bigint a, bigint b);
        friend bool operator>(bigint a, int b);
        friend bool operator>(int a, bigint b);
        friend bool operator<(bigint a, bigint b);
        friend bool operator<(bigint a, int b);
        friend bool operator<(int a, bigint b);
        friend bool operator==(bigint a, bigint b);
        friend bool operator==(bigint a, int b);
        friend bool operator==(int a, bigint b);
        friend bool operator>=(bigint a, bigint b);
        friend bool operator>=(bigint a, int b);
        friend bool operator>=(int a, bigint b);
        friend bool operator<=(bigint a, bigint b);
        friend bool operator<=(bigint a, int b);
        friend bool operator<=(int a, bigint b);
        friend bool operator!=(bigint a, bigint b);
        friend bool operator!=(bigint a, int b);
        friend bool operator!=(int a, bigint b);
        friend bigint operator<<(bigint a,int b);
        friend bigint operator>>(bigint a, int b);
        friend bigint operator*(bigint a, bigint b);
        friend bigint operator*(bigint a, int b);
        friend bigint operator*(int a, bigint b);
        friend bigint operator/(bigint a, bigint b);
        friend bigint operator/(bigint a, int b);
        friend bigint operator/(int a, bigint b);
        friend bigint operator%(bigint a, bigint b);
        friend bigint operator%(bigint a, int b);
        friend bigint operator%(int a, bigint b);
        friend bigint operator+=(bigint &a, bigint b);
        friend bigint operator+=(bigint &a, int b);
        friend int operator+=(int &a, bigint b);
        friend bigint operator-=(bigint &a, bigint b);
        friend bigint operator-=(bigint &a, int b);
        friend int operator-=(int &a, bigint b);
        friend bigint operator<<=(bigint&a, int b);
        friend bigint operator>>=(bigint&a, int b);
        friend bigint operator*=(bigint &a, bigint b);
        friend bigint operator*=(bigint &a, int b);
        friend bigint operator*=(int &a, bigint b);
        friend bigint operator/=(bigint &a, bigint b);
        friend bigint operator/=(bigint &a, int b);
        friend bigint operator/=(int &a, bigint b);
        friend bigint operator%=(bigint &a, bigint b);
        friend bigint operator%=(bigint &a, int b);
        friend bigint operator%=(int &a, bigint b);
        bigint operator++();
        bigint operator++(int);
        bigint operator--();
        bigint operator--(int);
        bool operator!();//气势磅礴的运算符重载
        operator int();
        //  operator long long();
        //  operator short();
    };
    bigint::bigint(int n)
    {
        for (int i = 0; i < 10005; i++)value[i] = 0;
        if (n >= 0)fuhao = true;
        else fuhao = false;
        n = n >= 0 ? n : -n;
        for (leng = 1; n; leng++, n /= 10)value[leng] = n % 10;
        leng--;
    }
    bigint::bigint()
    {
        for (int i = 0; i < 10005; i++)
            value[i] = 0;
        leng = 0;
        fuhao = true;
    }
    //输出
    std::ostream& operator << (std::ostream& output, bigint c)
    {
        if (c.leng == 0)
        {
            std::cout << 0;
            return output;
        }
        if (c.fuhao == false)output << '-';
        for (int i = c.leng; i > 0; i--)output << c.value[i];
        return output;
    }
    //输入
    std::istream& operator >> (std::istream& input, bigint& c)
    {
        std::string s;
        input >> s;
        int i = s.length(), j = 0;
        c.leng = s.length();
        if (s[j] == '-')
        {
            j++;
            c.fuhao = false;
            c.leng--;
            i--;
        }
        else c.fuhao = true;
        for (; i > 0; i--, j++)c.value[i] = s[j] - '0';
        return input;
    }
    //大于
    bool operator>(bigint a, bigint b)
    {
        if (a.fuhao != b.fuhao)return a.fuhao;
        if (a.leng != b.leng)return (a.leng < b.leng) xor (a.fuhao);
        for (int i = a.leng; i > 0; i--)
            if (a.value[i] != b.value[i])
                return (a.value[i] < b.value[i]) xor a.fuhao;
        return false;
    }
   /*
    高精大于低精
    (不要说多余,加个构造函数就行了,
    这个程序既有低精转高精的构造函数,
    又有高精转低精的类型转换函数,
    编译器会报错有歧义,不知道是转换成高精比高精还是低精比低精,
    但是有了类型完全匹配的函数,
    编译器才不会想着转换类型,才会直接调用这个函数。)
    */
    bool operator>(bigint a, int b)
    {
        return a > bigint(b);
    }
    bool operator>(int a, bigint b)
    {
        return bigint(a) > b;
    }
    //小于
    bool operator<(bigint a, bigint b)
    {
        if (a.fuhao != b.fuhao)return b.fuhao;
        if (a.leng != b.leng)return (a.leng > b.leng) xor (a.fuhao);
        for (int i = a.leng; i > 0; i--)
            if (a.value[i] != b.value[i])
                return (a.value[i] > b.value[i]) xor a.fuhao;
        return false;
    }
    bool operator<(bigint a, int b)
    {
        return a < bigint(b);
    }
    bool operator<(int a, bigint b)
    {
        return bigint(a) < b;
    }
    //高精加高精(符号一样)
    //或高精减高精(符号不一样)
    bigint bigint::plus(bigint a)
    {
        bigint b;
        int max;
        if (leng > a.leng)max = leng;
        else max = a.leng;
        for (int i = 1; i <= max; i++)
        {
            b.value[i] += value[i] + a.value[i];
            b.value[i + 1] = b.value[i] / 10;
            b.value[i] %= 10;
        }
        if (b.value[max + 1] == 0)b.leng = max;
        else b.leng = max + 1;
        b.fuhao = fuhao;
        return b;
    }
    //高精加高精(符号不一样)
    //或高精减高精(符号一样)
    bigint minus(bigint a, bigint b)
    {
        bigint c;
        c.fuhao = a.fuhao;
        a.fuhao = 1;
        b.fuhao = 1;
        if (a < b)
        {
            bigint d = a;
            a = b;
            b = d;
            c.fuhao ^= 1;
        }
        for (int i = 1; i <= a.leng; i++)
        {
            c.value[i] += a.value[i] - b.value[i];
            if (c.value[i] < 0)
            {
                c.value[i + 1]--;
                c.value[i] += 10;
            }
        }
        for (int i = a.leng; i > 0; i--)
        {
            if (c.value[i] != 0)
            {
                c.leng = i;
                return c;
            }
        }
        c.leng = 0;
        c.fuhao = true;
        return c;
    }
    //加
    bigint operator+(bigint a, bigint b)
    {
        bigint c;
        if (!a.fuhao^b.fuhao)
        {
            c.fuhao = a.fuhao;
            c = a.plus(b);
        }
        else
        {
            b.fuhao ^= 1;
            c = minus(a, b);
        }
        return c;
    }
    bigint operator+(bigint a, int b)
    {
        return a + bigint(b);
    }
    bigint operator+(int a, bigint b)
    {
        return bigint(a) + b;
    }
    //减
    bigint operator-(bigint a, bigint b)
    {
        bigint c(0);
        if (!a.fuhao^b.fuhao)
        {
            c.fuhao = a.fuhao;
            c = minus(a, b);
        }
        else
        {
            b.fuhao ^= 1;
            c = a.plus(b);
        }
        return c;
    }
    bigint operator-(bigint a, int b)
    {
        return a - bigint(b);
    }
    bigint operator-(int a, bigint b)
    {
        return bigint(a) - b;
    }
    //等于
    bool operator==(bigint a, bigint b)
    {
        if (a.fuhao != b.fuhao)return false;
        if (a.leng != b.leng)return false;
        for (int i = 1; i <= a.leng; i++)if (a.value[i] != b.value[i])return false;
        return true;
    }
    bool operator==(bigint a, int b)
    {
        return a == bigint(b);
    }
    bool operator==(int a, bigint b)
    {
        return bigint(a) == b;
    }
    //大于等于
    bool operator>=(bigint a, bigint b)
    {
        return !(a < b);
    }
    bool operator>=(bigint a, int b)
    {
        return !(a < bigint(b));
    }
    bool operator>=(int a, bigint b)
    {
        return !(bigint(a) < b);
    }
    //小于等于
    bool operator<=(bigint a, bigint b)
    {
        return !(a > b);
    }
    bool operator<=(bigint a, int b)
    {
        return !(a > bigint(b));
    }
    bool operator<=(int a, bigint b)
    {
        return !(bigint(a) > b);
    }
    //自增(前置)
    bigint bigint::operator++()
    {
        *this = *this + 1;
        return *this;
    }
    //自增(后置)
    bigint bigint::operator++(int)
    {
        bigint a = *this;
        *this = *this + 1;
        return a;
    }
    //自减(前置)
    bigint bigint::operator--()
    {
        *this = *this - 1;
        return *this;
    }
    //自减(后置)
    bigint bigint::operator--(int)
    {
        bigint a = *this;
        *this = *this - 1;
        return a;
    }
    //高精转换成低精
    //(在不溢出的情况下
    //位数尽可能多)
    bigint::operator int()
    {
        int a = 0;
        for (int i = 9; i > 0; i--)
        {
            a *= 10;
            a += value[i];
        }
        int b = 0;
        for (int i = 10; i > 0; i--)
        {
            b *= 10;
            b += value[i];
        }
        int c;
        if (b < 0)c = a;
        else c = b;
        if (fuhao)return c;
        else return -c;
    }
    bool operator!=(bigint a, bigint b)
    {
        return !(a == b);
    }
    bool operator!=(bigint a, int b)
    {
        return !(a == bigint(b));
    }
    bool operator!=(int a, bigint b)
    {
        return !(bigint(a) == b);
    }
    //高精乘一位数(正数)
    bigint bigint::cheng(int a)
    {
        bigint b;
        for (int i = 1; i <= leng; i++)b.value[i] = value[i] * a;
        for (int i = 1; i <= leng; i++)if (b.value[i] > 9)
        {
            b.value[i + 1] += b.value[i] / 10;
            b.value[i] %= 10;
        }
        b.fuhao = true;
        for (int i = leng + 1; i > 0; i--)
        {
            if (b.value[i])
            {
                b.leng = i;
                return b;
            }
        }
        b.leng = 0;
        return b;
    }
    bigint operator<<(bigint a, int b)
    {
        for (int i = a.leng + b; i > b; i--)a.value[i] = a.value[i - b];
        for (int i = b; i > 0; i--)a.value[i] = 0;
        a.leng += b;
        return a;
    }
    bigint operator>>(bigint a, int b)
    {
        for (int i = 1; i <= a.leng - b; i++)a.value[i] = a.value[i + b];
        for (int i = a.leng - b + 1; i <= a.leng; i++)a.value[i] = 0;
        a.leng -= b;
        if (a.leng < 0)a.leng = 0;
        return a;
    }
    //高精乘
    bigint operator*(bigint a, bigint b)
    {
        if (a == 0 || b == 0)return bigint(0);
        bigint c;
        for (int i = 1; i <= b.leng; i++)
        {
            bigint d = a.cheng(b.value[i])<<(i-1);
            c += d;
        }
        c.fuhao = !(a.fuhao^b.fuhao);
        for(int i=a.leng+b.leng;i>0;i--)
            if (c.value[i] != 0)
            {
                c.leng = i;
                break;
            }
        return c;
    }
    bigint operator*(bigint a, int b)
    {
        return bigint(b)*a;
    }
    bigint operator*(int a, bigint b)
    {
        return bigint(a)*b;
    }
    bigint operator/(bigint a, bigint b);
    bigint operator/(bigint a, int b);
    bigint operator/(int a, bigint b);
    bigint operator%(bigint a, bigint b);
    bigint operator%(bigint a, int b);
    bigint operator%(int a, bigint b);
    bigint operator+=(bigint &a, bigint b)
    {
        a = a + b;
        return a;
    }
    bigint operator+=(bigint &a, int b)
    {
        a = a + bigint(b);
        return a;
    }
    int operator+=(int &a, bigint b)
    {
        a = int(bigint(a) + b);
        return a;
    }
    bigint operator-=(bigint &a, bigint b)
    {
        a = a + b;
        return a;
    }
    bigint operator-=(bigint &a, int b)
    {
        a = a + bigint(b);
        return a;
    }
    int operator-=(int &a, bigint b)
    {
        a = int(bigint(a) + b);
        return a;
    }
    bigint operator<<=(bigint&a, int b)
    {
        a = a << b;
        return a;
    }
    bigint operator>>=(bigint&a, int b)
    {
        a = a >> b;
        return a;
    }
    bigint operator*=(bigint &a, bigint b)
    {
        a = a * b;
        return a;
    }
    bigint operator*=(bigint &a, int b)
    {
        a = a * b;
        return a;
    }
    bigint operator*=(int &a, bigint b)
    {
        a = int(a*b);
        return a;
    }
    bigint operator/=(bigint &a, bigint b);
    bigint operator/=(bigint &a, int b);
    bigint operator/=(int &a, bigint b);
    bigint operator%=(bigint &a, bigint b);
    bigint operator%=(bigint &a, int b);
    bigint operator%=(int &a, bigint b);
    bool bigint::operator!()
    {
        return *this == bigint(0);
    }
}

这个代码重载了所有运算符,还定义了一种新的数据类型:bigint

使用方法1:

#include <bits/stdc++.h>    // 导入万能头
// 在这里粘贴之前的一长串代码
using namespace std;
using namespace Bigint;
bigint a,b;                 // 定义高精度变量
signed main(){
    ios::sync_with_stdio(false);// 解除cin、cout绑定,减少时间复杂度
    cin.tie(0);                 //使用cin输入时不刷新缓冲区
    cin >> a >> b;
    cout << a + b;
    return 0;
}

使用方法2:

首先将之前的一长串代码粘贴到Bigint.h文件中,随后将其放在和代码相同目录中

#include <bits/stdc++.h>    // 导入万能头
#include "Bigint.h"         // 导入高精度头文件
using namespace std;
using namespace Bigint;
bigint a,b;                 // 定义高精度变量
signed main(){
    ios::sync_with_stdio(false);// 解除cin、cout绑定,减少时间复杂度
    cin.tie(0);                 //使用cin输入时不刷新缓冲区
    cin >> a >> b;
    cout << a + b;
    return 0;
}

就是这么简单~~~

The End…