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;
}
};