【高精度乘法】

本章基于高精度加法
这一章就不介绍读入和进位操作了,有需要的去上面那篇博客看。
很明显乘法不能简单的写c[i]=a[i]*b[i];了。
那么怎么写?
根据乘法的错位计算原理,我们可以很轻松地写出:
c[i+j]=a[i]*b[j];
那么就很轻松的改一改加法的代码 写出来了。
然后说输出问题。
一个m位数*一个n位数,结果会是几位数?
很明显,要么是m+n位,要么是m+n-1位。
那么输出的时候将c数组前面是0的位数给排除,输出即可。
这一段的代码实现:

int q=aa.size()+bb.size();
while(!c[q])q--;
for(int i=q;i>=0;i--)
{
	cout<<c[i];
} 
cout<<endl;

代码如下:(附加一个高精加法自定义函数)

#include<bits/stdc++.h>
using namespace std;
string aa,bb;
int a[10010],b[10010],c[20020];
void add()
{
	memset(c,0,sizeof(c));
	for(int i=0;i<max(aa.size(),bb.size());i++)
	{
		c[i]=a[i]+b[i];
	}
	for(int i=1;i<max(aa.size(),bb.size())+1;i++)
	{
		c[i]+=c[i-1]/10;
		c[i-1]%=10;
	}
	if(c[max(aa.size(),bb.size())])cout<<c[max(aa.size(),bb.size())];
	for(int i=max(aa.size(),bb.size())-1;i>=0;i--)
	{
		cout<<c[i];
	} 
	cout<<endl;
	return;
}
void times()
{
	memset(c,0,sizeof(c));
	for(int i=0;i<aa.size();i++)
	{
		for(int j=0;j<bb.size();j++)
		{
			c[i+j]+=a[i]*b[j];
		}
	}
	for(int i=0;i<aa.size()+bb.size()+1;i++)
	{
		c[i]+=c[i-1]/10;
		c[i-1]%=10;
	}
	int q=aa.size()+bb.size();
	while(!c[q])q--;
	for(int i=q;i>=0;i--)
	{
		cout<<c[i];
	} 
	cout<<endl;
}
int main()
{
	char mark;
	cin>>aa>>bb;
	for(int i=0;i<=aa.size()-1;i++)
	{
		a[i]=aa[aa.size()-i-1]-'0';
	}
	for(int i=0;i<=bb.size()-1;i++)
	{
		b[i]=bb[bb.size()-i-1]-'0';
	}
	add();
	times();
	return 0;
}

ov.

posted @ 2019-06-09 12:08  摸鱼酱  阅读(206)  评论(0编辑  收藏  举报