-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path24_Fraction_to_Recurring_Decimal.cpp
More file actions
93 lines (71 loc) · 2.28 KB
/
Copy path24_Fraction_to_Recurring_Decimal.cpp
File metadata and controls
93 lines (71 loc) · 2.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// 166. Fraction to Recurring Decimal
// Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.
// If the fractional part is repeating, enclose the repeating part in parentheses.
// If multiple answers are possible, return any of them.
// It is guaranteed that the length of the answer string is less than 104 for all the given inputs.
// Example 1:
// Input: numerator = 1, denominator = 2
// Output: "0.5"
// Example 2:
// Input: numerator = 2, denominator = 1
// Output: "2"
// Example 3:
// Input: numerator = 4, denominator = 333
// Output: "0.(012)"
// Constraints:
// -231 <= numerator, denominator <= 231 - 1
// denominator != 0
// a variant with several considerations
// use reduced fraction
// judge if it has finitely many decimals; if yes, no need hashmap
class Solution
{
public:
string fractionToDecimal(int numerator, int denominator)
{
if (numerator == 0)
return "0";
string ans;
// Handle sign
if ((numerator < 0) ^ (denominator < 0))
ans += '-';
// Convert to long to avoid overflow (INT_MIN)
long long num = abs((long long)numerator);
long long den = abs((long long)denominator);
int g = gcd(num, den);
num /= g, den /= g; // consider reduced fraction
long long q = num / den;
long long r = num % den;
ans += to_string(q);
if (r == 0)
return ans;
// judge whether it has finite many decimals
int factor_wo2_5 = den;
int bz = __builtin_ctzll(factor_wo2_5);
factor_wo2_5 >>= bz;
while (factor_wo2_5 % 5 == 0)
factor_wo2_5 /= 5;
bool finteDecimal = factor_wo2_5 == 1;
ans += '.';
unordered_map<long long, int> mp;
string frac;
for (int i = 0; r != 0; i++)
{
if (!finteDecimal)
{
auto it = mp.find(r);
if (it != mp.end())
{
frac.insert(it->second, "(");
frac += ')';
break;
}
mp[r] = i;
}
r *= 10;
frac += ('0' + r / den);
r %= den;
}
return ans + frac;
}
};