【Leetcode】166. Fraction to Recurring Decimal

题目地址:

https://leetcode.com/problems/fraction-to-recurring-decimal/

给定两个整数 x x x y y y,求其商,以小数形式表示。循环节要用括号括起来。

思路是先确定正负号,然后求 ∣ x / y ∣ |x/y| x/y。不妨设 x > 0 , y > 0 x>0,y>0 x>0,y>0。可以先求整数部分,如果没有余数,则直接返回整数部分;否则小数部分就等于 ( x m o d    y ) / y (x\mod y)/y (xmody)/y。按照手工除法的方法,每次会将当前数乘以 10 10 10再除以 y y y作为当前位的结果,然后当前数模 y y y继续进行下一位的计算。如果某一次发现当前余数是之前出现过的,那么就确定了出循环节的出现。为此,我们开一个哈希表,key存余数,value存计算到哪里得到了key这个余数。代码如下:

class Solution {
 public:
  string fractionToDecimal(int a, int b) {
    long x = a, y = b;
    string s;
    if (x % y == 0) return to_string(x / y);
    if ((x < 0) ^ (y < 0)) s = "-";
    x = abs(x), y = abs(y);
    s += to_string(x / y) + ".";
    unordered_map<int, int> mp;
    x %= y;
    while (x && !mp.count(x)) {
      mp[x] = s.size();
      x *= 10;
      s += to_string(x / y);
      x %= y;
    }

    if (!x) return s;
    return s.substr(0, mp[x]) + '(' + s.substr(mp[x]) + ')';
  }
};

时空复杂度取决于 x / y x/y x/y的具体值和循环节的长度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值