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正负号的部分,用到了异或^。

posted @ 2016-03-20 15:40  co0oder  阅读(251)  评论(0编辑  收藏  举报