为了账号安全,请及时绑定邮箱和手机立即绑定

不知道自己的代码还能不能简化?


class Rational(object):
    def __init__(self, p, q):
        self.p = p
        self.q = q
    def yuefen(self):
        n = self.p if self.p<self.q else self.q
        while n>1:
            if self.p%n==0 and self.q%n==0:
                self.p /=n
                self.q /=n
            n-=1
    def __add__(self, r):
        re = Rational(self.p * r.q + self.q * r.p, self.q * r.q)
        re.yuefen()
        return re
   
    def __sub__(self, r):
        re =Rational(self.p*r.q - self.q*r.p,self.q*r.q)
        re.yuefen()
        return re

    def __mul__(self, r):
        re=Rational(self.p*r.p,self.q*r.q)
        re.yuefen()
        return re
   
    def __div__(self, r):
        re=Rational(self.p*r.q,self.q*r.p)
        re.yuefen()
        return re

    def __str__(self):
        return '%s/%s'%(self.p,self.q)

    __repr__ = __str__

r1 = Rational(1, 2)
r2 = Rational(1, 4)
print r1 + r2
print r1 - r2
print r1 * r2
print r1 / r2

正在回答

1 回答

我是在展示的时候才约的分

然后约分用的最大公约数可以用递归来写

这两点不知道算不算得上优化吧

def gcd(a, b):

    (a,b)=(a,b) if a > b else (b,a)

    if a % b == 0:

        return b

    else:

        return gcd(a , a % b)

class Rational(object):

    def __init__(self, p, q):

        self.p = p

        self.q = q


    def __add__(self, r):

        return Rational(self.p * r.q + self.q * r.p, self.q * r.q)


    def __sub__(self, r):

        return Rational(self.p * r.q - r.p * self.q, self.q * r.q)


    def __mul__(self, r):

        return Rational(self.p * r.p, self.q * r.q)


    def __div__(self, r):

        return Rational(self.p * r.q, self.q * r.p)


    def __str__(self):

        g = gcd(self.p, self.q)

        return '%s/%s'%(self.p/g, self.q/g)


    __repr__ = __str__


r1 = Rational(1, 2)

r2 = Rational(1, 4)

print r1 + r2

print r1 - r2

print r1 * r2

print r1 / r2


0 回复 有任何疑惑可以回复我~
#1

木易楊__ 提问者

非常感谢!
2018-07-19 回复 有任何疑惑可以回复我~
#2

慕仰8584781 回复 木易楊__ 提问者

共同学习共同进步~
2018-07-19 回复 有任何疑惑可以回复我~
#3

qq_疏狂_0

同学 ,你的求最大公约数的函数写得很好,比老师给的例子更容易理解 但是,有个缺陷,当传入的第二个参数,也就是分母为0的时候,会报错。虽然此题分数的计算不太可能会出现传入的第二个参数为0的情况,但就求最大公约数来说,我觉得还是加上检查条件比较好
2018-10-28 回复 有任何疑惑可以回复我~
#4

慕用6484265

第一句if不用写 小数整出大数返回小数本身 然后交换即可 实在要加 加个非零判断即可
2018-12-25 回复 有任何疑惑可以回复我~
查看1条回复

同楼上一样gcd另写一个递归函数。

我觉得约分可以放到__init__里边做,保证存储时就是最简分数;因为考虑到如果不停地乘除的话,分子分母会越来越大,本能地怕爆int

0 回复 有任何疑惑可以回复我~
#1

木易楊__ 提问者

python的int范围超级大,可能你已经学了c语言 ,哈哈
2018-07-19 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255533    人
  • 解答问题       3038    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

不知道自己的代码还能不能简化?

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号