-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
94 lines (85 loc) · 2.4 KB
/
main.cpp
File metadata and controls
94 lines (85 loc) · 2.4 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
94
// Source: https://leetcode.com/problems/fraction-to-recurring-decimal
// Title: Fraction to Recurring Decimal
// Difficulty: Medium
// Author: Mu Yang <http://muyang.pro>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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 `10^4` 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:**
//
// - `-2^31 <=numerator, denominator <= 2^31 - 1`
// - `denominator != 0`
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <cstdint>
#include <sstream>
#include <unordered_map>
using namespace std;
// Use long division
class Solution {
public:
string fractionToDecimal(int64_t numerator, int64_t denominator) {
ostringstream oss;
// Ensure denom > 0
if (denominator < 0) {
numerator = -numerator;
denominator = -denominator;
}
// Ensure denom > 0
if (numerator < 0) {
oss << "-";
numerator = -numerator;
}
// Integer part
oss << (numerator / denominator);
numerator %= denominator;
// Fraction part
if (numerator != 0) {
oss << ".";
auto seen = unordered_map<int64_t, int>(); // seen numerator -> index
string fraction;
for (auto index = 0; numerator > 0; ++index) {
if (seen.count(numerator)) break;
seen[numerator] = index;
auto quotient = (10 * numerator) / denominator;
auto reminder = (10 * numerator) % denominator;
fraction += ('0' + quotient);
numerator = reminder;
}
if (numerator > 0) {
auto index = seen[numerator];
oss << fraction.substr(0, index) << "(" << fraction.substr(index) << ")";
} else {
oss << fraction;
}
}
return oss.str();
}
};