LC166. 分数到小数

题目

给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。

如果小数部分为循环小数,则将循环的部分括在括号内。

如果存在多个答案,只需返回 任意一个 。

对于所有给定的输入,保证 答案字符串的长度小于 104 。

-2^31 <= numerator, denominator <= 2^31 - 1
denominator != 0

思路

这是一道典型的模拟题,可以选用小时候刚学除法时候的思路求解
用除数和被除数相除,整数加入字符串,余数乘10后再与被除数相除直到余数为0
但是此处需要考虑到小数为无限循环小数,可以将余数添加到哈希表中,当循环到余数重复时,说明相除后会呈现循环数,此时退出计算。

代码

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        long long num=numerator, den=denominator;
        string str;
        if(num*den<0) str+='-';
        num = abs(num);den = abs(den);
        if(!(num%den)){
            str+=to_string(num/den);
            return str;
        }
        str+=to_string(num/den);
        str+='.';
        unordered_map<long long, int> mp;
        string str1;
        num=num%den;
        int i=0;
        while(num&&!mp.count(num)){
            mp[num]=i++;
            num*=10;
            str1+=to_string(num/den);
            num%=den;
        }
        if(num!=0){
        		//str='('+str1+')';
            str1=str1.substr(0, mp[num])+"("+str1.substr(mp[num])+")";
        }
        str+=str1;
        return str;
    }
};

问题

  • 没有考虑到余数乘10后会大于in范围,应用long long
  • 没有考虑到两数可能会出现一正一负的情况,需要对两数取绝对值
  • 第一次判断失误,出现循环小数时将小数点后面的数全判断为循环数
上一篇:Java怎样创建字符串


下一篇:【C语言】strcmp模拟实现