算法竞赛高精度算法模板(c++版本)

文章详细介绍了如何使用C++中的vector容器进行高精度数值的运算,包括加法、减法、乘法(包括高精度乘法和乘以整数)、除法、取模以及快速幂和阶乘的实现。这些运算都遵循高位在后的规则,并利用了运算符重载功能。
摘要由CSDN通过智能技术生成

自行体会即可,运用的vector容器存储的数据,理论无限大
进去和出来都要遵循地位在前高位在后
运用到的是运算符的重载功能
不算最快,最快的话要一位存多位,感觉进位问题不太好解决,没有去尝试,欢迎分享
有错误请联系我纠正

高精度加法

//高位在后,低位在前
vector<int> operator +(vector<int>&a,vector<int> &b)
{
    if(a.size()<b.size()) return b+a;
    std::vector<int> ans;
    int t = 0;
    for(int i = 0;i < min(a.size(),b.size()+1);i++){
        t+=a[i];
        if(i<b.size())t+=b[i];
        ans.push_back(t%10);
        t/=10;
    }
    if(t)ans.push_back(t);
    return ans;
}

高精度减法

//高位在后,低位在前
bool check(vector<int> &a,vector<int> &b)
{
    if(a.size()<b.size())return false;
    if(a.size()>b.size())return true;
    for(int i = a.size()-1;i >=0;i--)
    {
        if(a[i]==b[i])continue;
        else return a[i]>b[i];
    }
    return true;
}
vector<int> operator -(vector<int> &a,vector<int> &b)
{
    if(!check(a,b))
        {
            //cout<<'-';(视情况而定)
            return b - a;
        }
    std::vector<int> ans;
    int t = 0;
    for(int i = 0;i < a.size();i++){
        t+=a[i];
        if(i<b.size())t-=b[i];
        ans.push_back((t+10)%10);
        if(t<0)t = -1;
        else t=0;
        }
    while(ans[ans.size()-1]==0&&ans.size()>1)ans.pop_back();
    if(t)ans.push_back(t);
    return ans;
}

高精度乘法(高精乘高精)

//高位在后,低位在前
vector<int> operator *(vector<int> &a,vector<int> &b)
{
    std::vector<int> ans(a.size()+b.size(),0);
    for(int i = 0;i < a.size();i++)
    {
        int t  = 0;
        for(int j = 0; j < b.size();j++)
        {
            t+=a[i]*b[j];
            t+=ans[i+j];
            ans[i+j]= t%10;
            t/=10;
        }
        int z  = b.size();
        if(t)
        {
            ans[i+z] = t%10;
            t/=10;
            z++;
        }
    }
    while(ans[ans.size()-1]==0&&ans.size()>1)ans.pop_back();
    return ans;
}

高精度乘法(高精乘整形)

//高位在后,低位在前
inline vector<int> operator *(vector<int> &a,ll &b)
{
    ll t = 0;
    int i = 0;
    while(a[i++]==0);
    i--;
    for (; i < a.size(); ++i)
    {

        a[i] *= b;
        a[i] +=t;
        t = a[i]/10;
        a[i] %= 10;
    }
    while(t)
    {
        a.push_back(t%10);
        t/=10;
    }
    return a;
}

高精度除法(高精除整)

//高位在后,低位在前
vector<int> operator /(vector<int> &a, int b)
{
    int r = 0;
    std::vector<int> ans;
    for(int i = a.size()-1; i >=0; i --)
    {
        r = r * 10 + a[i]; //计算当前被减数大小
        ans.push_back(r / b); //计算当前商的对应位数
        r %= b; // 更新余数
    }
    reverse(ans.begin(), ans.end());
    while(ans.size() > 1 && ans.back() == 0) ans.pop_back();
    return ans;
}

高精度取模

int operator %(vector<int> &a,int b)
{
    int r = 0;
    std::vector<int> ans;
    for(int i = a.size()-1; i >=0; i --)
    {
        r = r * 10 + a[i]; //计算当前被减数大小
        r %= b; // 更新余数
    }    
    return r;
}

高精度快速幂

//低位在前,高位在后
vector<int> operator *(vector<int> &a,vector<int> &b)
{
    vector<int> ans(a.size()+b.size(),0);
    int len1 = a.size();
    int len2 = b.size();

    for(int i = 0;i < a.size();i++)
    {
        ll t  = 0;
        for(int j = 0; j < b.size();j++)
        {
            t+=a[i]*b[j];
            t+=ans[i+j];
            ans[i+j]= t%10;
            t/=10;
        }
        int z  = b.size();
        if(t)
        {
            ans[i+z] = t%10;
            t/=10;
            z++;
        }
    }
    while(ans.back()==0&&ans.size()>1)ans.pop_back();
    return ans;
}
vector<int> operator ^(vector<int> &a,int n)
{
    vector<int> ans;
    ans.push_back(1);
    while(n)
    {
        if(n&1)
            ans  = ans *a;
        n>>=1; 
        a= a*a;
    }
    return ans;
}

高精度阶乘

inline vector<int> operator *(vector<int> &a,ll &b)
{
    ll t = 0;
    int i = 0;
    while(a[i++]==0);
    i--;
    for (; i < a.size(); ++i)
    {

        a[i] *= b;
        a[i] +=t;
        t = a[i]/10;
        a[i] %= 10;
    }
    while(t)
    {
        a.push_back(t%10);
        t/=10;
    }
    return a;
}
vector<int> jc(ll b,ll c)
{
    vector<int>ans;
    ans.push_back(1);
    ans = ans *b;
    while(--b>c)
    {
        ans = ans*b;
    }
    return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值