(python3)1034.有理数四则运算(20分)

题目如下:

本题要求编写程序,计算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

题目解析:

题意一下子就懂了,但是怎么样个流程并不容易想出。代码如下,有一定的注释,然后再略微分析:

# 整理出两个数化简形式
def f(a,b):
    fac = b
    while a % fac:
        r = a % fac
        a = fac
        fac = r
    return fac

def lst(x):
    if x[0] == '-':
        lst_x = [-1]
        a, b = x[1:].split('/')
    else:
        lst_x = [1]
        a, b = x.split('/')
    a, b = int(a), int(b)
    fac = f(a, b)
    a = a // fac
    b = b // fac
    lst_x.append(a)
    lst_x.append(b)
    return lst_x

# 输出打印形式 最简形式
def print_x(num):
    if num[1] ==0 or num[2] == 0:
        return '0'
    lst = [num[0]]
    lst.append(num[1] // num[2])
    a = num[1] % num[2]
    b = num[2]
    fac = f(a, b)
    a = a // fac
    b = b // fac
    lst.append(a)
    lst.append(b)

    str_x =''
    if lst[1] == 0:
        if lst[2] != 0:
            str_x += str(lst[2])
            str_x += '/'
            str_x += str(lst[3])
    else:
        str_x += str(lst[1])
        if lst[2] == 0:
            pass
        else:
            str_x += ' '
            str_x += str(lst[2])
            str_x += '/'
            str_x += str(lst[3])
    if lst[0] == -1:
        str_x = '(-%s)'%str_x
    return str_x

# 有理数的加减乘除运算,参数a, b 的格式为[ -1 , 3, 2]
def sum_(a,b):
    a1 = a[0] * a[1] * b[2]
    b1 = b[0] * b[1] * a[2]
    r = a1+b1
    if r<0:
        ret=[-1]
        r *= -1
    else:
        ret=[1]
    ret.append(r)
    ret.append(a[2]*b[2])
    return ret

def sub_(a,b):
    c = b.copy()
    c[0] = c[0]*(-1)
    ret = sum_(a,c)
    return ret

def mul_(a,b):
    ret = [a[0] * b[0]]
    ret.append(a[1] * b[1])
    ret.append(a[2] * b[2])
    # print(ret)
    return ret

def div_(a,b):
    b[1],b[2] = b[2],b[1]
    ret = mul_(a,b)
    return ret

if __name__ == '__main__':
    x,y = input().split()
    lst_x = lst(x)
    lst_y = lst(y)
    # print(lst_x)
    # print(lst_y)
    x = print_x(lst_x)
    y = print_x(lst_y)

    r1 = print_x(sum_(lst_x,lst_y))
    r2 = print_x(sub_(lst_x,lst_y))
    r3 = print_x(mul_(lst_x,lst_y))
    r4 = print_x(div_(lst_x,lst_y))
    if y == '0':
        r4 = 'Inf'

    print(x, '+', y, '=', r1)
    print(x, '-', y, '=', r2)
    print(x, '*', y, '=', r3)
    print(x, '/', y, '=', r4)

先看主函数,读取数据处理成诸如[-1,5,3]这样的列表形式lst_x, lst_y,第一位是数的正负号,第二位是分子,第三位是分母;然后调用四则运算的函数分别计算并用print_x函数将结果格式化为输出的样式;最后输出四行结果。

本题的主要思想:读取数据后以及四则运算过程中,分数的存储格式均为[符号,分子,分母],是一个假分数,但是必须消掉最大公约数的,假分数便于四则运算(不要因为最终结果要化简就将整数部分过早提出);

符号用1,-1表示,便于四则运算最后结果符号的判断和运算,如乘法a[0] * b[0],就可以判断其符号。

注意:0的问题,一是print_x函数中整数部分是0,或分子是0的情况;

二是除法时0的问题,r4为0时结果换为‘Inf',而除法时由于调用的乘法函数,结果的分母可能为0,所以print_x函数第一句先做判断。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值