高精度计算乘法 #
- 高精度计算的乘法原理
- 高精度计算的乘法描述
- 高精度计算的乘法实现
收获 #
学完本节内容,可以初步理解并掌握高精度计算的乘法实现。
高精度计算的乘法原理 #
乘法进位原理:
c[i+j]= a[i]*b[j] + x + c[i+j]; x = c[i+j]/10; c[i+j] %= 10;
高精度计算的乘法描述 #
类似加法,可以用竖式求乘法。在做乘法运算时,同样也有进位,同时对每一位进行乘法运算时,必须进行错位相加,如图3、图4。
分析c数组下标的变化规律,可以写出如下关系式:ci = c’i +c”i +…由此可见,c i跟a[i]*b[j]乘积有关,跟上次的进位有关,还跟原c i的值有关,分析下标规律,则算法描述如下:
int c[20];
void add(int a[],int b[]) //a,b,c都为数组,分别存储被乘数、乘数、结果
{
int i=1,x=0; //x是进位
for i<=a数组长度:
for j<=b数组长度:
{
c[i+j]= a[i]*b[j]+ x + c[i+j]; //第i+j位相加并加上次的进位
x=c[i+j]/10 ; //向高位进位
c[i+j]%=10; //存储第i+j位的值
i++; //位置下标变量
}
}
高精度计算的乘法实现 #
python实现代码如下:
#-------------对输入的数字进行数组形式进行倒序储存----------------------
a=input('请输入一个数字a')
b=input('请输入一个数字b')
a1=[0]*10#定义10位的数据长度
b1=[0]*10
la = len(a)#用a[0]计算字符串a的位数
lb= len(b)
#ord()将字符转化为ASCII码;chr()将ASCII码转化为字符
#倒序储存,原因是计算数值从低位算起,即从数组a1[0]处开始计算
for i in range(la):
a1[i]=ord(a[la-i-1])-ord('0')#将数串a转换为数组a1,并倒序存储(-0对应的相对数值,变成数组储存)
for j in range(lb):
b1[j] = ord(b[lb-j-1]) - ord('0')
#----------高精度计算之乘法运算,注意乘法结果错位相加---------
c=[0]*20#定义一个20位的数组
x=0#x为计算后的进位值
for i in range(10):#i=0,1假设两位数
for j in range(10):#j=0,1,2假设三位数
#下面思路同加法进位思路相同
c[i+j]=a1[i]*b1[j]+x+c[i+j]#错位相加,加上原位置的数值
x=c[i+j]//10
c[i+j]=c[i+j]%10
c.reverse()
#删除先导0
while c[0]==0:
c=c[1:]
print(c)
小结 #
理解并掌握高精度计算乘法的原理
用代码实现高精度计算的乘法运行
习题 #
- 习题1:通过“打竖式”的数学计算方法解释并模拟高精度计算乘法
- 习题2:仿照高精度计算乘法,用代码实现‘25‘x’387‘的结果