本章基于高精度加法
这一章就不介绍读入和进位操作了,有需要的去上面那篇博客看。
很明显乘法不能简单的写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.