LeetCode 166. Fraction to Recurring Decimal

Posted co0oder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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正负号的部分,用到了异或^。

以上是关于LeetCode 166. Fraction to Recurring Decimal的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 166. Fraction to Recurring Decimal

LeetCode 166. Fraction to Recurring Decimal(模拟)

166. Fraction to Recurring Decimal

166 Fraction to Recurring Decimal 分数到小数

166. Fraction to Recurring Decimal

166. Fraction to Recurring Decimal