【leetcode】Fraction to Recurring Decimal

Fraction to Recurring Decimal

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)".

 

    0.16  
6 ) 1.00
    0 
    1 0       <-- Remainder=1, mark 1 as seen at position=0.
    - 6 
      40      <-- Remainder=4, mark 4 as seen at position=1.
    - 36 
       4      <-- Remainder=4 was seen before at position=1, so the fractional part which is 16 starts repeating at position=1 => 1(6).

如果发现余数曾经出现过,则说明开始循环了,利用一个hash表记录余数出现的位置即可
注意INT_MIN转换成正数会溢出,故需要先把数字先转为long long int
注意余数也要去long long int,因为-1,2147483648这种情况下,余数在计算乘以10的过程中会溢出
 
 1 class Solution {
 2 public:
 3     string fractionToDecimal(int numerator, int denominator) {
 4        
 5        
 6         string ans="";
 7         if(numerator==0) return "0";
 8        
 9         long long int n=numerator;
10         long long int d=denominator;
11         n=abs(n);
12         d=abs(d);
13        
14         if(numerator<0^denominator<0) ans.push_back('-');
15        
16         map<long long int,int> hash;
17        
18         ans+=to_string(n/d);
19         long long int rem=n%d;
20         if(rem!=0) ans.push_back('.');
21        
22         while(rem!=0)
23         {
24             if(hash.find(rem)!=hash.end())
25             {
26                 ans.insert(hash[rem],"(");
27                 ans.push_back(')');
28                 break;
29             }
30            
31             hash[rem]=ans.length();
32            
33             ans+=to_string(rem*10/d);
34             rem=(rem*10)%d;
35         }
36        
37         return ans;
38     }
39 };

 

posted @ 2015-01-18 20:16  H5开发技术  阅读(193)  评论(0编辑  收藏  举报