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))