1. 主页
  2. 文档
  3. Level3题解(1-10)
  4. 第1课 高精度计算
  5. 高精度乘法

高精度乘法

高精度乘单精度

单精度数不需要转为数组存储
可以先用高精度数的每一位乘上单精度数,然后再用一个循环来处理进位,这里不可以同加法一样去边乘边处理进位

      999765
* 3216
-------------
3215244240

乘法模块中有三个循环

  • 第一个循环,高精度数的每一位乘上单精度数
  • 第二个循环,处理每一位上的进位
  • 第三个循环,处理最高位上的进位
void Mul(int a[],int b){
for(int i=1;i<=a[0];i++)//单精度数b和高精度数a的每一位相乘
a[i]*=b;
for(int i=1;i<=a[0];i++){//处理每一位上的进位
a[i+1]+=a[i]/10;
a[i]%=10;
}
while(a[a[0]+1]>0){//最高位上如果有进位则位数a[0]增加后继续处理,可根据情况决定是否要分成一位一位的
a[0]++;
a[a[0]+1]=a[a[0]]/10;
a[a[0]]%=10;
}
}


高精度乘高精度

       847
* 295
--------------
4235
7623
+ 1694
--------------
249865

在纸上写出并仔细分析上面的乘法竖式
因为假设的都是高精度数,只能一位一位来相乘,大致分成以下步骤:

一个高精度数上的每一位乘以另一个高精度数上的每一位(双重循环,实际上就是高精度乘单精度)
将每一个乘积值进行错位累加(在双重循环内)
最后处理累加的这个高精度数的进位
从上面可以看出高精度乘高精度的问题实质为若干个高精度乘单精度之和,即:

先高精度*单精度
再依次高精度+高精度


#define N 5005
void Mul(int a[],int b[],int c[]){
int i,j;
for(i=1;i<=a[0];i++)
for(j=1;j<=b[0];j++)
c[i+j-1]+=a[i]*b[j];//用c数组来存储错位累加的和
c[0]=a[0]+b[0];//位数最多为两个高精度为数之和
for(i=1;i<=c[0];i++){//处理进位
c[i+1]+=c[i]/10;
c[i]%=10;
}
while(c[0]>1&&c[c[0]]==0)c[0]--;//处理最高位多余的0,考虑了和0相乘的情况
return;
}
int main(){
int a[N],b[N],c[N];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
Read(a);
Read(b);
Mul(a,b,c);
Out(c);
return 0;
}


请根据代码写出上面竖式乘法进行计算的过程

               847
* 295
--------------------------
40 20 35
72 36+40 63+20 35
16 8+72 14+36+40 63+20 35
16 80 90 83 35
249865
前面没有多余0