Leetcode 972. 相等的有理数

1.题目基本信息

1.1.题目描述

给定两个字符串 s 和 t ,每个字符串代表一个非负有理数,只有当它们表示相同的数字时才返回 true 。字符串中可以使用括号来表示有理数的重复部分。

有理数 最多可以用三个部分来表示:整数部分 、小数非重复部分 和小数重复部分 <(><)>。数字可以用以下三种方法之一来表示:

    • 例: 0 ,12 和 123
  • <.>

    • 例: 0.5 , 1. , 2.12 和 123.0001
  • <.><(><)>

    • 例: 0.1(6) , 1.(9), 123.00(1212)

十进制展开的重复部分通常在一对圆括号内表示。例如:

  • 1 / 6 = 0.16666666... = 0.1(6) = 0.1666(6) = 0.166(66)

1.2.题目地址

https://leetcode.cn/problems/equal-rational-numbers/description/

2.解题方法

2.1.解题思路

分数类。对于0.(12)这样的数,等于(12/100+12/10000+12/1000000+...),可以发现是12乘以一个等比数列的和,记r=10*(-k),x=12,则求极限可知原数等于xr/(1-r)(其中k为括号中的数的长度)。然后根据Fraction分数类构建分数,比较大小即可

3.解题代码

python代码

from fractions import Fraction

class Solution:
    def isRationalEqual(self, s: str, t: str) -> bool:
        # 思路:分数类。对于0.(12)这样的数,等于(12/100+12/10000+12/1000000+...),可以发现是12乘以一个等比数列的和,记r=10**(-k),x=12,则求极限可知原数等于x*r/(1-r)(其中k为括号中的数的长度)。然后根据Fraction分数类构建分数,比较大小即可
        def getFraction(s1:str):
            n = len(s1)
            ans = 0
            if "." not in s1:
                ans += int(s1)
                return ans
            else:
                i1 = s1.index(".")
                ans += int(s1[:i1])
                if "(" not in s1:
                    if n - i1 - 1 > 0:
                        ans += Fraction(int(s1[i1 + 1:]), 10 ** (n - i1 - 1))
                    return ans
                else:
                    i2 = s1.index("(")
                    len1 = i2 - i1 - 1
                    len2 = n - i2 - 2
                    if len1 > 0:
                        ans += Fraction(int(s1[i1 + 1:i2]), 10 ** len1)
                    ans += Fraction(int(s1[i2 + 1:n - 1]), 10 ** len1 * (10 ** len2 - 1))
                    return ans
        # print(getFraction(s))
        # print(getFraction(t))
        return getFraction(s) == getFraction(t)

4.执行结果

posted @ 2025-07-16 08:57  Geek0070  阅读(15)  评论(0)    收藏  举报