要求:模拟分子除以分母
思路:有理数包括整数和分数,分数为有限小数或者无限循环。出现无限循环可以看余数
class Solution {
using ll = long long;
public:
string fractionToDecimal(int numerator, int denominator) {
ll n = numerator, d = denominator;
string ret;
// 计算整数部分,化成正数
if(n * d < 0) ret += "-";
ll a = n / d;
if(a < 0) a *= -1;
ret += to_string(a);
if(n < 0) n*= -1;
if(d < 0) d*= -1;
// 拿余数计算小数部分
n %= d;
if(n == 0)
return ret;
ret += ".";
// 哈希表记录是否有第二次出现
unordered_map<int, int> st;
string t;
int index = 0;
//一次循环是一次除法
while(n && !st.count(n)) {
st[n] = index++;//当前余数的位置,一开始不一定是循环
n *= 10;
t.push_back((char)(n / d + '0'));//t存小数部分,包括不在循环内的
n %= d;
}
if(n != 0) {
// 说明出现了循环,此时对循环部分 [st[n], index] 加括号
ret += t.substr(0, st[n]) + "(" + t.substr(st[n]) + ")";
} else {
ret += t;
}
return ret;
}
};