【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 };

 

你可能感兴趣的:(LeetCode)