给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数
    如果小数部分为循环小数,则将循环的部分括在括号内。
    如果存在多个答案,只需返回 任意一个
    对于所有给定的输入,保证 答案字符串的长度小于 10

    示例 1:

    1. 输入:numerator = 1, denominator = 2
    2. 输出:"0.5"

    示例 2:

    1. 输入:numerator = 2, denominator = 1
    2. 输出:"2"

    示例 3:

    1. 输入:numerator = 2, denominator = 3
    2. 输出:"0.(6)"

    示例 4:

    1. 输入:numerator = 4, denominator = 333
    2. 输出:"0.(012)"

    示例 5:

    1. 输入:numerator = 1, denominator = 5
    2. 输出:"0.2"


    提示:

    • -2 <= numerator, denominator <= 2 - 1
    • denominator != 0
    1. class Solution {
    2. public:
    3. string fractionToDecimal(int numerator, int denominator) {
    4. if(denominator==0) return "";//边界条件,分母为0
    5. if(numerator==0) return "0";//边界条件,分子为0
    6. string result;
    7. //转换为longlong防止溢出
    8. long long num = static_cast<long long>(numerator);
    9. long long denom = static_cast<long long>(denominator);
    10. //处理正负号,一正一负取负号
    11. if((num>0)^(denom>0))result.push_back('-');
    12. //分子分母全部转换为正数
    13. num=llabs(num);denom=llabs(denom);
    14. //处理整数部分
    15. result.append(to_string(num/denom));
    16. //处理小数部分
    17. num%=denom; //获得余数
    18. if(num==0)return result; //余数为0,表示整除了,直接返回结果
    19. result.push_back('.'); //余数不为0,添加小数点
    20. int index=result.size()-1; //获得小数点的下标
    21. unordered_map<int,int> record; //map用来记录出现重复数的下标,然后将'('插入到重复数前面就好了
    22. while(num&&record.count(num)==0){ //小数部分:余数不为0且余数还没有出现重复数字
    23. record[num]=++index;
    24. num*=10; //余数扩大10倍,然后求商,和草稿本上运算方法是一样的
    25. result+=to_string(num/denom);
    26. num%=denom;
    27. }
    28. if(record.count(num)==1){ //出现循环余数,我们直接在重复数字前面添加'(',字符串末尾添加')'
    29. result.insert(record[num],"(");
    30. result.push_back(')');
    31. }
    32. return result;
    33. }
    34. };