【Python】PAT-1034 有理数四则运算

1. 题目

image-20210330104624510

2. 代码

2.1 分析

题目本身不难。但是我前前后后花了2h以上。

题目需要处理的判断逻辑还是比较多的。

我通过实现一个Fraction的类来完成了题目。

关于最后一个测试点,非常有可能是类似这样的结构 。

1/2 -1/2, 这两个分数相除,分母会出现负数,所以一定要处理妥当。

否则最后一个测试点过不了。

2.2 代码

class Fraction():
    # 默认分母=1,且是正数(flag=""正数,flag="-"负数)
    def __init__(self, top, bottom=1):
        is_positive = 1
        if top*bottom < 0:
            is_positive = -1

        # 全都转化成正数
        top, bottom = abs(top), abs(bottom)

        # 分子分母化简
        max_factor = gcd(top, bottom)

        if bottom != 0:
            # 约分
            self.num = is_positive * (top//max_factor)
            self.den = bottom // max_factor
        else:
            # 分母为0,分式没有意义
            self.num = 0
            self.den = 0

    # 显示数据
    def show(self):
        num, den = self.num, self.den

        # 判断是否是正数
        is_positive = 1
        if num*den < 0:
            is_positive = -1

        # 全部转化成正数
        num, den = abs(num), abs(den)

        # 分母为0
        if den == 0:
            return "Inf"

        # 分子为0
        if num == 0:
            return 0

        # 分母为1
        if den == 1:
            if is_positive == 1:
                return "%d" % (num)
            else:
                return "(-%d)" % (num)

        # 最简化有理数
        int_num = num // den
        num = num % den

        if int_num == 0:
            # 正负判定
            if is_positive != 1:
                return "(-%d/%d)" % (num, den)
            else:
                return "%d/%d" % (num, den)
        else:
            # 正负判定
            if is_positive != 1:
                return "(-%d %d/%d)" % (int_num, num, den)
            else:
                return "%d %d/%d" % (int_num, num, den)

    # 加法
    def __add__(self, other):
        # 通分
        x = self.num*other.den + self.den*other.num
        y = self.den * other.den

        max_factor = gcd(abs(x), y)
        return Fraction(x//max_factor, y//max_factor)

    # 减法
    def __sub__(self, other):
        x = self.num*other.den - self.den*other.num
        y = self.den * other.den

        max_factor = gcd(abs(x), y)
        return Fraction(x//max_factor, y//max_factor)

    #  乘法
    def __mul__(self, other):
        x = self.num * other.num
        y = self.den * other.den
        max_factor = gcd(abs(x), y)
        return Fraction(x//max_factor, y//max_factor)

    # 对应除法( / )
    def __truediv__(self, other):
        x = self.num * other.den
        y = self.den * other.num

        # 分母为0,没有意义,直接返回
        if y == 0:
            return Fraction(0, 0)

        max_factor = gcd(abs(x), abs(y))

        # 分子、分母 有一个是负数
        if (x < 0 and y >= 0) or (x >= 0 and y < 0):
            return Fraction(-(abs(x)//max_factor), abs(y)//max_factor)
        else:
            return Fraction(x//max_factor, y//max_factor)


def gcd(x, y):
    # x,y 必须都是自然数
    if x < y:
        x, y = y, x
    while(y != 0):
        temp = x
        x = y
        y = temp % y
    return x


x, y = input().split(" ")
a1, b1 = tuple(map(int, x.split("/")))
a2, b2 = tuple(map(int, y.split("/")))


x = Fraction(a1, b1)
y = Fraction(a2, b2)



print(x.show(), "+", y.show(), "=", (x+y).show())
print(x.show(), "-", y.show(), "=", (x-y).show())
print(x.show(), "*", y.show(), "=", (x*y).show())
print(x.show(), "/", y.show(), "=", (x/y).show())

3. AC截图

image-20210330104638671

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏2同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值