欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【leetcode】166. Fraction to Recurring Decimal

程序员文章站 2024-01-20 09:41:22
...

题目:
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.


思路:
小数点后的数字是否出现循环,关键看余数(余数或者余数乘10都行)是否出现重复出现。每次求出余数时,都会将余数以及对应的index保存到map中。如果map中没有此余数,说明此余数未出现过,直接将余数以及对应的index保存到map中就好;如果发现余数在map中,说明余数重复出现了,则取出此余数值对应的index,然后在index位置插入“(”。最后在末尾处再追加“)”即可。

1/7的计算过程如下:
【leetcode】166. Fraction to Recurring Decimal
1/70的计算过程如下:
【leetcode】166. Fraction to Recurring Decimal


代码实现:
真就根据test case一点一点改的,全是细节。相比于编写程序,设计测试用例真的是一件很难的事情,需要你考虑周全所有的情况。

编写程序时,所有参与运算的变量一定要用long类型,否则会出现溢出,test case有相应的边界测试。

class Solution {
public:
    
    string fractionToDecimal(int numerator, int denominator) {
        if (numerator == 0){
            return "0";
        }
        string ret = "";
        bool positive;
        if ((numerator > 0 && denominator > 0) || (numerator < 0 && denominator < 0)){
            positive = true;
        }else{
            positive = false;
        }
        
        long long_numerator = numerator;
        long long_denominator = denominator;
        long_numerator = abs(long_numerator);
        long_denominator = abs(long_denominator);
        
        ret += to_string(long_numerator/long_denominator);
        if (long_numerator % long_denominator == 0){
            if (positive == false){
                ret = "-"+ret;
            }
            return ret;
        }
    
        ret += ".";
        
        long times;
        long remain = long_numerator % long_denominator;
        
        unordered_map<int, int> my_map;
        do{
            remain *= 10; // 此行代码也可以放到“my_map[remain] = ret.size()”后面,一样的事。
            if (my_map.find(remain) != my_map.end()){
                int left_i = my_map[remain];
                ret.insert(left_i,1,'(');
                ret += ')';
                break;
            }
            my_map[remain] = ret.size();
            
            times = remain / long_denominator;
            remain = remain % long_denominator;
            ret += to_string(times);
            
        }while (remain);
        
        if (positive == false){
            ret = "-"+ret;
        }
        return ret;
    }
};

【leetcode】166. Fraction to Recurring Decimal


参考:
https://blog.csdn.net/fuxuemingzhu/article/details/82533218