3117 高精度练习之乘法

来源:互联网 发布:张国荣 知乎 编辑:程序博客网 时间:2024/05/21 06:25
3117 高精度练习之乘法 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold题目描述 Description给出两个正整数A和B,计算A*B的值。保证A和B的位数不超过500位。输入描述 Input Description读入两个用空格隔开的正整数输出描述 Output Description输出A*B的值样例输入 Sample Input3 12样例输出 Sample Output36数据范围及提示 Data Size & Hint两个正整数的位数不超过500位******************************去除前导0用的指针i可以初始值为la+lb-1,优化******************************乘法乘出来的数需要累加,不能像加法那样位数相对,故需要直接在答案数组上动手脚******************************加法也可以这样做,省去申请一个变量的空间 #include<iostream>#include<string.h>using namespace std;void Multiply(int a[],int b[],int la,int lb);void run(char a[],char b[]){int A[501],B[501];int i,j,la = strlen(a),lb = strlen(b);    memset(A,0,sizeof(A));    memset(B,0,sizeof(B));for(i = 0; i < la; i++){A[i] = a[la-i-1] - '0';}for(i = 0; i < lb; i++){B[i] = b[lb-i-1] - '0';}Multiply(A,B,la,lb);}void Multiply(int a[],int b[],int la,int lb){int i,j = 0,ANS[510];int tmp1 = 0 , tmp2 = 0;memset(ANS,0,sizeof(ANS));    for(i = 0; i < la; i++)    {    for(j = 0; j < lb; j++)    {    ANS[i+j] = a[i]*b[j] + ANS[i+j];    ANS[i+j+1] += ANS[i+j] / 10;ANS[i+j] %= 10;    }    }    i = la+lb-1; //i = 510 可否优化?     while(ANS[i] == 0) i--;    for(j = i; j >= 0; j--)        cout<<ANS[j];    cout<<endl;}int main(){char a[501],b[501];cin>>a>>b;run(a,b);return 0;}

0 0