p4_2_高精度_减法 python3

p4_2_高精度_减法

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

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

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

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

#加减乘除的存储格式是一样的, 因为在一个题目里面加减乘除是可能同时存在的
#整体减法是针对A>=B的,若A<B则-(B-A)   这个比较是不能直接比的要另外写一个算法因为这个是大整数,所以要写一个bool型,判断是否>=即可
#也没有考虑A或B为负数【只针对题目:给定两个正整数】如果需要考虑则

# A3 A2 A1 A0
#-   B2 B1 B0
#=C3 C2 C1 C0

#注意Bi是否存在
#先Ai-Bi-t,若>=0则Ci=Ai-Bi-t  下一步中t=0     其中t表示借位
#          若<0 则Ci=Ai-Bi+10-t, 下一步中t=1   即A[i+1]被借了1

#还有一个注意点:C的长度和A一样 但若123-120=003,实际只3就行,去前面的0,也要注意若只有1位就算是0也不能去


#综上需要注意的点包括:整体减法是针对A>=B的;借位,Bi是否存在;前导零
#def SUB(A,B):#先直接算


# python里面对列表的for循环可逆着来
# for i in range(len(A)-1,-1,-1)三个参数分别表示起-终[不含]-步长
#而我经常用的 for i in range(len(A))表示range(0,len(A),1)


def cmp(A,B):#判断A>=B  先比较长度,若相等再从高位开始比较  返回false是不是可以不写????
    # if len(A)>len(B): return True
    # if len(A)<len(B): return False
    if (len(A) != len(B)): return len(A) > len(B)#这个很秀哎!

    # else:
    #     for i in range(len(A)-1,-1,-1):#真实A=876 存储A=[6,7,8] x=0,1 2
    #         if A[i]!=B[i]: break#从右往左找不等的数
    #     if A[i]>B[i]: return True
    for i in range(len(A) - 1, -1, -1):#可以不用再else,因为前面if执行之后直接return会跳出函数不载执行后面的
        if(A[i] != B[i]): return A[i] > B[i]



def SUB(A,B):#大数减小数
    t=0
    C=[]
    for i in range(len(A)): #能用for的不用while,更简单!!!#只用写A,B不用 因为A比B大   #注意考虑B[i]没有的情况 每一位相减的数先t代替写,后面再处理t
        t=A[i]-t#先把A算了 再B 分开搞 不要按照先分析A-B-t的正负再决定要不要向下一位借位,这样还得同时考虑B是否在,公式就很复杂
        if i<len(B): t-=B[i]
        C.append((t+10)%10)#上面算的数是考虑了是否已经被借位,还需要考虑需不需要找下一位借位,如果t<0则需要借10,即10+t【这个数在0-9间】;如果t>=0,不需要借位,即t  这两种情况可以统一写为(t+10)%10
        if t>=0: t=0#因为还需要更新t,原来算出的A-B-t值t如果为正则表示不借位,即=0
        else: t=1
    #还要扫首部零:list.pop([index=-1]): 列表,移除index下标的数,一般默认index=-1即移除最后一个数
    #实际C为3 扫零之前为003 逆序在C中是300,所以直接扫尾部就行
    while len(C)>1 and C[-1]==0:#要保证len(C)>1,因为如果只是0,就不能删
        C.pop()
    C=int("".join(map(str,C[::-1])))#jion只针对字符串
    return C


if __name__=="__main__":
    A=list(map(int,input("A\n")))[::-1]#A,B均是列表,逆序排的
    B=list(map(int,input("B\n")))[::-1]
    if cmp(A, B): print(SUB(A,B))
    else: print(-SUB(B,A))#如果减法算出来的是字符串则必须print('-'+SUB(B,A))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值