标签:
这个专题呢,我就来讲讲高精度的乘法,下面是三个计算乘法的函数,第一个函数是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 }
高精度运算专题3-乘法运算(The multiplication operation)
标签:
原文地址:http://www.cnblogs.com/geek-007/p/4374815.html