鱼C论坛

 找回密码
 立即注册
查看: 1517|回复: 20

[已解决]求助一下!!精确有理数,有理数的四则运算

[复制链接]
发表于 2020-6-3 23:31:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

请大神帮忙修改一下,报错不知道怎么改

class Rational:
    """定义有理数类"""
    def __init__(self,a,b):
        (a,b)=(b,a)if a>b else(a,b)
        for i in range(1,b + 1):
            if((a % i == 0) and (b % i == 0)):
                c=i
        self.a=a/c
        self.b=b/c
        # 提示:使用辗转相除法,求a,b最大公约数m


    # 实现有理数的显示和输出   如Rational(1,3)输出为 "1/3"  "a/b"
    def __rstr__(self):
        print("self.a/self.b")
        


    # 实现有理数的四则运算,+,-,*,/“”“这里好像要计算出c d放回Rational(c,d)”“”
    def __add__(self,other):
        return __add__(self, other)
        

    def __sub__(self, other):
        return __sub__(self, other)
        

    def __mul__(self,other):
        return __mul__(self,other)
        

    def __truediv__(self, other):
        return __truediv__(self, other)
        
   
    # 实现有理数的比较 ==, !=, <, >.
    def __eq__(self,other):
        if float(self)-float(other)==0:
            return True
        else:
            return False
        
    def __ne__(self,other):
        if float(self)-float(other)!=0:
            return True
        else:
            return False
      
    def __gt__(self,other):
        if float(self)-float(other)<0:
            return True
        else:
            return False
      
    def __lt__(self,other):
        if float(self)-float(other)>0:
            return True
        else:
            return False
        

“”“让以下可以正常运行,并且输出依然为分数”“”
r1 = Rational(3,4)
r2 = Rational(4,5)
r3 = r1 + r2
r4 = r1 - r2
r5 = r1 * r2
r6 = r1 / r2
print(r1,r2,r3,r4,r5,r6)
print(r1 < r2)
print(Rational(25,0))



“”“print(r1,r2,r3,r4,r5,r6)  应该放回3/4,4/5,31/20,-1/20,3/5,15/16 ”“”
最佳答案
2020-6-4 14:23:31
本帖最后由 Twilight6 于 2020-6-4 15:00 编辑

用了最笨的方法,抱歉昨天没看到你的消息。早上有事情没及时做出来

emmmm,就算现在做出了也是用笨方法,希望能帮助到你吧。

  1. class Rational:
  2.     """定义有理数类"""

  3.     def __init__(self, a, b):
  4.         self.a = a
  5.         self.b = b
  6.         while b != 0 and a % b != 0:
  7.             a, b = b, (a % b)
  8.         else:
  9.             self.m = b

  10.     # 实现有理数的显示和输出   如Rational(1,3)输出为 "1/3"  "a/b"
  11.     def __str__(self):
  12.         if self.b == 0:
  13.             return f'{self.a}'
  14.         return f'{self.a}/{self.b}'

  15.     # 实现有理数的四则运算,+,-,*,/“”“这里好像要计算出c d放回Rational(c,d)”“”
  16.     def __add__(self, other):
  17.         a1 = self.a * other.b
  18.         a2 = self.b * other.a
  19.         b = self.b * other.b
  20.         a = a1 + a2
  21.         m = Rational(a, b).m
  22.         a = int(a / m)
  23.         b = int(b / m)
  24.         return Rational(a, b)

  25.     def __sub__(self, other):
  26.         a1 = self.a * other.b
  27.         a2 = self.b * other.a
  28.         b = self.b * other.b
  29.         a = a1 - a2
  30.         m = Rational(a, b).m
  31.         a = int(a / m)
  32.         b = int(b / m)
  33.         return Rational(a, b)

  34.     def __mul__(self, other):
  35.         a = self.a * other.a
  36.         b = self.b * other.b
  37.         m = Rational(a, b).m
  38.         a = int(a / m)
  39.         b = int(b / m)
  40.         return Rational(a, b)

  41.     def __truediv__(self, other):
  42.         a = self.a * other.b
  43.         b = self.b * other.a
  44.         m = Rational(a, b).m
  45.         a = int(a / m)
  46.         b = int(b / m)
  47.         return Rational(a, b)

  48.     # # 实现有理数的比较 ==, !=, <, >.
  49.     def __eq__(self, other):
  50.         self.temp = str(self).split('/')
  51.         other.temp = str(other).split('/')
  52.         if self.temp == other.temp :
  53.             return True
  54.         else:
  55.             return False

  56.     def __ne__(self, other):
  57.         self.temp = str(self).split('/')
  58.         other.temp = str(other).split('/')
  59.         if self.temp != other.temp:
  60.             return True
  61.         else:
  62.             return False

  63.     def __gt__(self, other):
  64.         self.temp = str(self).split('/')
  65.         other.temp = str(other).split('/')
  66.         if self.temp[1] < other.temp[1]:
  67.             return True
  68.         if self.temp[1] == other.temp[1]:
  69.             if self.temp[0] < other.temp[0]:
  70.                 return True
  71.         return False

  72.     def __lt__(self, other):
  73.         self.temp = str(self).split('/')
  74.         other.temp = str(other).split('/')
  75.         if self.temp[1] > other.temp[1]:
  76.             return True
  77.         if self.temp[1] == other.temp[1]:
  78.             if self.temp[0] > other.temp[0]:
  79.                 return True
  80.         return False


  81. r1 = Rational(3, 4)
  82. r2 = Rational(4, 5)
  83. r3 = r1 + r2
  84. r4 = r1 - r2
  85. r5 = r1 * r2
  86. r6 = r1 / r2
  87. print(r1, r2, r3, r4, r5, r6)
  88. print(r1 < r2)
  89. print(Rational(25, 0))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-3 23:34:02 | 显示全部楼层
本帖最后由 Twilight6 于 2020-6-4 07:19 编辑

什么情况?我刚刚不是给你写了代码了嘛.... 不正确嘛?

  1. class Rational(int):
  2.     """定义有理数类"""

  3.     def __new__(cls, a, b):
  4.         (a, b) = (b, a) if a > b else (a, b)
  5.         for i in range(1, b + 1):
  6.             if ((a % i == 0) and (b % i == 0)):
  7.                 c = i
  8.             cls.a = a / c
  9.             cls.b = b / c
  10.         return c
  11.         # 提示:使用辗转相除法,求a,b最大公约数m

  12.     # 实现有理数的显示和输出   如Rational(1,3)输出为 "1/3"  "a/b"
  13.     def __rstr__(self):
  14.         print("self.a/self.b")

  15.     # 实现有理数的四则运算,+,-,*,/“”“这里好像要计算出c d放回Rational(c,d)”“”
  16.     def __add__(self, other):
  17.         return int.__add__(self, other)

  18.     def __sub__(self, other):
  19.         return int.__sub__(self, other)

  20.     def __mul__(self, other):
  21.         return int.__mul__(self, other)

  22.     def __truediv__(self, other):
  23.         return int.__truediv__(self, other)

  24.     # 实现有理数的比较 ==, !=, <, >.
  25.     def __eq__(self, other):
  26.         if float(self) - float(other) == 0:
  27.             return True
  28.         else:
  29.             return False

  30.     def __ne__(self, other):
  31.         if float(self) - float(other) != 0:
  32.             return True
  33.         else:
  34.             return False

  35.     def __gt__(self, other):
  36.         if float(self) - float(other) < 0:
  37.             return True
  38.         else:
  39.             return False

  40.     def __lt__(self, other):
  41.         if float(self) - float(other) > 0:
  42.             return True
  43.         else:
  44.             return False

  45. r1 = Rational(3,4)
  46. r2 = Rational(4,5)
  47. r3 = r1 + r2
  48. r4 = r1 - r2
  49. r5 = r1 * r2
  50. r6 = r1 / r2
  51. print(r1,r2,r3,r4,r5,r6)
  52. print(r1 < r2)
  53. print(Rational(25,0))
复制代码


早上才看到你回复我和你帖子底下的正确答案。。。抱歉

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2020-6-4 06:50:29 | 显示全部楼层
Twilight6 发表于 2020-6-3 23:34
什么情况?我刚刚不是给你写了代码了嘛.... 不正确嘛?

1.你不应该继承自 int。
2.你的 new 方法应返回 Rational 实例,非 int 实例。
3.你不应该在创建实例时给类添加属性。
4.你的所有运算符都无法得到正确结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-6-4 07:08:41 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-6-4 06:50
1.你不应该继承自 int。
2.你的 new 方法应返回 Rational 实例,非 int 实例。
3.你不应该在创建实例时 ...

这都不是都是正确结果嘛?
  1. 1 1 2 0 1 1.0
  2. False
  3. 25
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-4 07:17:22 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-6-4 06:50
1.你不应该继承自 int。
2.你的 new 方法应返回 Rational 实例,非 int 实例。
3.你不应该在创建实例时 ...

好吧 我看见他昨天回复我的正确答案了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-4 08:26:34 | 显示全部楼层
Twilight6 发表于 2020-6-4 07:08
这都不是都是正确结果嘛?

答案是分数形式,不是整数哦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-4 08:27:27 | 显示全部楼层
Twilight6 发表于 2020-6-4 07:17
好吧 我看见他昨天回复我的正确答案了

可以帮忙看看怎么改吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-4 08:28:19 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-6-4 06:50
1.你不应该继承自 int。
2.你的 new 方法应返回 Rational 实例,非 int 实例。
3.你不应该在创建实例时 ...

可以帮忙看看怎么改吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-4 08:43:07 | 显示全部楼层
制作了加法的例子,并没有最大公约数相约,减乘除和加一样改,另外构造函数里一堆东西,不明白是啥,不就是a,b传入后,直接self.a=a就成了,输出的时候,在显示最简分数就行了
  1. class Rational:
  2.     """定义有理数类"""
  3.     def __init__(self,a,b):
  4.         self.a=a
  5.         self.b=b
  6.         # 提示:使用辗转相除法,求a,b最大公约数m


  7.     # 实现有理数的显示和输出   如Rational(1,3)输出为 "1/3"  "a/b"
  8.     def __rstr__(self):
  9.         print("%d/%d" %(self.a,self.b))
  10.         


  11.     # 实现有理数的四则运算,+,-,*,/“”“这里好像要计算出c d放回Rational(c,d)”“”
  12.     def __add__(self,other):
  13.         #a/b + c/d = (ad+bc)/bd
  14.         return Rational(self.a*other.b+self.b*other.a,self.b*other.b)
  15.         

  16.     def __sub__(self, other):
  17.         return __sub__(self, other)
  18.         

  19.     def __mul__(self,other):
  20.         return __mul__(self,other)
  21.         

  22.     def __truediv__(self, other):
  23.         return __truediv__(self, other)
  24.         
  25.    
  26.     # 实现有理数的比较 ==, !=, <, >.
  27.     def __eq__(self,other):
  28.         if float(self)-float(other)==0:
  29.             return True
  30.         else:
  31.             return False
  32.         
  33.     def __ne__(self,other):
  34.         if float(self)-float(other)!=0:
  35.             return True
  36.         else:
  37.             return False
  38.       
  39.     def __gt__(self,other):
  40.         if float(self)-float(other)<0:
  41.             return True
  42.         else:
  43.             return False
  44.       
  45.     def __lt__(self,other):
  46.         if float(self)-float(other)>0:
  47.             return True
  48.         else:
  49.             return False

  50. r1 = Rational(3,4)
  51. r2 = Rational(4,5)
  52. r3 = r1 + r2
  53. #r4 = r1 - r2
  54. #r5 = r1 * r2
  55. #r6 = r1 / r2
  56. #print(r1,r2,r3,r4,r5,r6)
  57. #print(r1 < r2)
  58. #print(Rational(25,0))
  59. r3.__rstr__()
复制代码

结果:
31/20
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-4 08:45:52 | 显示全部楼层
java2python 发表于 2020-6-4 08:43
制作了加法的例子,并没有最大公约数相约,减乘除和加一样改,另外构造函数里一堆东西,不明白是啥,不就是 ...

#r4 = r1 - r2
#r5 = r1 * r2
#r6 = r1 / r2
#print(r1,r2,r3,r4,r5,r6)
#print(r1 < r2)
#print(Rational(25,0))


这些跑起来就报错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-4 08:47:49 | 显示全部楼层
a聪明叶 发表于 2020-6-4 08:45
#r4 = r1 - r2
#r5 = r1 * r2
#r6 = r1 / r2


我上面说了,只改了加法,减乘除和加要一样改,我没有改整个程序,而是提示思路。。。另外没有分数最简化,这些请自己完成
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-4 08:49:54 | 显示全部楼层
java2python 发表于 2020-6-4 08:47
我上面说了,只改了加法,减乘除和加要一样改,我没有改整个程序,而是提示思路。。。另外没有分数最简 ...

好的 我试试呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-4 09:13:51 | 显示全部楼层
java2python 发表于 2020-6-4 08:47
我上面说了,只改了加法,减乘除和加要一样改,我没有改整个程序,而是提示思路。。。另外没有分数最简 ...

def __init__(self,a,b):
        
        if b==0:
            raise ValueError("分母不能为零!")
        else:
            (a,b)=(b,a)if a>b else(a,b)
            for i in range(1,b + 1):
                if((a % i == 0) and (b % i == 0)):
                    m=i
        self.a=a/m
        self.b=b/m


为什么我这里想改成最简的分数 下面开始就报错了,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-4 09:22:26 | 显示全部楼层
a聪明叶 发表于 2020-6-4 09:13
def __init__(self,a,b):
        
        if b==0:

这道题,老师要求的是什么,当然最重要的是四则运算
  1. a     c      a*d+b*c
  2. -- + --- = ---------------
  3. b     d        b*d
  4. a     c      a*d-b*c
  5. -- -  --- = ---------------
  6. b     d        b*d
  7. a     c       a*c
  8. -- * --- = ---------------
  9. b     d       b*d
  10. a     c       a*d
  11. -- / --- = ---------------
  12. b     d       b*c
  13. a     c        
  14. -- = ---  ->= a*d==b*c
  15. b     d        
复制代码



其次是比较
最简分数并不是最重要的,这个最后表示的时候,最简一下就行了。你一开始就再构造函数里搞最简,这不是一错,如果是题目,一分也没有。最简到最后,这里错了,90%的分数不是拿到了?最简不完成也行,你都是在论坛救助,就别那么追求完美了,我不知道我的意思能不能传达到。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-4 09:53:27 | 显示全部楼层
确实这种类,有点麻烦,个人搞不清函数为何要加两个下划线,不加有时编译器报错,下面程序能通过,
__GCU__是最大公约数函数
__simplest__是最简化分数

  1. class Rational:
  2.     """定义有理数类"""
  3.     def __init__(self,a,b):
  4.         self.a=a
  5.         self.b=b
  6.         # 提示:使用辗转相除法,求a,b最大公约数m

  7.     def __GCU__(self):
  8.         m = self.a
  9.         n = self.b
  10.         if m==0:
  11.             return n
  12.         elif n==0:
  13.             return m
  14.         elif m == n:
  15.             return m

  16.         while m%n:
  17.             m, n = n, m%n
  18.         return n            

  19.     def __simplest__(self):
  20.         c= Rational.__GCU__(self)
  21.         self.a=self.a//c
  22.         self.b=self.b//c

  23.     # 实现有理数的显示和输出   如Rational(1,3)输出为 "1/3"  "a/b"
  24.     def print_self(self):
  25.         #Rational.simplest(self)
  26.         print("%d/%d" %(self.a,self.b))
  27.         


  28.     # 实现有理数的四则运算,+,-,*,/“”“这里好像要计算出c d放回Rational(c,d)”“”
  29.     def __add__(self,other):
  30.         #a/b + c/d = (ad+bc)/bd
  31.         r= Rational(self.a*other.b+self.b*other.a,self.b*other.b)
  32.         r.__simplest__()
  33.         return r
  34.         

  35.     def __sub__(self, other):
  36.         return __sub__(self, other)
  37.         

  38.     def __mul__(self,other):
  39.         return __mul__(self,other)
  40.         

  41.     def __truediv__(self, other):
  42.         return __truediv__(self, other)
  43.         
  44.    
  45.     # 实现有理数的比较 ==, !=, <, >.
  46.     def __eq__(self,other):
  47.         if float(self)-float(other)==0:
  48.             return True
  49.         else:
  50.             return False
  51.         
  52.     def __ne__(self,other):
  53.         if float(self)-float(other)!=0:
  54.             return True
  55.         else:
  56.             return False
  57.       
  58.     def __gt__(self,other):
  59.         if float(self)-float(other)<0:
  60.             return True
  61.         else:
  62.             return False
  63.       
  64.     def __lt__(self,other):
  65.         if float(self)-float(other)>0:
  66.             return True
  67.         else:
  68.             return False


  69. r1 = Rational(3,4)
  70. r2 = Rational(1,4)
  71. r3 = r1 + r2
  72. r3.print_self()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-4 10:02:41 | 显示全部楼层
java2python 发表于 2020-6-4 09:53
确实这种类,有点麻烦,个人搞不清函数为何要加两个下划线,不加有时编译器报错,下面程序能通过,
__GCU ...

谢谢你的帮忙!!感谢 ,对于你说的问题我会再看看再想想的!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-4 12:20:01 | 显示全部楼层
Twilight6 发表于 2020-6-4 07:08
这都不是都是正确结果嘛?

>>> Rational(5,3)+Rational(5,3)
2
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-4 14:23:31 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-6-4 15:00 编辑

用了最笨的方法,抱歉昨天没看到你的消息。早上有事情没及时做出来

emmmm,就算现在做出了也是用笨方法,希望能帮助到你吧。

  1. class Rational:
  2.     """定义有理数类"""

  3.     def __init__(self, a, b):
  4.         self.a = a
  5.         self.b = b
  6.         while b != 0 and a % b != 0:
  7.             a, b = b, (a % b)
  8.         else:
  9.             self.m = b

  10.     # 实现有理数的显示和输出   如Rational(1,3)输出为 "1/3"  "a/b"
  11.     def __str__(self):
  12.         if self.b == 0:
  13.             return f'{self.a}'
  14.         return f'{self.a}/{self.b}'

  15.     # 实现有理数的四则运算,+,-,*,/“”“这里好像要计算出c d放回Rational(c,d)”“”
  16.     def __add__(self, other):
  17.         a1 = self.a * other.b
  18.         a2 = self.b * other.a
  19.         b = self.b * other.b
  20.         a = a1 + a2
  21.         m = Rational(a, b).m
  22.         a = int(a / m)
  23.         b = int(b / m)
  24.         return Rational(a, b)

  25.     def __sub__(self, other):
  26.         a1 = self.a * other.b
  27.         a2 = self.b * other.a
  28.         b = self.b * other.b
  29.         a = a1 - a2
  30.         m = Rational(a, b).m
  31.         a = int(a / m)
  32.         b = int(b / m)
  33.         return Rational(a, b)

  34.     def __mul__(self, other):
  35.         a = self.a * other.a
  36.         b = self.b * other.b
  37.         m = Rational(a, b).m
  38.         a = int(a / m)
  39.         b = int(b / m)
  40.         return Rational(a, b)

  41.     def __truediv__(self, other):
  42.         a = self.a * other.b
  43.         b = self.b * other.a
  44.         m = Rational(a, b).m
  45.         a = int(a / m)
  46.         b = int(b / m)
  47.         return Rational(a, b)

  48.     # # 实现有理数的比较 ==, !=, <, >.
  49.     def __eq__(self, other):
  50.         self.temp = str(self).split('/')
  51.         other.temp = str(other).split('/')
  52.         if self.temp == other.temp :
  53.             return True
  54.         else:
  55.             return False

  56.     def __ne__(self, other):
  57.         self.temp = str(self).split('/')
  58.         other.temp = str(other).split('/')
  59.         if self.temp != other.temp:
  60.             return True
  61.         else:
  62.             return False

  63.     def __gt__(self, other):
  64.         self.temp = str(self).split('/')
  65.         other.temp = str(other).split('/')
  66.         if self.temp[1] < other.temp[1]:
  67.             return True
  68.         if self.temp[1] == other.temp[1]:
  69.             if self.temp[0] < other.temp[0]:
  70.                 return True
  71.         return False

  72.     def __lt__(self, other):
  73.         self.temp = str(self).split('/')
  74.         other.temp = str(other).split('/')
  75.         if self.temp[1] > other.temp[1]:
  76.             return True
  77.         if self.temp[1] == other.temp[1]:
  78.             if self.temp[0] > other.temp[0]:
  79.                 return True
  80.         return False


  81. r1 = Rational(3, 4)
  82. r2 = Rational(4, 5)
  83. r3 = r1 + r2
  84. r4 = r1 - r2
  85. r5 = r1 * r2
  86. r6 = r1 / r2
  87. print(r1, r2, r3, r4, r5, r6)
  88. print(r1 < r2)
  89. print(Rational(25, 0))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-7 11:51:02 | 显示全部楼层
Twilight6 发表于 2020-6-4 14:23
用了最笨的方法,抱歉昨天没看到你的消息。早上有事情没及时做出来

emmmm,就算现在做出了也是用笨方法 ...

已经很好啦 真的很感谢你哦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-7 11:57:57 | 显示全部楼层
a聪明叶 发表于 2020-6-7 11:51
已经很好啦 真的很感谢你哦

那就给个最佳吧~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-21 14:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表