LeetCode 166. Fraction to Recurring Decimal
结果小数点后面如果是循环的话,要用括号把循环出现的部分括起来。
找出循环部分的思路:
维护一个unordered_map<long, long>dict,对应关系是余数及其在res中的位置。每次计算小数点后的每一位结果时,查找是否已经在dict中,如果已经在了,那么说明已经找到了重复的部分(如结果0.(012),目前得到res=“0.012”,结果又一次得到了0,所以小数点后第一个0开始的部分012就是循环部分),于是在res中insert括号即可return res。
除法的思路:
remain存放每次除法的余数,while(remain)循环,循环中每次remain *= 10, res += remain / denominator, remain = remain % denominator.
1 class Solution { 2 public: 3 string fractionToDecimal(int numerator, int denominator) { 4 if(!numerator) return "0"; 5 string res = ""; 6 if(numerator < 0 ^ denominator < 0) res += "-"; 7 long m = abs(long(numerator)); 8 long n = abs(long(denominator)); 9 long s = m / n; 10 res += to_string(s); 11 12 long remain = m % n; 13 if(!remain) return res; 14 res += "."; 15 16 unordered_map<long, long> dict; 17 18 while(remain){ 19 if(dict.find(remain) != dict.end()){ 20 res.insert(dict[remain],"("); 21 res += ")"; 22 return res; 23 } 24 dict[remain] = res.length(); 25 remain *= 10; 26 s = remain / n; 27 res += to_string(s); 28 remain = remain % n; 29 } 30 return res; 31 } 32 };
注意判断res正负号的部分,用到了异或^。