Fraction to Recurring Decimal

思路:1、对分子为0的可以提前返回

         2、结果为正负的判断

        3、数组越界(最小负数除以-1)

        4、对于遇到小数的开始要加上“.”,有小数后可以扩大被除数,对于是否有重复的地方要判断其被除数是否重复了!!!

对于abs()函数切记,先把数转换为长整型,然后再用abs(),否则最小负数是转换不了正数的!!!

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        string res;
        if(numerator==0) return "0";
        if((numerator<0)^(denominator<0))
        res+="-";
        long long n=numerator;
        long long d=denominator;
        n=abs(n);
        d=abs(d);
        unordered_map<int,int> rep;
        bool isFract=false;
        while(true)
        {
            if(n<d)
            {
                if(isFract==false)
                {
                    if(res==""||res=="-")
                    res+="0.";
                    else 
                    res+=".";
                    isFract=true;
                }
                  n*=10;
            }
            int r=n-n/d*d;
            if(r==0)
            {
               res+=to_string(n/d);
               return res;
            }
            else
            {
                if(isFract==true)
                {
                    if(rep.find(n)==rep.end())
                     {
                         res+=to_string(n/d);
                         rep[n]=res.size()-1;
                     }
                     else
                     {
                         int pos=rep[n];
                         res=res.substr(0,pos)+"("+res.substr(pos)+")";
                         return res;
                     }
                }
                else
                 res+=to_string(n/d);
                 n=r;
            }
            
        }
    }
};

 

posted on 2016-03-29 12:04  RenewDo  阅读(155)  评论(0编辑  收藏  举报

导航