(PAT乙级)有理数四则运算问题思路与解析

1、原题描述:
题目描述
本题要求编写程序,计算2个有理数的和、差、积、商。

输入描述:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分
母不为0。

输出描述:
分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的
最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中
没有超过整型范围的整数。

输入例子:
5/3 0/6

输出例子:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

2、思路
1)、本题属于模拟类问题,模拟类问题首先就要掌握题目的规则,然后对整体做出相应规划;本题中首先输入的分数其分子大于分母,也可以小于分母,分子可以为0,分母题目中保证不会为零,因此这种极端情况可以不用考虑;另外一点就是输入的分数不一定是最简化的,也就是还可以进行约分,我们需要将不管是输入的分数还是算的结果都要化成最简形式。
2)、可以定义一个约分打印函数,该函数可以解决:1.找到分子分母的最大公约数,2.针对输入的分子(绝对值)大于分母的情况,输出的结果需要考虑约分后并转化为带分数,负数要同时返回负号,因此可以在此做一个判断语句,另外一点,要考虑到约分后分母为1的情况,我们需要直接输出一个整数(本人经过在线测试发现,如果是负数需要带括号打印),为方便起见,1.约分打印函数返回值为可以直接打印的结果,不可以再处理;2.仅考虑分子不为零的情况。
3)、分别定义加、减、乘、除四个函数,降低代码重复利用率;
4)定义一个函数将两个输入的分数化为分母一致,以方便进行加、减运算。
5)、最后就是考虑所有情况的打印代码。

思路比较简单,但是代码比较冗长,因为需要考虑的边界情况比较多,需要多次调试才能具体确定(题目给的实在是比较模糊)
下面就给出自己的代码,并稍做解析:

# -*- coding: utf-8 -*-
"""
Created on Fri May  8 17:38:29 2020

@author: ScramJet
"""
input_n,input_m = input().split(' ')
n_a,n_b = map(eval,input_n.split('/'))#获取两个分数的分子分母
m_a,m_b = map(eval,input_m.split('/'))
def tongfen_func(n_a,n_b,m_a,m_b):#将两个分数分母化为一致方便加减运算,其中分子正负均可用。
    n_anew = n_a*m_b
    n_bnew = n_b*m_b
    m_anew = m_a*n_b
    m_bnew = m_b*n_b
    return n_anew,n_bnew,m_anew,m_bnew
def yuefen_print_func(a,b):  # 对一个分数的分母分子进行处理,得到题目所要求的结果,a为正为负均可使用
#首先找到分子分母的最大公约数,为方便只考虑分子为负,不考虑分母为负
    s = 1
    d = min(abs(a),b)
    for k in range(1,d+1):
        if a%k == 0 and b%k == 0:
            s = k
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值