给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2 输出: "0.5"
示例 2:
输入: numerator = 2, denominator = 1 输出: "2"
示例 3:
输入: numerator = 2, denominator = 3 输出: "0.(6)"
用int最后几个测试用例实在是不行,我就改成long了 思路就是模拟我们自己计算的过程把小数部分和整数部分保存起来,这里用了一个小技巧,就是用map(余数,对应小数位置),这样好把循环体标记出来
class Solution { public: string fractionToDecimal(long int num, long int d) { vector<int> v_z; //整数部分 vector<int> v_d; //小数部分 unordered_map<long int,int> m; bool circle=false; bool negative=false; if((num>0&&d<0)||(num<0&&d>0))negative=true; long int c=num%d; int k; if(c==0){ return to_string(num/d); } //无小数 else{ c=abs(c); m[c]=1; v_z.push_back(num/d); k=2; num=abs(num); d=abs(d); while(c!=0){ num=c*10; m[c]=k;k++; v_d.push_back(num/d); c=num%d; if(m[c]!=0){ circle=true; k=m[c]; break; } } } string res=""; if(v_z.size()==1&&v_z[0]==0&&negative)res+='-'; for(int i=0;i<v_z.size();i++){ res+=to_string(v_z[i]); } res+='.'; for(int i=0;i<v_d.size();i++) { if(circle&&i==k-2)res+='('; res+=to_string(v_d[i]); } if(circle)res+=')'; return res; } };