基础算法-大数运算

基础算法-大数运算_第1张图片

大数运算

vector ls={1,2,3,4,5}

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

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

模拟这个过程即可4

基础算法-大数运算_第2张图片

#include
#include
using namespace std;
void bignum_add(vector & rs,vector &l1,vector &l2)
{
    if(l1.size()1&&rs.back()==0) rs.pop_back();
    }

}
int main()
{
    string s1;
    string s2;
    cin>>s1;
    cin>>s2;
    vector l1;
    vector 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 rs;
    bignum_add(rs,l1,l2);
    for(int i=rs.size()-1;i>=0;i--)
    {
        cout<

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

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

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

基础算法-大数运算_第3张图片

 

#include
#include
using namespace std;
void bignum_add(vector & rs,vector &l1,vector &l2)
{
    if(l1.size()1&&rs.back()==0) rs.pop_back();
    }

}
int cmp(vector &l1,vector &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 &rs,vector &l1,vector &l2)
{
    int t=0;
    for(int i=0;i1&&rs.back()==0) rs.pop_back();
}
int main()
{
    string s1;
    string s2;
    cin>>s1;
    cin>>s2;
    vector l1;
    vector 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 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<

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

比如 1234 *16

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

基础算法-大数运算_第4张图片

 


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

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

基础算法-大数运算_第5张图片

 

int bignum_div(vector &rs,vector &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 l1;
    for(int i=s1.size()-1;i>=0;i--)
    {
        l1.push_back(s1[i]-'0');
    }
    vector rs;
    int t=bignum_div(rs,l1,b);
    for(int i=rs.size()-1;i>=0;i--)
    {
        cout<

 

 

你可能感兴趣的:(leetcode马拉松,算法,c++,java)