综合实战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函数进行例题实现