Leetcode (没有转换long long类型) Fraction to Recurring Decimal

const int shift = sizeof(int) * 8 - 1;
#define LESS_THAN_ZERO(X)  (X)>>shift
class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        if(!denominator){
            return "NaN";
        }
        string res = "";
        if(numerator && denominator && 
           (LESS_THAN_ZERO(numerator)) ^ (LESS_THAN_ZERO(denominator))){
            res = "-";   
        }
        int remainder = 0;
        if(numerator == INT_MIN && abs(denominator) == 1)
        {
            res += to_string(INT_MIN);
            res.erase(0,1);
        }else{
            res += to_string(abs(numerator / denominator));
            remainder = abs(numerator % denominator);
        }
        if(remainder){            
            unordered_map<int,int> repeat;
            res += ".";
            const int FACTOR = (LESS_THAN_ZERO(denominator - 10)? 1 :10),
                      FACTOR_RECIPROCAL = 10 / FACTOR;
            int digit = abs(denominator % FACTOR);
            auto NEW_REMAINDER = [](int R,int r,int D,int d,int F)  -> int{ 
                return (F*R - r * d  - r * D * F); 
            };
            denominator = abs(denominator / FACTOR);
            for(int curPos = res.length(); remainder; curPos++){
                if(repeat.count(remainder)>0){
                   res.insert(repeat[remainder],"(");
                   res.push_back(')');
                   return res;
                }
                repeat[remainder]=curPos;
                remainder = FACTOR_RECIPROCAL * remainder;  
                int tmpRes = remainder / denominator;    
                while(LESS_THAN_ZERO(
                    NEW_REMAINDER(remainder,tmpRes,denominator,digit,FACTOR)))
                {
                      tmpRes--;    
                }
                remainder = NEW_REMAINDER(remainder,tmpRes,denominator,digit,FACTOR);
                res += to_string(tmpRes);
            }           
        }
        return res;
    }
};









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值