综合实战1 #
- 高精度计算的例题演练
- 高精度计算的例题拆解
- 高精度计算的例题实现
收获 #
学完本节内容,可以进一步理解高精度计算算法的实现。
高精度计算的例题演练 #
问题:
求两个大整数的相减的结果
输入:
有两行,每一行是被减数a,第二行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导0;
输出:
一行,即所求的差。
样例输入:
99999999999999999999999999999999999(被减数)
9999999999999999(减数)
样例输出:
99999999999999999990000000000000000
高精度计算的例题拆解 #
1.将字符形式的输入转化为数组倒序储存
for i in range(lp): passi_num1[i]=ord(passi_num[lp-i-1])-ord('0')#将数串a转换为数组a1,并倒序存储(-0对应的相对数值,变成数组储存) for j in range(ln): num1[j] = ord(num[ln-j-1]) - ord('0')
2.借位相减
while clen<lp: c[clen]=passi_num1[clen]-num1[clen]+x if c[clen]<0:#小于0的时候借位 x=-1#借位 c[clen] += 10 # 竖式运算,借位补10 else: x=0 clen+=1 c.reverse()#倒序输出
高精度计算的例题实现 #
#注意:要以字符形式进行输入 passi_num='99999999999999999999999999999999999' num='9999999999999999' lp=len(passi_num)#被减数长度 ln=len(num)#减数长度 #建立一个200位的储存数组 passi_num1=[0]*200 num1=[0]*200 #ord()将字符转化为ASCII码;chr()将ASCII码转化为字符 #倒序储存,原因是计算数值从低位算起,即从数组a1[0]处开始计算 for i in range(lp): passi_num1[i]=ord(passi_num[lp-i-1])-ord('0')#将数串a转换为数组a1,并倒序存储(-0对应的相对数值,变成数组储存) for j in range(ln): num1[j] = ord(num[ln-j-1]) - ord('0') c=[0]*200#初始化储存数组 clen=0#clen为计算后的位数 x=0#x为借位值 while clen<lp: c[clen]=passi_num1[clen]-num1[clen]+x if c[clen]<0:#小于0的时候借位 x=-1#借位 c[clen] += 10 # 竖式运算,借位补10 else: x=0 clen+=1 c.reverse()#倒序输出 #删除先导0 while c[0]==0: c=c[1:] print(c) #输出一下高精度计算与正确值的位数,确保输出准确 print(len(c)) print(len('99999999999999999990000000000000000'))
小结 #
复习巩固高精度计算的加减乘除运算
掌握并复现本节的例题
习题 #
- 习题1:使用流程图对本节中例题进行演示
- 习题2:使用decimal函数进行例题实现