[leetcode] 166. Fraction to Recurring Decimal 解题报告

题目链接: https://leetcode.com/problems/fraction-to-recurring-decimal/

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)".

Hint:

  1. No scary math, just apply elementary math knowledge. Still remember how to perform a long division?
  2. Try a long division on 4/9, the repeating part is obvious. Now try 4/333. Do you see a pattern?
  3. Be wary of edge cases! List out as many test cases as you can think of and test your code thoroughly.

思路: 有以下几种情况:

1. 如果可以直接除尽, 那么最好, 直接返回

2. 如果不能直接除尽, 那么先取整数, 再计算小数. 计算小数部分时就是每次取商, 又可分为能除尽, 和循环小数

       1. 如果能除尽那么当最后可以整除的时候返回结果

       2. 比较麻烦的是循环小数. 我们需要将每次的被除数和当前商的位置用一个hash表存起来, 这样当某次发现相同的

           被除数时说明出现了循环, 那么就加在第一次出现这个被除数的商的位置加括号

并且在做运算的时候可能会越界, 因此我们要将除数和被除数都以long类型存储, 并且在运算之前将符号先提取出来.

写的我头好昏! ^.^

代码如下: 

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        if(numerator ==0) return "0";
        long num1 = fabs(numerator), num2 = fabs(denominator);
        int flag = (numerator>0 ^ denominator>0)?1:0;
        string ans = (flag?"-":"") + to_string(num1/num2);
        if(num1%num2 ==0) return ans;
        unordered_map<int, int> hash;
        num1 = num1%num2;
        ans += ".";
        while(!hash.count(num1))
        {
            hash[num1] = ans.size();
            num1 *= 10;
            ans += to_string(num1/num2);
            if(num1 % num2 ==0) return ans;
            num1 = num1%num2;
        }
        ans.insert(hash[num1], 1, '(');
        ans += ')';
        return ans;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值