高精度乘法(模板)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wwwlps/article/details/88723884

好久没写过这个模板了水一发,注意细节。

两个正整数相乘,(长度均小于10000),结果

代码:(这里还考虑了输入和输出的前导零)

#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
char X[maxn],Y[maxn],A[maxn],B[maxn];
char C[maxn*maxn];
int temp[maxn];
int main()
{
    scanf("%s %s",A,B);
    int la=strlen(A);
    int lb=strlen(B);
    int cnz=1;
    int lz;
    for(int i=lb-1;i>=0;i--)
    {
        int val=B[i]-'0';
        int cnt=0;
        int jw=0;
        for(int j=la-1;j>=0;j--)
        {
            int nov=A[j]-'0';
            int tz=val*nov+jw;
            temp[cnt]=tz%10;
            jw=tz/10;
            if(i==lb-1)
            {
                C[cnt]=temp[cnt]+'0';
            }
            cnt++;
        }
        if(jw>0)
        {
            temp[cnt]=jw;
            if(i==lb-1)
                C[cnt]=temp[cnt]+'0';
            cnt++;
        }
        if(i==lb-1)
        {
            lz=cnt;
            continue;
        }
        int dw=0;
        for(int j=0;j<cnt;j++)
        {
            int tw;
            if(j+cnz>=lz)
                tw=0;
            else
                tw=C[j+cnz]-'0';
            int zw=tw+temp[j]+dw;
            C[j+cnz]=zw%10+'0';
            dw=zw/10;
        }
        lz=cnt+cnz;
        cnz++;
    }
    int flag=0;
    for(int i=lz-1;i>=0;i--)
    {
        if(C[i]=='0'&&flag==0&&i==0)
            printf("%c",C[i]);
        if(C[i]=='0'&&flag==0)
            continue;
        if(C[i]!='0') flag=1;
        printf("%c",C[i]);
    }
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wwwlps/article/details/88723884