蓝桥杯Python——day3高精度

模拟人在运算时,从小位运算并进位借位

Tips

  1. 大数要用列表来存,输入时字符串可以用list转换为列表
  2. 关于进位借位问题,都是向大位进位或者借位,因此将列表reverse
  3. 对于一些特殊情况,结果得0或者高位为0,则需要在开始或者最后考虑

几道例题

高精度加法

给定两个正整数(不含前导 0),计算它们的和。

输入格式
共两行,每行包含一个整数。

输出格式
共一行,包含所求的和。

数据范围
1≤整数长度≤100000
输入样例:
12
23
输出样例:
35

a = list(input())
b = list(input())

if len(a) < len(b) :
    a, b = b, a
a.reverse()
b.reverse()

for i in range(len(b)) :
    a[i] = ord(a[i]) + ord(b[i]) -ord('0')
for i in range(len(b), len(a)) :
    a[i] = ord(a[i])
for i in range(len(a) - 1) :
    if a[i] > ord('9') :
        a[i] -= 10
        a[i + 1] += 1
if a[len(a) - 1] > ord('9') :
    a[len(a) - 1] -= 10
    a += [ord('1')]
for i in range(len(a)) :
    a[i] = chr(a[i])

a.reverse()
print("".join(a))

其实这题直接用整数列表存更方便

高精度减法

给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。

输入格式
共两行,每行包含一个整数。

输出格式
共一行,包含所求的差。

数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21

a = list(input())
b = list(input())
tmp1 = a[:]
tmp2 = b[:]
a.reverse()
b.reverse()

if len(a) < len(b) or (len(a) == len(b) and  tmp1 < tmp2):
    a, b = b, a
    print("-", end="")

for i in range(len(b)) :
    a[i] = ord(a[i]) - ord(b[i]) + ord('0')
for i in range(len(b), len(a)) :
    a[i] = ord(a[i])

for i in range(len(a) - 1) :
    if a[i] < ord('0') :
        a[i] += 10
        a[i + 1] -= 1
    a[i] = chr(a[i])
a[len(a) - 1] = chr(a[len(a) - 1])
a.reverse()
if "".join(a).lstrip('0') == "" :
    print(0)
else :
    print("".join(a).lstrip('0'))

这里默认将a列表作为较大的数,这里首先比较了长度,长度相等的话,按字典比较大小

高精度乘法

给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。

输入格式
共两行,每行包含一个整数。

输出格式
共一行,包含所求的差。

数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21

A = list(map(int,list(input())))
B = int(input())
C = []
A.reverse()
if (len(A) == 1 and A[0] == 0) or B == 0:
    print(0)
else :
    t = 0
    for i in range(len(A)) :
        t += A[i] * B
        C.append(t % 10)
        t //= 10
    if t != 0 :
        C.append(t)
    C.reverse()
    for i in C :
        print(i, end = "")

可以看出非常简洁,因为B数字是个小数,所以可以对A列表的每一位进行运算,通过对每一位的保存来进行运算
特别注意的是,A = list(map(int,list(input())))用该方法将一串数字字符串,转化为整数列表

总结

和同学聊了才发现emmm,原来Python将数值类型封装的太好了,无论一个数再大也不会发生越界现象,上面的高精度运算都可以直接用a+b,a-b,a*b来完成。哈哈哈,大乌龙,还是对Python的特性不够了解。不过对高精度的练习可以提高对问题的模拟能力,只能这样安慰自己了doge。

posted @   chanxe  阅读(203)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示