PAT乙级_1034 有理数四则运算_Python_AC解法_无疑难点

部署运行你感兴趣的模型镜像

注意事项:

       因为笔者的编程水平以自学为主,代码结构可能比较混乱、变量命名可能不够规范。

       文章中的AC解法不一定最优,并且包含笔者强烈的个人风格,不喜勿喷,但欢迎在评论中理性讨论或者给出提升建议。

       文章中提到的疑难点仅为个人在刷题过程中所遇到的情况,如有读者存在其他疑难点,欢迎在评论中加以补充,笔者会尽量将其加入到文章内容中。


合集: 

 PAT乙级_合集_Python_AC解法


 题目:

1034 有理数四则运算

题目描述: 

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

代码限制: 

代码长度限制

16 KB

时间限制

200 ms

内存限制

64 MB

栈限制

8192 KB


AC解法: 
import math


# 构造函数用于将分数转化为标准分数的形式
def format_conversion(x, y):  # 入参为分子和分母的值
    gcd = math.gcd(x, y)  # 计算分子分母的最大公约数
    x //= gcd  # 分子除以最大公约数进行约分
    y //= gcd  # 分母除以最大公约数进行约分
    flag = False if x * y >= 0 else True  # 创建标记值用于判断分数是否为负,若为负则值为 True ,反之则为 False
    x, y = abs(x), abs(y)  # 将分子分母转换为绝对值,以便后续处理
    if y == 1:  # 若分母为 1 ,即整数情况
        return f"{'(-' if flag else ''}{x}{')' if flag else ''}"  # 返回整数形式,单独考虑负数的括号情况
    if x >= y:  # 若分子大于等于分母,即假分数情况
        zs = x // y  # 计算整数部分
        sy = x - zs * y  # 计算余数部分
        if sy == 0:  # 若余数为 0 ,即可以整除
            return f"{'(-' if flag else ''}{zs}{')' if flag else ''}"  # 返回整数形式,单独考虑负数的括号情况
        else:  # 余数不为 0
            return f"{'(-' if flag else ''}{zs} {sy}/{y}{')' if flag else ''}"  # 返回带分数形式,
            # 单独考虑负数的括号情况
    else:  # 分子小于分母,即真分数情况
        return f"{'(-' if flag else ''}{x}/{y}{')' if flag else ''}"  # 返回真分数形式,单独考虑负数的括号情况


# 获取输入的数据
A, B = input().split()  # 获取输入的两个分数

# 处理数据
A, B = list(map(int, A.split('/'))), list(map(int, B.split('/')))  # 分割两个分数的分子和分母部分
A = [A[0] // math.gcd(A[0], A[1]), A[1] // math.gcd(A[0], A[1])]  # 约分第一个分数
B = [B[0] // math.gcd(B[0], B[1]), B[1] // math.gcd(B[0], B[1])]  # 约分第二个分数
a, b = A.copy(), B.copy()  # 创建两个分数的拷贝副本,避免修改原分数
lcm_ab = math.lcm(a[1], b[1])  # 计算两个分母的最小公倍数
bsa, bsb = lcm_ab // a[1], lcm_ab // b[1]  # 计算两个分数的通分倍数
a[0], a[1], b[0], b[1] = a[0] * bsa, a[1] * bsa, b[0] * bsb, b[1] * bsb  # 对两个分数进行通分
aA, bB = format_conversion(A[0], A[1]), format_conversion(B[0], B[1])  # 格式化两个原始分数

# 输出结果
print(f"{aA} + {bB} = {format_conversion(a[0] + b[0], a[1])}")  # 输出加法运算的结果
print(f"{aA} - {bB} = {format_conversion(a[0] - b[0], a[1])}")  # 输出减法运算的结果
print(f"{aA} * {bB} = {format_conversion(a[0] * b[0], a[1] * b[1])}")  # 输出乘法运算的结果
print(f"{aA} / {bB} = {'Inf' if b[0] == 0 else format_conversion(a[0] * b[1], a[1] * b[0])}")
# 输出除法运算的结果,并单独处理除数为零的情况

题目解读:

       本题描述比较易懂。

       先获取输入的两个分数,再将分数化简用于在算式中表示,然后对两个分数分别进行四则运算,最后输出四则运算的完整算式及对应的化简结果。

疑难点: 

       本题无疑难点。

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值