一本通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;
}