高精度乘法 取模 去除前导零 AcWing 793. 高精度乘法

#include

using namespace std;

vector<int> mul(vector<int> &A,int &b)
{
    vector<int> C;
    
    for(int i=0,t=0;i<A.size()||t;i++)
    {
        if(i<A.size())
            t+=A[i]*b;
        C.push_back(t%10);
        t/=10;
    }
    
    while(C.size()>1&&C.back()==0)
        C.pop_back();
        
    return C;
}

int main()
{
    string a;
    int b;
    cin>>a>>b;
    
    vector<int> A;
    for(int i=a.size()-1;i>=0;i--)
        A.push_back(a[i]-'0');
    auto C=mul(A,b);
    for(int i=C.size()-1;i>=0;i--)
        cout<<C[i];
    cout<<endl;
    
    return 0;
}

和高精度加法,减法是一样的输入输出方式

有一点不一样的是,这里是把一个整型数字b看成是一个整体,所以其实不是真正意义上面的模拟乘法,至少和我们学的乘法有一些区别,我们平常的乘法是乘数和另一个乘数的每一位分别去乘,这里是一个乘数的每一位,和另一个整数的整体去乘

t来保存每一次计算的结果,然后把计算结果的个位存到答案数组里面,把除了个位的部分加到下一次计算中去,也就是标题说的取模的意思

最后A每一位遍历完了,要是还有t,再把t存进答案数组里面,这里和高精度加法是一样的,高精度加法是进位只可能是0或者1,这里的进位可能是一个比较大的数字

#include

using namespace std;

vector<int> mul(vector<int> &A,int b)
{
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size();i++)
    {
        t+=A[i]*b;
        C.push_back(t%10);
        t/=10;
    }
    
    while(t)
    {
        C.push_back(t%10);
        t/=10;
    }
    
    while(C.size()>1&&C.back()==0)
        C.pop_back();
    
    return C;
}

int main()
{
    string a;
    int b;
    cin>>a>>b;
    
    vector<int> A;
    for(int i=a.size()-1;i>=0;i--)
        A.push_back(a[i]-'0');
    
    auto C=mul(A,b);
    for(int i=C.size()-1;i>=0;i--)
        cout<<C[i];
    cout<<endl;
    
    return 0;
}

写成上面这样就和高精度加法的写法一模一样了

你可能感兴趣的:(算法竞赛,#,acwing算法基础,算法)