166. Fraction to Recurring Decimal Medium

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.

For example,

  • Given numerator = 1, denominator = 2, return "0.5".
  • Given numerator = 2, denominator = 1, return "2".

  • Given numerator = 2, denominator = 3, return "0.(6)".

思路:我们首先知道,在做除法时,只要余数出现了重复的情况,最终结果就会是一个循环小数。我们使用deque来存储得到的每一个余数和商的每一位,并用hash表判断余数一旦出现了重复,就在重复的数开始加上括号。       注意本题的测试样例很大,因此要先将int转化为 long long int来计算,还要注意积为负数时加上负号。

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        string result = "";
        deque<string>point;
        deque<string>quotient;
        if (numerator == 0) {
            return "0";
        }
        if(denominator == 0) {
            return result;
        }
        if ((numerator < 0) ^ (denominator < 0)) {
            char symbol = '-';
            result += symbol;
        }
        long long int up = abs(numerator);
        long long int down = abs(denominator);
        up = abs(up);
        down = abs(down);
        map<int,int>hash;
        long long int inte = up / down;
        cout << inte << endl;
        stringstream a;
        a << inte;
        string temp;
        a >> temp;
        result += temp;
        string q;
        bool flag = true;
        if (up % down == 0) {
            return result;
        } else {
            result += '.';
            while (up % down != 0) {
                long long int i = up % down;
                    if (hash[i] == 0) {
                        hash[i] = 1;
                        stringstream a;
                        string t;
                        a << i;
                        a >> t;
                        point.push_back(t);
                    } else {
                        stringstream a;
                        a << i;
                        a >> q;
                        quotient.push_back(")");
                        point.push_back(")");
                        flag = false;
                        break;
                    }
                
                up = i * 10;
                long long int w = up / down;
                stringstream b;
                b << w;
                string e;
                b >> e;
                quotient.push_back(e);
            }
        }
        if (flag) {
            while (!quotient.empty()) {
                result += quotient.front();
                quotient.pop_front();
            }
        } else {
            while (!quotient.empty()) {
                if (q == point.front()) {
                    result += "(";
                }
                result += quotient.front();
                quotient.pop_front();
                point.pop_front();
            }
        }
        return result;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值