高精度运算专题3-乘法运算(The multiplication operation)

时间:2023-12-28 11:37:14

这个专题呢,我就来讲讲高精度的乘法,下面是三个计算乘法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回数组a里面

函数1思路:要先把char类型的转换成int类型的数,直接每个数-‘0’就可以实现把char类型的转换成int类型的了。

①记录数组a、数组b的长度,放到第一位

②每个位相乘,用一个数来记录进位(初值为0),每个位相乘,加上进位,存入c数组的相对应的位置,每次进位要重新赋值

③最后记得要去掉最高位的0,并把c数组的长度存到第一号位置(c[0])

代码如下:

 void mul(char strA[],char strB[],int c[])//正整数的高精度运算 a*b ---> c
{
int a[MaxLength],b[MaxLength];
int i,j,x,lenc;
memset(a,,sizeof(a));//测a长度
memset(b,,sizeof(b));//测b长度
memset(c,,sizeof(c));//测c长度
init(strA,a);//a转换成数字
init(strB,b);//b转换成数字
for(i=;i<=a[];i++)
{
x=;//表示进位,记录
for(j=;j<=b[];j++)//重要的在这里
{
c[i+j-]+=a[i]*b[j]+x;//每个位相乘,加上进位存入c数组
x=c[i+j-]/;//x重新赋值为进位
c[i+j-]=c[i+j-]%;//保留1位
}
c[i+b[]]=x;//表示进位(向c的更高位进位)
}
lenc=a[]+b[];//c的长度就是a+b的长度
while(c[lenc]==&&lenc>) lenc--;//去除高位上多余的0
c[]=lenc;
}

函数2思路:这个函数与函数1没什么太大区别,只是传入的数组类型不一样而已,这个函数不用把字符串数组转换成数字数组,直接计算即可

代码如下:

 void mul2(int a[],int b[],int c[])//正整数的高精度运算 a*b ---> c
{
int i,j,x,lenc;
memset(c,,sizeof(c));
for(i=;i<=a[];i++)
{
x=;//表示进位
for(j=;j<=b[];j++)
{
c[i+j-]=c[i+j-]+a[i]*b[j]+x;
x=c[i+j-]/;
c[i+j-]=c[i+j-]%;
}
c[i+b[]]=x;//表示进位(向c的更高位进位)
}
lenc=a[]+b[];//c的长度就是a+b的长度
while(c[lenc]==&&lenc>) lenc--;//去除高位上多余的0
c[]=lenc;
}