LeetCode第166题--分数到小数

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

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

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

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

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        string strRes = "";
        if(denominator == 0) return strRes;
        if(numerator == 0)
        {
            strRes += "0";
            return strRes;
        }
        if((numerator > 0) ^ (denominator > 0))
        {
            strRes += "-";
        }
        long numA = fabs(numerator);
        long numB = fabs(denominator);
        if(numA % numB == 0)
        {
            strRes += to_string(numA/numB);
            return strRes;
        }
        strRes += to_string(numA/numB);
        strRes += ".";
        numA = numA % numB;
        vector<int> remain;     //除数取余部分,发现重复表示小数部分第一个循环结束
        vector<int> deci;       //小数部分
        while(numA != 0 && find(remain.begin(), remain.end(), numA) == remain.end())
        {
            remain.push_back(numA);
            deci.push_back(numA*10/numB);
            numA = (numA*10)%numB;
        }
        
        auto it1 = remain.begin();
        auto it2 = deci.begin();
        bool bHasCircule = false;
        for(; it1 != remain.end(); it1++, it2++)
        {
            if(*it1 == numA)
            {
                bHasCircule = true;
                strRes += "(";
            }
            strRes += to_string(*it2);
        }
        if(bHasCircule)  //此处可用find函数找"("代替
        {
            strRes += ")";
        }
        return strRes;      
    }
};

难点在于如何判断是否是循环小数,以及找出循环节的位置
判断是循环: 跳出while循环的时候余数为0就不是循环小数
找出循环节的位置: 当同一个余数出现两次时,就找到了循环节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值