Bootstrap

leetcode166题-分数到小数

题目来源:leetcode.cn

问题描述:

给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。

如果小数部分为循环小数,则将循环的部分括在括号内。

如果存在多个答案,只需返回 任意一个 。

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;


    string fractionToDecimal(int numerator, int denominator) {
        long numerator_long=(long)numerator,denominator_long=(long)denominator;     //强制转换为long型,防止测试用例(-1,-2147483648)溢出
        string ans;
        if((numerator_long<0&&denominator_long>0)||(numerator_long>0&&denominator_long<0)){     //结果为负数时需提前预处理,结果加负号并将除数和被除数转绝对值
            ans.push_back('-');
        }
        numerator_long= abs(numerator_long),denominator_long=abs(denominator_long);
        ans+= to_string(numerator_long/denominator_long);           //先求整数部分,因为整数部分和小数部分间有小数点
        numerator_long=numerator_long%denominator_long;
        if(numerator_long==0){              //求完整数部分若余0则不用加小数点,直接返回
            return ans;
        }else{
            ans.push_back('.');
            numerator_long*=10;             //每除一次,余数乘以10
        }
        int index=ans.size();       //每次除数对应的商的下标
        unordered_map<int,int> history;     //哈希表记录每次除过之后的余数和该次除法上商的下标
        while(numerator_long!=0&&ans.size()<1e4){
            if(history.count(numerator_long)){          //出现与之前的余数相等,证明有循环,加()退出
                ans.insert(ans.begin()+history.find(numerator_long)->second,'(');
                ans.push_back(')');
                break;
            }
            history.insert(make_pair(numerator_long,index));            //正常的除法步骤
            ans+= to_string(numerator_long/denominator_long);
            numerator_long=numerator_long%denominator_long*10;
            index++;
        }
        return ans;
    }

;