题目地址:
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的具体值和循环节的长度。