L1-009 N个数求和 python
python实现:
需要考虑很多情况:
如果只输入一个数:分子/分母 是否有商,是否需要约分,如:8/3,-8/3,0/3。
如果输入多个数:通分后分子>0,<0还是=0,分子/分母 是否有商,是否需要约分。
num=int(input()) s=input() if num==1: fenzi=int(s.split("/")[0]) fenmu=int(s.split("/")[1]) if abs(fenzi)>fenmu: print("{shang} {fenzi}/{fenmu}".format(shang=int(fenzi/fenmu),fenzi=fenzi%fenmu,fenmu=fenmu)) elif abs(fenzi)==fenmu: print("{}".format(int(fenzi/fenmu))) else: print(s) else: lst=[] for i in range(num): si=s.split(' ')[i] temp_lst=[] fenzi=si.split('/')[0] fenmu=si.split('/')[1] temp_lst.append(int(fenzi)) temp_lst.append(int(fenmu)) lst.append(temp_lst) # eg: [[2,5],[4,15],[1,30],[-2,60],[8,3]] l=len(lst) for i in range(l): if i<=l-2: fenzi=lst[i+1][0]*lst[i][1]+lst[i][0]*lst[i+1][1] # 所有分数通分 fenmu=lst[i][1]*lst[i+1][1] lst[i+1][0]=fenzi lst[i+1][1]=fenmu fenzi = lst[l-1][0] # 通分后的分子 可能为 0,可能为负数 fenmu = lst[l-1][1] if fenzi==0: # 通分后分子为 0 print("0") else: # 通分后分子非 0 if fenzi>=0: flag=True # 标志正负数 else: flag=False fenzi=abs(fenzi) # 正负数取绝对值 if fenzi % fenmu == 0 and fenzi >= fenmu: # 分子/分母 刚好能整除 if flag: # 正数 print("{}".format(int(fenzi / fenmu))) else: # 负数 print("-{}".format(int(fenzi / fenmu))) else: # 不能整除 if fenzi > fenmu: # 分子>分母 first = int(fenzi / fenmu) second = fenzi % fenmu # 分子分母找公因子相除 second/fenmu m = max(second, fenmu) n = min(second, fenmu) t = m % n while t != 0: m, n = n, t t = m % n # 最大公约数为 n second_fenzi = int(second / n) second_fenmu = int(fenmu / n) if flag: # 正数 print("{shang} {fenzi}/{fenmu}".format(shang=first, fenzi=second_fenzi, fenmu=second_fenmu)) else: # 负数 print("-{shang} {fenzi}/{fenmu}".format(shang=first, fenzi=second_fenzi, fenmu=second_fenmu)) else: # 分子<分母 # 分子分母找公因子相除 fenzi/fenmu m = max(fenzi, fenmu) n = min(fenzi, fenmu) t = m % n while t != 0: m, n = n, t t = m % n # 最大公约数为 n fenzi = int(fenzi / n) fenmu = int(fenmu / n) if flag: # 正数 print("{fenzi}/{fenmu}".format(fenzi=fenzi, fenmu=fenmu)) else: # 负数 print("-{fenzi}/{fenmu}".format(fenzi=fenzi, fenmu=fenmu))