166分数到小数

tech2022-09-22  71

题目描述: 给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。 如果小数部分为循环小数,则将循环的部分括在括号内。

示例 1: 输入: numerator = 1, denominator = 2 输出: “0.5”

示例 2: 输入: numerator = 2, denominator = 1 输出: “2”

示例 3: 输入: numerator = 2, denominator = 3 输出: “0.(6)”

方法1: 主要思路: (1)模拟除法的过程; (2)先求出整数部分; (3)若不是整除,加上点之后,处理小数部分; (4)为了避免循环小数的情形,使用unordered_map来统计之前出现过的数字,及对应的索引;

class Solution { public: string fractionToDecimal(int numerator, int denominator) { //避免越界 long long num=numerator; long long den=denominator; string str; if(num*den<0){ str+='-';//处理符号 } num=abs(num); den=abs(den); str+=to_string(num/den);//处理整数部分 num%=den; if(num==0){ return str; } //处理小数部分 unordered_map<long long,long long>mp; str+='.'; int end=-1; while(num){ //表示出现了循环情形 if(mp.count(num)){ end=mp[num];//得到循环的位置 break; } else{ mp[num]=str.size();//统计字符 } //接着做除法 num*=10; str+=to_string(num/den); num%=den; } if(num==0){//判断是否是循环的情形 return str; } return str.substr(0,end)+"("+str.substr(end)+")";//循环的情形 } };
最新回复(0)