一本通1174 高精度乘法

【题目描述】

求两个不超过200位的非负整数的积。

【输入】

有两行,每行是一个不超过200位的非负整数,没有多余的前导0。

【输出】

一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

【输入样例】

12345678900
98765432100

【输出样例】

1219326311126352690000

代码


#include<iostream>
#include<cstdio>
#include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; int main() { char a1[201],b1[201]; int a[201]={0},b[201]={0},c[10001]={0},lena,lenb,lenc,i,j,x; scanf("%s",a1); scanf("%s",b1); lena=strlen(a1),lenb=strlen(b1); for(i=0;i<lena;i++) a[lena-i]=a1[i]-48; for(i=0;i<lenb;i++) b[lenb-i]=b1[i]-48; for(i=1;i<=lena;i++) { x=0; for(int j=1;j<=lenb;j++) { c[i+j-1]=c[i+j-1]+x+a[i]*b[j];//乘法不是对位相乘,而是每一位都要乘,所以要找一下规律,就是第i+j-1位是第i位乘以第j位再加上进的数,这次可不一定只是1了。但是最需要注意的一点是,要加上这位原有的数。
比如说,一个两位数乘以两位数,那么列竖式计算的时候,结果的第二位实际上是加了两次,所以不能抛弃原来的第一个数 x=c[i+j-1]/10; c[i+j-1]%=10; } c[i+lenb]=x; } lenc=lena+lenb;最大也不会超过两个乘数数位的和,比如说99*99,这样结果四位。为什么呢?你看,假设有5位,那么结果必定大于10000,但是即使是99*100,才9900,而99*99已经是每一位都取最大的数了,所以不能超过 while(c[lenc]==0&&lenc>1) lenc--; for(i=lenc;i>=1;i--) cout<<c[i]; return 0; }

猜你喜欢

转载自www.cnblogs.com/57xmz/p/12370825.html
今日推荐