求助求助(AC必关)

P1303 A*B Problem

caozhihan @ 2024-08-31 11:33:27

A*B Problem

题目背景

高精度乘法模板题。

题目描述

给出两个非负整数,求它们的乘积。

输入格式

输入共两行,每行一个非负整数。

输出格式

输出一个非负整数表示乘积。

样例 #1

样例输入 #1

1 
2

样例输出 #1

2

提示

每个非负整数不超过 10^{2000}

#include <bits/stdc++.h>
using namespace std; 
string PLUS (string,string);
int main()
{
    string x,y,sum="",mstr;
    int a[500001],b[500001],c[1000001],t[500001],m[500001],i,j,l,k,lena,lenb,len,lent,lenm,p=0;
    cin>>x;
    cin>>y;
    for(i=0;i<x.size();i++) a[i+1]=x[i]-'0';
    for(j=0;j<y.size();j++) b[j+1]=y[j]-'0';
    lena=i;lenb=j;
    len=max(lena,lenb);
    if(lena<lenb)
    {
        for(i=1;i<=lena;i++)
        { 
            t[i]=a[i];
        }
        for(i=1;i<=lenb;i++)
        {
            a[i]=b[i];
        }
        for(i=1;i<=lena;i++)
        {
            b[i]=t[i];
        }
        lent=lena;
        lena=lenb;
        lenb=lent;
    }
    if(lena<len)
    {
        l=len;
        a[len]=a[lena];
        a[lena]=0;
        for(k=lena-1;k>=1;k--)
        {
            a[l-1]=a[k];
            a[k]=0;
            l--;
        }
    }
    if(lenb<len)
    {
        l=len;
        b[len]=b[lenb];
        b[lenb]=0;
        for(k=lenb-1;k>=1;k--)
        {
            b[l-1]=b[k];
            b[k]=0;
            l--;
        }
    }
    bool z; 
    for(i=len;i>=1;i--)
    {
        lenm=len;
        mstr="";
        z=false;
        if(b[i]==0) mstr="0";
        else
        {
            for(j=len;j>=1;j--)
            {
                m[j]=b[i]*a[j]+p;
                p=0;
                p=m[j]/10;
                m[j]%=10;
            }
            if(p>0)
            {
                mstr=char(p+'0');
                z=true;
            }
            for(k=1;k<=lenm;k++)
            {
                if(z||m[k]!=0) mstr+=char(m[k]+'0');
            }
            for(l=1;l<=len-i;l++)
            {
                mstr+="0";
            }
            sum=PLUS(sum,mstr);
        }
    }
    z=false;
    for(i=0;i<sum.size();i++)
    {
        if(sum[i]!=0||z)
        {
            cout<<sum[i];
            z=true;
        }
    }
    if(!z) cout<<0;
    return 0;
}
string PLUS (string x,string y) 
{
    string ans;
    int a[5001],b[5001],c[5001];
    int i,j,k,l,p=0,len;
    for(i=0;i<x.size();i++) a[i+1]=x[i]-'0';
    for(j=0;j<y.size();j++) b[j+1]=y[j]-'0';
    len=max(i,j);
    if(i<len)
    {
        l=len;
        a[len]=a[i];
        a[i]=0;
        for(k=i-1;k>=1;k--)
        {
            a[l-1]=a[k];
            a[k]=0;
            l--;
        }
    }
    if(j<len)
    {
        l=len;
        b[len]=b[j];
        b[j]=0;
        for(k=j-1;k>=1;k--)
        {
            b[l-1]=b[k];
            b[k]=0;
            l--;
        }
    }
    for(i=len;i>=1;i--)
    {
        c[i]=a[i]+b[i]+p;
        p=0;
        if(c[i]>=10)
        {
            p=1;
            c[i]%=10;
        }
    }
    bool z=false;
    if(p==1)
    {
        ans+="1";
    }
    for(i=1;i<=len;i++)
    {
        if(z||c[i]!=0)
        {
            ans+=char(c[i]+'0');
            z=true;
        }
    }
    if(!z) ans+="0";
    return ans;
}

by zjr2014 @ 2024-08-31 11:38:16

#include<bits/stdc++.h>
using namespace std;
int a[1000001]={0},alen,b[1000001]={0},blen,c[1000001]={0},clen;
string x,y;
int main(){
    cin>>x>>y;
    for(int i=0;i<x.size();i++){
        a[x.size()-i]=x[i]-'0';
        alen++;
    }
    for(int i=0;i<y.size();i++){
        b[y.size()-i]=y[i]-'0';
        blen++;
    }
    for(int i=1;i<=alen;i++){
        for(int j=1;j<=blen;j++){
            c[i+j-1]+=a[i]*b[j];
            c[i+j]+=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
    }
    clen=alen+blen-1;
    if(c[alen+blen]!=0){
        clen++;
    }
    for(int i=clen;i>=2;i--){
        if(c[i]==0){
            clen--;
        }
        else{
            break;
        }
    }
    for(int i=clen;i>=1;i--){
        cout<<c[i];
    }
    return 0;
}

by 枫原万叶 @ 2024-08-31 11:41:42

@caozhihan 建议用python

from decimal import *
import sys
setcontext(Context(prec=2000000, Emax=2000000, Emin=0)) 
print((Decimal(sys.stdin.readline())*Decimal(sys.stdin.readline())))

by fu1013 @ 2024-10-15 21:43:14

python一行水过

print(int(input())*int(input()))

如果要用c++的话那么看下面的模版

#include <bits/stdc++.h>
using namespace std;

int a[2001],b[2001],c[4002];
char a1[2001],b1[2001];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>a1>>b1;
    int i = 0;
    int la = strlen(a1);
    int lb = strlen(b1);
    for (i = 0; i < la; i++)a[la - 1 - i] = a1[i] - 48;
    for (i = 0; i < lb; i++)b[lb - 1 - i] = b1[i] - 48;
    int m = la + lb ;
    for (int i = 0; i < la; i++) {
        for (int j = 0; j < lb; j++) {
            c[i + j] += a[i] * b[j];
        }
    }
    for (int i = 0; i < m; i++) {
        c[i + 1] += c[i] / 10;
        c[i] %= 10;
    }
    while (c[m] == 0 && m >= 1)m--;
    for (i = m; i >= 0; i--){
        cout<<c[i];
    }
    return 0;
}

|