Skip to content

972. Equal Rational Numbers 👎

  • Time:
  • Space:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
 public:
  bool isRationalEqual(string S, string T) {
    return abs(valueOf(S) - valueOf(T)) < 1e-9;
  }

 private:
  vector<double> ratios{1.0, 1.0 / 9, 1.0 / 99, 1.0 / 999, 1.0 / 9999};

  double valueOf(const string& s) {
    if (s.find('(') == string::npos)
      return stod(s);

    double integer_nonRepeating = stod(s.substr(0, s.find_first_of('(')));
    int nonRepeatingLength = s.find_first_of('(') - s.find_first_of('.') - 1;
    int repeating =
        stoi(s.substr(s.find_first_of('(') + 1, s.find_first_of(')')));
    int repeatingLength = s.find_first_of(')') - s.find_first_of('(') - 1;

    return integer_nonRepeating +
           repeating * pow(0.1, nonRepeatingLength) * ratios[repeatingLength];
  }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
  public boolean isRationalEqual(String S, String T) {
    return Math.abs(valueOf(S) - valueOf(T)) < 1e-9;
  }

  private double[] ratios = new double[] {1.0, 1.0 / 9, 1.0 / 99, 1.0 / 999, 1.0 / 9999};

  private double valueOf(final String s) {
    if (!s.contains("("))
      return Double.valueOf(s);

    double integer_nonRepeating = Double.valueOf(s.substring(0, s.indexOf('(')));
    int nonRepeatingLength = s.indexOf('(') - s.indexOf('.') - 1;
    int repeating = Integer.parseInt(s.substring(s.indexOf('(') + 1, s.indexOf(')')));
    int repeatingLength = s.indexOf(')') - s.indexOf('(') - 1;

    return integer_nonRepeating +
        repeating * Math.pow(0.1, nonRepeatingLength) * ratios[repeatingLength];
  }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class Solution:
  def isRationalEqual(self, S: str, T: str) -> bool:
    def valueOf(s: str) -> float:
      if s.find('(') == -1:
        return float(s)

      integer_nonRepeating = float(s[:s.find('(')])
      nonRepeatingLength = s.find('(') - s.find('.') - 1
      repeating = float(s[s.find('(') + 1: s.find(')')])
      repeatingLength = s.find(')') - s.find('(') - 1

      return integer_nonRepeating + repeating * 0.1**nonRepeatingLength * ratios[repeatingLength]

    ratios = [1, 1 / 9, 1 / 99, 1 / 999, 1 / 9999]

    return abs(valueOf(S) - valueOf(T)) < 1e-9