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

 

posted @ 2024-07-04 22:07  豆豆是只乖狗狗  阅读(7)  评论(0编辑  收藏  举报