• 周四. 6月 30th, 2022

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

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

admin

11月 28, 2021

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

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

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

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

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

代码如下:

 1 void mul(char strA[],char strB[],int c[])//正整数的高精度运算 a*b ---> c
 2 {
 3     int a[MaxLength],b[MaxLength];
 4     int i,j,x,lenc;
 5     memset(a,0,sizeof(a));//测a长度 
 6     memset(b,0,sizeof(b));//测b长度 
 7     memset(c,0,sizeof(c));//测c长度 
 8     init(strA,a);//a转换成数字 
 9     init(strB,b);//b转换成数字 
10     for(i=1;i<=a[0];i++)
11     {
12         x=0;//表示进位,记录 
13         for(j=1;j<=b[0];j++)//重要的在这里 
14         {
15             c[i+j-1]+=a[i]*b[j]+x;//每个位相乘,加上进位存入c数组 
16             x=c[i+j-1]/10;//x重新赋值为进位 
17             c[i+j-1]=c[i+j-1]%10;//保留1位 
18         }
19         c[i+b[0]]=x;//表示进位(向c的更高位进位)
20     }
21     lenc=a[0]+b[0];//c的长度就是a+b的长度 
22     while(c[lenc]==0&&lenc>1)  lenc--;//去除高位上多余的0 
23     c[0]=lenc;
24 }

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

代码如下:

 1 void mul2(int a[],int b[],int c[])//正整数的高精度运算 a*b ---> c
 2 {
 3     int i,j,x,lenc;
 4     memset(c,0,sizeof(c));
 5     for(i=1;i<=a[0];i++)
 6     {
 7         x=0;//表示进位
 8         for(j=1;j<=b[0];j++)
 9         {
10             c[i+j-1]=c[i+j-1]+a[i]*b[j]+x;
11             x=c[i+j-1]/10;
12             c[i+j-1]=c[i+j-1]%10;
13         }
14         c[i+b[0]]=x;//表示进位(向c的更高位进位)
15     }
16     lenc=a[0]+b[0];//c的长度就是a+b的长度 
17     while(c[lenc]==0&&lenc>1)  lenc--;//去除高位上多余的0 
18     c[0]=lenc;
19 }

发表评论

您的电子邮箱地址不会被公开。