题目:

本题要求编写程序,计算 2 个有理数的和、差、积、商。
输入格式:
输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。
输出格式:
分别在 4 行中按照 有理数1 运算符 有理数2 = 结果 的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b,其中 k 是整数部分,a/b 是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf。题目保证正确的输出中没有超过整型范围的整数。
输入样例 1:
2/3 -4/2
输出样例 1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
输入样例 2:
5/3 0/6
输出样例 2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

思路:这个题目感觉比其它20分的题目复杂多了,看代码量就能看出来,理清题目的思路很重要,首先还是对输入的数进行分割,获取单个值,然后用列表的原因是可以顺便将有符号的数字包括进去,列表第一个下标是‘-’,则该数字为负数,函数fun为格式输出函数,根据题意一共有四种情况,然后很重要的一个函数是求最大公约数的函数,这个函数在化简时需要用到。仔细看代码的话应该还是很懂。总体来说该题目比较复杂,做了很久很久

def gcd(m, n):  # 欧几里得算法
    m, n = abs(m), abs(n)
    if m < n:
        m, n = n, m
    while m % n != 0:
        r = m % n
        m, n = n, r
    return int(n)  # 返回最大公约数,这个在进行四则运算时是非常重要的


def fun(x):  # 该函数的功能为正确格式显示对应的数
    x1, x2 = list(map(int, x.split('/')))
    if int(x1) == 0:
        return '0'
    if x1 % x2 == 0:
        return '(' + str(int(x1 / x2)) + ')' if x[0] == '-' else int(x1 / x2)
    n = gcd(x1, x2)
    x1, x2 = int(x1 / n), int(x2 / n)
    if abs(x1) <= abs(x2):
        temp = '(' + str(x1) + '/' + str(x2) + ')' if x[0] == '-' else str(x1) + '/' + str(x2)
    else:
        if x[0] == '-':
            temp = '(-' + str(int(abs(x1) // x2)) + ' ' + str(abs(x1) - int(abs(x1) // x2 * x2)) + '/' + str(x2) + ')'
        else:
            temp = str(int(x1 // x2)) + ' ' + str(x1 - int(x1 // x2 * x2)) + '/' + str(x2)
    return temp


def add(x1, x2, y1, y2):  # 下面都是得到相应的分子和分母
    g = gcd(x2, y2)
    mu, zi = x2 * y2 / g, x1 * y2 / g + y1 * x2 / g
    return result(mu, zi)


def minus(x1, x2, y1, y2):  # 减法实际上就是加法
    y1 = -y1
    g = gcd(x2, y2)
    mu, zi = x2 * y2 / g, x1 * y2 / g + y1 * x2 / g
    return result(mu, zi)


def multiply(x1, x2, y1, y2):
    mu, zi = x2 * y2, x1 * y1
    return result(mu, zi)


def divide(x1, x2, y1, y2):  # 把除数的分子分母调换的乘法就是除法了
    mu, zi = x2 * y1, x1 * y2
    return result(mu, zi)


def result(mu, zi):
    return str(int(abs(zi))) + '/' + str(int(abs(mu))) if mu * zi >= 0 else '-' + str(int(abs(zi))) + '/' + str(
        int(abs(mu)))


num1, num2 = input().split()
a1, a2 = list(map(int, num1.split('/')))  # 使用list的原因是可通过列表下标0知道该数是否带有负号
b1, b2 = list(map(int, num2.split('/')))
print(fun(num1), '+', fun(num2), '=', fun(add(a1, a2, b1, b2)))
print(fun(num1), '-', fun(num2), '=', fun(minus(a1, a2, b1, b2)))
print(fun(num1), '*', fun(num2), '=', fun(multiply(a1, a2, b1, b2)))
print(fun(num1), '/', fun(num2), '=', fun(divide(a1, a2, b1, b2))) if b1 != 0 else print(fun(num1), '/', fun(num2), '=',
                                                                                         'Inf')