给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2
输出: "0.5"
示例 2:
输入: numerator = 2, denominator = 1
输出: "2"
示例 3:
输入: numerator = 2, denominator = 3
输出: "0.(6)"
代码:
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
long _num = numerator == INT_MIN ? 0x80000000 : abs(numerator);
long _den = denominator == INT_MIN ? 0x80000000 : abs(denominator);
// 先计算整数部分
long zs = _num / _den;
if(zs < 0) zs *= -1;
_num = _num % _den;
// 判断是否为正数
bool is_pos = ((numerator ^ denominator) >= 0 ? true : false);
vector<long> re; // 用于记录小数部分
// 用来存放被使用的被除数,用于判断是否存在循环小数,对应的是在re中的下标
unordered_map<long, int> _map;
int crc_index = -1; // 记录循环小数的起始下标
while(_num != 0) {
while(_num < _den) {
_num *= 10;
if(_num < _den)
re.push_back(0);
}
if(_map.find(_num) != _map.end()) {
// 存在循环小数
crc_index = _map[_num];
break;
} else {
re.push_back(_num / _den);
_map[_num] = re.size() - 1;
_num %= _den;
}
}
string re_str= to_string(zs);
if(re.size() > 0) re_str += ".";
for(int i = 0; i < re.size(); ++i) {
if(i == crc_index) {
re_str += "(";
}
re_str += to_string(re[i]);
}
if(crc_index != -1) re_str += ")"; // 有循环小数
if(!is_pos && numerator != 0) re_str = "-" + re_str; // 负数情况
return re_str;
}
};
网友评论