基础算法-大数运算

大数运算

vector<int> ls={1,2,3,4,5}

// 代表这个数 为54321 高位存在数组的高位 这样好写代码

比如 123456 + 937 关注于6+7 为 13 ,需要上前进一位1 ,本位留下3

模拟这个过程即可4

#include<vector>
#include<iostream>
using namespace std;
void bignum_add(vector<int> & rs,vector<int> &l1,vector<int> &l2)
{
    if(l1.size()<l2.size()) bignum_add(rs,l2,l1);
    else
    {
        int t=0;
        for(int i=0;i<l1.size()||t;i++)
        {
            if(i<l1.size()) t+=l1[i];
            if(i<l2.size()) t+=l2[i];
            rs.push_back(t%10);
            t/=10;
        }
        while(rs.size()>1&&rs.back()==0) rs.pop_back();
    }

}
int main()
{
    string s1;
    string s2;
    cin>>s1;
    cin>>s2;
    vector<int> l1;
    vector<int> l2;
    for(int i=s1.size()-1;i>=0;i--)
    {
        l1.push_back(s1[i]-'0');
    }
    for(int i=s2.size()-1;i>=0;i--)
    {
        l2.push_back(s2[i]-'0');
    }
    vector<int> rs;
    bignum_add(rs,l1,l2);
    for(int i=rs.size()-1;i>=0;i--)
    {
        cout<<rs[i];
    }

}

t 表示 从高位借的位 1 或者0

783 -238 比如我们关注3-8 ,会发现不够 ,需要从高位借一位 也就是变成 3-8+10

我们在实现算法的时候,需要保证l1≥l2

 

#include<vector>
#include<iostream>
using namespace std;
void bignum_add(vector<int> & rs,vector<int> &l1,vector<int> &l2)
{
    if(l1.size()<l2.size()) bignum_add(rs,l2,l1);
    else
    {
        int t=0;
        for(int i=0;i<l1.size();i++)
        {
            t+=l1[i];
            if(i<l2.size()) t+=l2[i];
            rs.push_back(t%10);
            t/=10;
        }
        if(t) rs.push_back(t%10);
        while(rs.size()>1&&rs.back()==0) rs.pop_back();
    }

}
int cmp(vector<int> &l1,vector<int> &l2)
{
    if(l1.size()>l2.size())
    {
        return 1;
    }
    else if(l2.size()>l1.size())
    {
        return 0;
    }
    else
    {
        int i=l1.size()-1;// 从高位开始对比
        while(l1[i]==l2[i])
        {
            i--;
        }
        return i<0?1:l1[i]>l2[i];// 相等返回1 否则会出现-0
    }
}
void bignum_del(vector<int> &rs,vector<int> &l1,vector<int> &l2)
{
    int t=0;
    for(int i=0;i<l1.size();i++)
    {
        t=l1[i]-t;
        if(i<l2.size()) t-=l2[i];
        rs.push_back((t+10)%10);
        if(t<0) t=1;
        else t=0;
    }
    while(rs.size()>1&&rs.back()==0) rs.pop_back();
}
int main()
{
    string s1;
    string s2;
    cin>>s1;
    cin>>s2;
    vector<int> l1;
    vector<int> l2;
    for(int i=s1.size()-1;i>=0;i--)
    {
        l1.push_back(s1[i]-'0');
    }
    for(int i=s2.size()-1;i>=0;i--)
    {
        l2.push_back(s2[i]-'0');
    }
    vector<int> rs;
    if(cmp(l1,l2))
    {
        bignum_del(rs,l1,l2);
    }
    else
    {
        bignum_del(rs,l2,l1);
    }

    for(int i=rs.size()-1;i>=0;i--)
    {
        cout<<rs[i];
    }

}

一个高精度数乘以一个低精度数

比如 1234 *16

实际上 是 每一位16 我们关注 416 =64 本位留6 同时到3*16的时候 就需要 +6

 


// 最后剩的t不一定多少,要一点点处理
// 为了统一 加法也采用了这种方法
void bignum_mul(vector<int> &rs,vector<int> &l1,int b)
{
    int t=0;
    // 123 * 4
    //    2
    for(int i=0;i<l1.size()||t;i++)
    {
        if(i<l1.size()) t+=l1[i]*b;
        rs.push_back(t%10);
        t/=10;
    }
    while(rs.size()>1&&rs.back()==0) rs.pop_back();
}
int main()
{
    string s1;
    cin>>s1;
    int b=0;
    cin>>b;
    vector<int> l1;
    for(int i=s1.size()-1;i>=0;i--)
    {
        l1.push_back(s1[i]-'0');
    }
    vector<int> rs;
    bignum_mul(rs,l1,b);
    for(int i=rs.size()-1;i>=0;i--)
    {
        cout<<rs[i];
    }

}

234除以 3 注意 除法是从高位往后进行除

 

int bignum_div(vector<int> &rs,vector<int> &l1,int b)
{
    int t=0;
    for(int i=l1.size()-1;i>=0;i--)
    {
        t=t*10+l1[i];
        rs.push_back(t/b);
        t%=b;
    }
    reverse(rs.begin(),rs.end());
    while(rs.size()>1&&rs.back()==0) rs.pop_back();
    return t;
}
int main()
{
    string s1;
    cin>>s1;
    int b=0;
    cin>>b;
    vector<int> l1;
    for(int i=s1.size()-1;i>=0;i--)
    {
        l1.push_back(s1[i]-'0');
    }
    vector<int> rs;
    int t=bignum_div(rs,l1,b);
    for(int i=rs.size()-1;i>=0;i--)
    {
        cout<<rs[i];
    }
    cout<<endl;
    cout<<t;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值