2015.1.23 15:59
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.
For example,
Given numerator = 1, denominator = 2, return "0.5".
Given numerator = 2, denominator = 1, return "2".
Given numerator = 2, denominator = 3, return "0.(6)".
Solution:
First of all, the denominator won't be 0. Next you should take care of the sign first, + or -, make it positive.
3 % 5 == 3
5 % 3 == 2
6 % 3 == 0
The process of calculating a rational fraction is actually by division and modulus. If the remainder is zero, you get a finite fraction, otherwise an infinite loop. There's gonna be a loop as long as it is rational fraction. So, you'll have to record the remainder sequence, with a hash table maybe. When the same remainder is encountered, you know you've found the loop sequence.
Also there's something to be careful about printing. Like the following.
5 / 3 == 1.(6)
0 / 3 == 0
6 / 3 == 2
1 / 7 == 0.(142857)
The denominator can be really large, so don't try to use an int A[MAXN] to record the sequence, it won't do. That's why I suggest hashing.
The time complexity is generally O(denominator), but should be much smaller in fact. The fraction 1 / n may have a loop sequence of at most n - 1 in length, but usually far shorter. Space complexity is the same scale.
Accepted code:
1 // 1RE, 1TLE, 3MLE, 1AC, watch out for boundary cases and memory limit 2 #include <iostream> 3 #include <string> 4 #include <vector> 5 #include <unordered_map> 6 using namespace std; 7 8 typedef long long int ll; 9 10 class Solution { 11 public: 12 string fractionToDecimal(int numerator, int denominator) { 13 ll n = numerator; 14 ll d = denominator; 15 16 int sn, sd; 17 18 sn = n >= 0 ? 1 : -1; 19 n = n >= 0 ? n : -n; 20 sd = d >= 0 ? 1 : -1; 21 d = d >= 0 ? d : -d; 22 23 if (n == 0) { 24 return "0"; 25 } 26 27 string res = ""; 28 if (sn * sd < 0) { 29 res.push_back('-'); 30 } 31 32 ll q = n / d; 33 ll r = n % d; 34 35 res += to_string(q); 36 37 if (r == 0) { 38 return res; 39 } 40 41 res.push_back('.'); 42 int pos = (int)res.length(); 43 44 unordered_map<ll, int> seq; 45 unordered_map<ll, int>::iterator it; 46 47 while (r != 0) { 48 it = seq.find(r); 49 if (it != seq.end()) { 50 res.insert(it->second, "("); 51 res.push_back(')'); 52 return res; 53 } 54 seq[r] = pos; 55 q = r * 10 / d; 56 r = r * 10 % d; 57 res.push_back((int)q + '0'); 58 ++pos; 59 } 60 61 seq.clear(); 62 return res; 63 } 64 private: 65 }; 66 /* 67 int main() 68 { 69 int n, d; 70 Solution sol; 71 72 while (cin >> n >> d) { 73 cout << sol.fractionToDecimal(n, d) << endl; 74 } 75 76 return 0; 77 } 78 */