<leetcode c++>166. 分数到小数

给定两个整数,分别表示分数的分子 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;
    }
};

猜你喜欢

转载自www.cnblogs.com/Dancing-Fairy/p/12673425.html