Equal Rational Numbers

Parse non-repeating + repeating parts, expand to a long decimal, compare floats with tolerance — or reduce to fractions.

Hard
Time O(L) Space O(L)
LeetCode
9 min read
math string parsing

Problem#

Each input string is a non-negative rational like "0.1(6)" (= 1/6). Return true iff the two numbers are equal.

Examples#

  • "0.(52)", "0.5(25)"true.
  • "0.1666(6)", "0.166(66)"true; "0.9(9)", "1."true.

Constraints#

  • Each string length <= 20.

Approach#

Convert each rational to a numerator/denominator pair: parse integer part, non-repeating decimal part, and repeating decimal part; build the fraction algebraically (a + b/10^k + c/(10^k * (10^r - 1))). Compare cross-multiplied.

Solution#

Equal Rational Numbers
class Solution {
static pair<long long,long long> reduce(long long n, long long d) {
long long g = __gcd(n, d);
return {n / g, d / g};
}
static pair<long long,long long> parse(const string& s) {
long long ip = 0, nr = 0, rp = 0;
int nrLen = 0, rpLen = 0;
int i = 0, n = s.size();
while (i < n && s[i] != '.') ip = ip * 10 + (s[i++] - '0');
if (i < n && s[i] == '.') ++i;
while (i < n && s[i] != '(') { nr = nr * 10 + (s[i++] - '0'); ++nrLen; }
if (i < n && s[i] == '(') {
++i;
while (i < n && s[i] != ')') { rp = rp * 10 + (s[i++] - '0'); ++rpLen; }
}
long long p10 = 1;
for (int k = 0; k < nrLen; ++k) p10 *= 10;
long long pR = 1;
for (int k = 0; k < rpLen; ++k) pR *= 10;
// value = ip + nr / p10 + rp / (p10 * (pR - 1)) [when rpLen > 0]
long long num, den;
if (rpLen == 0) {
num = ip * p10 + nr;
den = p10;
} else {
long long denom = p10 * (pR - 1);
num = ip * denom + nr * (pR - 1) + rp;
den = denom;
}
return reduce(num, den);
}
public:
bool isRationalEqual(string s, string t) {
auto [a, b] = parse(s);
auto [c, d] = parse(t);
return a == c && b == d;
}
};

Editorial#

The closed form 0.(r) = r / (10^|r| - 1) lets us turn any repeating decimal into a rational exactly. Reducing each fraction with gcd gives a canonical form; equality becomes a tuple comparison without floating-point pitfalls like 0.(9) == 1.

Complexity#

  • Time: O(L).
  • Space: O(1) beyond input.

Concept revision#

Search ESC

Keyboard shortcuts

Shortcuts are disabled while typing in inputs.