<center>

问题 J: 【高精度】高精度乘法

时间限制: 1 Sec  内存限制: 64 MB
提交: 34  解决: 17
[提交][状态][讨论版]
</center>

题目描述

牢门上的第三道锁,需要使用高精度乘法来破译出相应密码,当然,必须使用“万进制算法”计算两个非负整数A、B的积,其中A和B的位数在10000位以内。

输入

共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A、B的位数均在10000以内。

输出

输出一个数,即A和B的乘积。

样例输入

2
3

样例输出

6

代码:
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

char a[10001];//储存a,由低位到高位
char b[10001];//储存a,由低位到高位
char c1[10001];//临时存储
char c2[10001];//临时存储
int f[20000]={0};//存放结果,逆序

void cheng(int la,int lb){
    int k=0;
    int ge;
    int shi;
    if(la>=lb){
        for(int i=0;i<lb;i++){
            for(int j=0;j<la;j++){
                f[k+j]+=(a[j]-'0')*(b[i]-'0');
            }
            k++;
        }
        for(int l=0;l<=(la+lb-1);l++){
            if(f[l]>=10){
                ge=f[l]%10;
                shi=f[l]/10;
                f[l]=ge;
                f[l+1]+=shi;
            }
        }
    }
    if(la<lb){
        for(int i=0;i<la;i++){
            for(int j=0;j<lb;j++){
                f[k+j]+=(b[j]-'0')*(a[i]-'0');
            }
            k++;
        }
        for(int l=0;l<=(lb+la-1);l++){
            if(f[l]>=10){
                ge=f[l]%10;
                shi=f[l]/10;
                f[l]=ge;
                f[l+1]+=shi;
            }
        }
    }
}

void print(int l){
    int k=0;
    for(int j=l;j>=0;j--){
        if(f[j]==0){
            k++;
        }else{
            break;
        }

    }
    if(k==l+1){
        printf("0");
    }else{
        for(int i=l-k;i>=0;i--){
            printf("%d",f[i]);
        }
    }
}

int main()
{
    int la;
    int lb;
    while(scanf("%s %s",c1,c2)!=EOF){
        la=strlen(c1);
        for(int i=0;i<la;i++){
            a[i]=c1[la-1-i];
        }
        lb=strlen(c2);
        for(int i=0;i<lb;i++){
            b[i]=c2[lb-1-i];
        }
        cheng(la,lb);
        print(la+lb-1);
        printf("\n");
        memset(f,0,20000*sizeof(int));
    }
    return 0;
}