鱼C论坛

 找回密码
 立即注册
查看: 2014|回复: 10

python

[复制链接]
发表于 2021-2-3 21:15:48 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 hrh1023 于 2021-2-3 21:49 编辑
class Fraction:
    def __init__(self, a, b):
        self.numerator = a
        self.denominator = b

    def __eq__(self, other):
        return(self.numerator * other.denominator == self.denominator * other.numerator)

    def __str__(self):
        return str(self.numerator) + " / " + str(self.denominator)

    def __mul__(self, other):
        return int(self.numerator * other.denominator == self.denominator * other.numerator)


x = Fraction(1, 2)
y = Fraction(3, 5)
print(x * x) # should be 1 / 4, or any fraction equal to this
print(x * y) # should be 3 / 10, or any fraction equal to this






怎么样才可以让那个最后验算的结果不是false 而是数字啊
27d4a87c054130b6ac4a52b416f7eb2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-3 21:22:52 | 显示全部楼层
return int(...)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 21:33:01 | 显示全部楼层

你好
return int(self.numerator+other.numerator == self.denominator+other.denominator)
我这样输入后 最后结果变成两个0了 请问还有哪里出错了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 21:59:33 | 显示全部楼层
hrh1023 发表于 2021-2-3 21:33
你好
return int(self.numerator+other.numerator == self.denominator+other.denominator)
我这样输 ...

蛤?
我这里是1和0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 22:03:58 | 显示全部楼层
qiuyouzhi 发表于 2021-2-3 21:59
蛤?
我这里是1和0

可是答案应该要是1/4 和3/10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 22:16:39 | 显示全部楼层
本帖最后由 qiuyouzhi 于 2021-2-3 22:34 编辑
hrh1023 发表于 2021-2-3 22:03
可是答案应该要是1/4 和3/10


这是我以前写过的一个简陋分数类,你可以参考一下:
import math
from copy import deepcopy

class Fraction:
    """一个简单的分数类,模仿fractions.Fraction"""

    def __init__(self, num, den = 1):
        if isinstance(num, float):
            self.convert(float(num), flag = True)
            return
        elif isinstance(num, str):
            num, den = map(int, num.split('/'))
        self.numerator = num
        self.denominator = den
        self._rof()

    def convert(self, obj = None, flag = False):
        """
        将一个数字转换为Fraction类型
        """
        if isinstance(obj, int):
            return Fraction(obj)
        elif isinstance(obj, float):
            res = str(obj).replace('.', '')
            den = int("1" + ((len(res) - 1) * "0"))
            fc = Fraction(int(res), den)
            if not flag:
                return fc
            else:
                self.numerator, self.denominator = fc.numerator, fc.denominator
        else:
            raise ValueError("Object's type is wrong")
            

    # 约分函数, reduction of a fraction
    def _rof(self):
        print(self.numerator, self.denominator)
        gcd = math.gcd(self.numerator, self.denominator)
        self.numerator //= gcd
        self.denominator //= gcd
        if self.numerator == self.denominator:
            return 1.0

    # 通分函数, reduction of fractions to a common denominator
    def _rofcd(self, other):
        fc1 = deepcopy(self)
        fc2 = deepcopy(other)
        fc1.denominator *= fc2.denominator
        fc1.numerator *= fc2.denominator
        fc2.denominator *= self.denominator
        fc2.numerator *= self.denominator
        return fc1, fc2

    def __setattr__(self, key, value):
        if key == "denominator" and value == 0:
            raise ValueError("The denominator can't be zero")
        else:
            self.__dict__[key] = value

    def __add__(self, other):
        if isinstance(other, Fraction):
            if self.denominator != other.denominator:
                fc1, fc2 = self._rofcd(other)
            else:
                fc1 = deepcopy(self)            
        else:
            fc1 = deepcopy(self)
            fc2 = self.convert(other)

        fc1.numerator += fc2.numerator
        k = fc1._rof()
        return k if k else fc1

    def __sub__(self, other):
        if isinstance(other, Fraction):
            if self.denominator != other.denominator:
                fc1, fc2 = self._rofcd(other)
                fc1.numerator -= fc2.numerator
                fc1._rof()
                return fc1
        elif isinstance(other, (float, int)):
            return self.numerator / self.denominator - other

    def __mul__(self, other):
        if isinstance(other, Fraction):
            num = self.numerator * other.numerator
            den = self.denominator * other.denominator
            return Fraction(num, den)
        elif isinstance(other, (float, int)):
            return self.numerator / self.denominator * other
        
    def __truediv__(self, other):
        if isinstance(other, Fraction):
            fc = deepcopy(other)
            fc.numerator, fc.denominator = fc.denominator, fc.numerator
            return self * fc
        elif isinstance(other, (float, int)):
            return self.numerator / self.denominator / other
    
    def __float__(self):
        return self.numerator / self.denominator

    def __repr__(self):
        return f"Fraction({self.numerator}, {self.denominator})"

    __str__ = __repr__

x = Fraction(1, 2)
y = Fraction(3, 5)
print(x * x) # should be 1 / 4, or any fraction equal to this
print(x * y) # should be 3 / 10, or any fraction equal to this
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 22:28:35 | 显示全部楼层
qiuyouzhi 发表于 2021-2-3 22:16
这是我以前写过的一个简陋分数类,你可以参考一下:

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 22:34:42 | 显示全部楼层

如果问题已解决,请设置【最佳答案】
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 23:40:25 | 显示全部楼层
本帖最后由 °蓝鲤歌蓝 于 2021-2-3 23:42 编辑
class Fraction:
    def __init__(self, a, b):
        self.numerator = a
        self.denominator = b

    def __eq__(self, other):
        return (self.numerator == other.numerator) and (
            self.denominator == other.denominator
        )

    def __str__(self):
        return str(self.numerator) + "/" + str(self.denominator)

    def __mul__(self, other):
        return Fraction(
            self.numerator * other.numerator, self.denominator * other.denominator
        )

代码稍微改一下就好了。不过没实现约数,你自己试试看。
而且你的图里问题不是两个分数相加吗? 怎么写出来却是要分数相乘啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-4 02:42:23 | 显示全部楼层
    def __mul__(self, other):
        return Fraction(self.numerator * other.numerator, self.denominator * other.denominator)
    def __add__(self, other):
        if self.denominator == other.denominator:
            return Fraction(self.numerator + other.numerator, self.denominator)
        return Fraction(self.numerator*other.denominator, self.denominator*other.denominator) + Fraction(other.numerator*self.denominator, other.denominator*self.denominator)
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-4 12:42:55 | 显示全部楼层
本帖最后由 °蓝鲤歌蓝 于 2021-2-4 12:45 编辑
class ZeroDenominatorError(ArithmeticError):
    pass


class Fraction:
    def __init__(self, a, b):
        self.numerator = a
        self.denominator = b

        self.__symbol = 1

        if a * b < 0:
            self.__symbol = 0

    def __setattr(self, name, value):
        if name == "denominator" and value == 0:
            raise ZeroDenominatorError("denominator by zero")
        return super().__setattr(self, name, value)

    # -self
    def __neg__(self):
        a, b = self.numerator, self.denominator
        if self.__symbol:
            return Fraction(a, b)
        return Fraction(abs(a), abs(b))

    # +self
    def __pos__(self):
        return self

    def __str__(self):
        a, b = self.numerator, self.denominator
        if a == 0:
            return "0"
        return "-" * abs(self.__symbol - 1) + f"{abs(a)}/{abs(b)}"

    def __repr__(self):
        ...

    __repr__ == __str__

    # +
    def __add__(self, other):
        a, b = self.numerator, self.denominator
        c, d = other.numerator, other.denominator
        if a == 0:
            return Fraction(c, d)
        if c == 0:
            return Fraction(a, b)

        ad = a * d
        bc = b * c
        bd = b * d

        return Fraction(ad + bc, bd)

    # -
    def __sub__(self, other):
        a, b = self.numerator, self.denominator
        c, d = other.numerator, other.denominator
        if a == 0:
            return -Fraction(c, d)
        if c == 0:
            return Fraction(a, b)

        ad = a * d
        bc = b * c
        bd = b * d

        return Fraction(ad + bc, bd)

    # *
    def __mul__(self, other):
        return Fraction(
            self.numerator * other.numerator, self.denominator * other.denominator
        )

    # /
    def __truediv__(self, other):
        if other.numerator == 0:
            raise ZeroDivisionError("division by zero")
        ad, bc = self.numerator * other.denominator, self.denominator * other.numerator

        return Fraction(ad, bc)

    # int(self)
    def __int__(self):
        return int(self.numerator / self.denominator)

    # float(self)
    def __float__(self):
        return self.numerator / self.denominator

    #  !=
    def __ne__(self, other) -> bool:
        if isinstance(other, Fraction):
            return str(self) != str(other)
        return True

    # ==
    def __eq__(self, other):
        if isinstance(other, Fraction):
            return str(self) == str(other)
        return False

    # <
    def __lt__(self, other) -> bool:
        if isinstance(other, Fraction):
            return float(self) < float(other)
        raise TypeError(
            f"'<' not supported between instances of 'Fraction' and {type(other)}"
        )

    # <=
    def __le__(self, other) -> bool:
        if isinstance(other, Fraction):
            return float(self) <= float(other)
        raise TypeError(
            f"'<=' not supported between instances of 'Fraction' and {type(other)}"
        )

    # >
    def __gt__(self, other) -> bool:
        if isinstance(other, Fraction):
            return float(self) > float(other)
        raise TypeError(
            f"'>' not supported between instances of 'Fraction' and {type(other)}"
        )

    # >=
    def __ge__(self, other) -> bool:
        if isinstance(other, Fraction):
            return float(self) >= float(other)
        raise TypeError(
            f"'>=' not supported between instances of 'Fraction' and {type(other)}"
        )

    # abs(self)
    def __abs__(self):
        a, b = self.numerator, self.denominator
        if self.__symbol:
            return Fraction(a, b)
        return Fraction(-a, b)

    # bool(self)
    def __bool__(self):
        if self.numerator == 0:
            return False
        return True

这个的功能雏形差不多了,约分没实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 15:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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