跳至正文
View Categories

1 min read

综合实战1 #

  1. 高精度计算的例题演练
  2. 高精度计算的例题拆解
  3. 高精度计算的例题实现

收获 #

学完本节内容,可以进一步理解高精度计算算法的实现。

高精度计算的例题演练 #

问题:
求两个大整数的相减的结果
输入:
有两行,每一行是被减数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. 习题1:使用流程图对本节中例题进行演示
  2. 习题2:使用decimal函数进行例题实现