题目来源:leetcode.cn
问题描述:
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
string fractionToDecimal(int numerator, int denominator) {
long numerator_long=(long)numerator,denominator_long=(long)denominator; //强制转换为long型,防止测试用例(-1,-2147483648)溢出
string ans;
if((numerator_long<0&&denominator_long>0)||(numerator_long>0&&denominator_long<0)){ //结果为负数时需提前预处理,结果加负号并将除数和被除数转绝对值
ans.push_back('-');
}
numerator_long= abs(numerator_long),denominator_long=abs(denominator_long);
ans+= to_string(numerator_long/denominator_long); //先求整数部分,因为整数部分和小数部分间有小数点
numerator_long=numerator_long%denominator_long;
if(numerator_long==0){ //求完整数部分若余0则不用加小数点,直接返回
return ans;
}else{
ans.push_back('.');
numerator_long*=10; //每除一次,余数乘以10
}
int index=ans.size(); //每次除数对应的商的下标
unordered_map<int,int> history; //哈希表记录每次除过之后的余数和该次除法上商的下标
while(numerator_long!=0&&ans.size()<1e4){
if(history.count(numerator_long)){ //出现与之前的余数相等,证明有循环,加()退出
ans.insert(ans.begin()+history.find(numerator_long)->second,'(');
ans.push_back(')');
break;
}
history.insert(make_pair(numerator_long,index)); //正常的除法步骤
ans+= to_string(numerator_long/denominator_long);
numerator_long=numerator_long%denominator_long*10;
index++;
}
return ans;
}