Leetcode N0.166

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

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

示例 1:

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

输入: numerator = 2, denominator = 1
输出: "2"
示例 3:

输入: numerator = 2, denominator = 3
输出: "0.(6)"

思路:结果有三种,分别为整数、有限小数、有限循环小数。

对于前两种,可以通过判断余数是否为0的方法来求解。对于后者,可以采用容器的方法来存储所有余数,本题使用map容器,第一个数为余数值,第二个数为第几个余数(用于在循环处插入括号)。

代码:

//166
string fractionToDecimal(int numerator, int denominator)
{
    if(numerator==0) return "0";
    short s1 = numerator<0?-1:1;
    short s2 = denominator<0?-1:1;
    long long n1 = abs((long long)numerator);
    long long n2 = abs((long long)denominator);
    long long num = n1>=n2?n1/n2:0;
    long long d = n1%n2;
    string result = to_string(num);
    if(s1*s2<0)
        result ="-" + result;
    if(d==0) return result;  //整数商
    string temp;
    map<int,int> m;
    int i=0;
    while(d!=0 && m.find(d)==m.end())
    {
        m[d] = i++;
        d *=10;
        temp += (d/n2+'0');
        d = d%n2;
    }
    if(d==0) return result = result+"."+ temp;//可除尽分数
    temp = temp.insert(m[d],"(");
    temp +=")";
    result = result +"." + temp ;//循环分数
    return result;
}//166

说明:本系统为windows x64,IDE为 Qt 的 mingw 32,发现 int 和 long的字节长度一样,long long 类型才是 int 的两倍长度。经过查资料,最后得知 int 会根据系统自动变化,实际为int64_

原文地址:https://www.cnblogs.com/2Bthebest1/p/11078278.html