一本通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; }
原文地址:https://www.cnblogs.com/57xmz/p/12370825.html