大数运算

题目 大数运算

image-a6bdddd1

思路分析

有被这题无语到……

难度不大 就是考虑的情况很多 然后对0的特判

不难 但麻烦 写了240多行……纯浪费时间的题

有个意义点就是 这里的大整数乘法是两个大整数相乘

image-b4fef796
vector<int> mul(vector<int>& A,vector<int> &B)

{

       vector<int> C(A.size()+B.size(),0);

       for(int i=0;i<A.size();i++)

              for(int j=0;j<B.size();j++)

                     C[i+j]+=A[i]*B[j];

       int t=0;

       for(int i=0;i<C.size();i++)

       {

              t+=C[i];

              C[i]=t%10;

              t/=10;

       }

       while(C.size()>1 && C.back()==0)

              C.pop_back();

       return C;

 }

代码实现

#include<bits/stdc++.h>

using namespace std;

vector<int> add(vector<int> &A,vector<int> &B)

{

    vector<int> C;

    int t=0;

    for(int i=0;i<A.size() || i<B.size();i++)

    {

        if(i<A.size())

            t+=A[i];

        if(i<B.size())

            t+=B[i];

        C.push_back(t%10);

        t/=10;

    }

    if(t)

        C.push_back(1);

    return C;

}

bool cmp(vector<int> &A,vector<int> &B)

{

    if(A.size()!=B.size())

        return A.size()>B.size();

    for(int i=A.size()-1;i>=0;i--)

    {

        if(A[i]!=B[i])

        {

            return A[i]>B[i];

        }

    }

    return true;

}

vector<int> sub(vector<int> &A,vector<int> &B)

{

    vector<int> C;

    int t=0;

    for(int i=0;i<A.size();i++)

    {

        t=A[i]-t;

        if(i<B.size())

            t-=B[i];

        C.push_back((t+10)%10);

        if(t<0)

            t=1;

        else

            t=0;

    }

    while(C.size()>1 && C.back()==0)

        C.pop_back();

    return C;

}

vector<int> mul(vector<int>& A,vector<int> &B)

{

    vector<int> C(A.size()+B.size(),0);

    for(int i=0;i<A.size();i++)

        for(int j=0;j<B.size();j++)

            C[i+j]+=A[i]*B[j];

    int t=0;

    for(int i=0;i<C.size();i++)

    {

        t+=C[i];

        C[i]=t%10;

        t/=10;

    }

    while(C.size()>1 && C.back()==0)

       C.pop_back();

    return C;

}

int main()

{

    vector<int> A,B,C,D,E; // C加法,D减法,E乘法

    string a,b;

    cin>>a>>b;

    //AB里面只留数值 不留符号 正负去ab里面找

    for(int i=a.size()-1;i>=0;i--) // 输入a

        if(a[i]!='-')

            A.push_back(a[i]-'0');

    for(int i=b.size()-1;i>=0;i--) // 输入b

        if(b[i]!='-')

            B.push_back(b[i]-'0');

    if(a[0]!='-' && b[0]!='-') // 即a+b,a-b,a*b

    {

        C=add(A,B); // 加法

        for(int i=C.size()-1;i>=0;i--)

            cout<<C[i];

        cout<<endl;

        if(cmp(A,B))

            D=sub(A,B); // 减法

        else

        {

            D=sub(B,A);

           if(D.size() == 1 && D[0] == 0);

            else

                cout<<'-';

        }

        if(D.size() == 1 && D[0] == 0)

            cout<<0<<endl;

        else

        {

            for(int i=D.size()-1;i>=0;i--)

                cout<<D[i];

            cout<<endl;

        }

        E=mul(A,B); // 乘法

        for(int i=E.size()-1;i>=0;i--)

            cout<<E[i];

        cout<<endl;

    }

    else if(a[0]=='-' && b[0]=='-') // 即(-a)+(-b),(-a)-(-b),(-a)*(-b)

    {

        C=add(A,B); // 加法 两个负数相加不可能为0

        cout<<'-';

        for(int i=C.size()-1;i>=0;i--)

            cout<<C[i];

        cout<<endl;

        if(cmp(A,B)) //若A负的多 结果可能为<=0 所以对0特判

        {

            D=sub(A,B); // 减法

            if(D.size() == 1 && D[0] == 0);

            else

                cout<<'-';

        }

        else //B负的多 结果为正

        {

            D=sub(B,A);

        }

        if(D.size() == 1 && D[0] == 0)

        {

            cout<<0<<endl;

        }

        else

        {

             for(int i=D.size()-1;i>=0;i--)

                cout<<D[i];

            cout<<endl;

        }

        E=mul(A,B); // 乘法 俩负数相乘结果为正

        for(int i=E.size()-1;i>=0;i--)

            cout<<E[i];

        cout<<endl;

    }

    else if(a[0]=='-' && b[0]!='-') // (-a)+b,(-a)-b,(-a)*b

    {

        //加 考虑ab谁大

        if(cmp(A,B)) //a负的多的话 -3+2=-(3-2) 即-(a-b) 一样大时可能为0 得特判

        {

            D=sub(A,B);

            if(D.size() == 1 && D[0] == 0);

            else

                cout<<'-';

        }

        else//B更大的话 等价于B-A 结果一定为正

        {

            D=sub(B,A);

        }

        if(D.size() == 1 && D[0] == 0)

           cout<<0<<endl;

        else

        {

            for(int i=D.size()-1;i>=0;i--)

                cout<<D[i];

            cout<<endl;

        }

        //减 (-a)-b 相当于 -(a+b) 结果一定是负 不可能为0

        C=add(A,B);

        cout<<'-';

        for(int i=C.size()-1;i>=0;i--)

            cout<<C[i];

        cout<<endl;

        E=mul(A,B); // 乘法 若b为0的话 结果为0 得特判

        if(E.size() == 1 && E[0] == 0)

           cout<<0<<endl;

        else

        {

            cout<<'-';

            for(int i=E.size()-1;i>=0;i--)

            {

                cout<<E[i];

            }

            cout<<endl;

        }

    }

    else if(a[0]!='-' && b[0]=='-') // a+(-b),a-(-b),a*(-b)

    {

        // 加 还是一样 看ab谁大

        if(cmp(A,B)) //若a大 结果一定大于0

            D=sub(A,B);

        else //2+(-3)=-(3-2) 即-(b-a) 可能为0 得特判

        {

            D=sub(B,A);

            if(D.size() == 1 && D[0] == 0);

            else

                cout<<'-';

        }

        if(D.size() == 1 && D[0] == 0)

            cout<<0<<endl;

        else

        {

            for(int i=D.size()-1;i>=0;i--)

                cout<<D[i];

            cout<<endl;

        }

        // 减 a-(-b)相当于a+b

        C=add(A,B);

        for(int i=C.size()-1;i>=0;i--)

            cout<<C[i];

        cout<<endl;

        // 乘 a为0 结果为0 特判

        E=mul(A,B);

        if(E.size() == 1 && E[0] == 0)

            cout<<0<<endl;

        else

        {

            cout<<'-';

            for(int i=E.size()-1;i>=0;i--)

            {

                cout<<E[i];

            }

            cout<<endl;

        }

    }

    return 0;

}

同类题型

视频讲解


⬅️ 变成1 🏠 00-刷题理模型 ➡️ 趣味数字