首页 > 其他 > 详细

Fraction to Recurring Decimal leetcode

时间:2016-01-22 22:07:11      阅读:178      评论:0      收藏:0      [点我收藏+]

Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.

If the fractional part is repeating, enclose the repeating part in parentheses.

For example,

  • Given numerator = 1, denominator = 2, return "0.5".
  • Given numerator = 2, denominator = 1, return "2".
  • Given numerator = 2, denominator = 3, return "0.(6)".

 

Credits:
Special thanks to @Shangrila for adding this problem and creating all test cases.

 

Subscribe to see which companies asked this question

 
这个题的思路简单,
1.根据两个数得到结果正负,如负数,添加"-"
2.计算小数点前部分,添加到字符串
3.循环计算小数点后部分,并利用hashmap记录每次的除数,如果在hashmap中存在过,说明存在循环小数部分
4.将循环部分括起来
 
第一次写出的答案如下:
string fractionToDecimal(int numerator, int denominator) {
    string ret;
    int a = numerator;
    int b = denominator;

    ret = to_string(a / b);
    a = a % b;
    if (a)
        ret.push_back(.);
    else
        return ret;
    unordered_map<int, int> m;
    int i = ret.length() - 1;
    while (a)
    {
        i++;
        if (m.find(a) != m.end()) {
            ret.insert(ret.begin() + m[a], ();
            ret.push_back());
            break;
        }
        m[a] = i;
        a *= 10;
        if (a < b) {
            ret.push_back(0);
            continue;
        }
        ret.push_back(0 + a / b);
        a = a % b;
    }
    return ret;
}

提交后发现,有特殊情况没有考虑到。-2147483648 / -1 这种情况会溢出,所以需要使用long类型替换int。

参考修改后代码如下:

string fractionToDecimal(int numerator, int denominator) {
    if (!numerator) return "0";
    string ret;
    if (numerator < 0 ^ denominator < 0) ret += -;
    long a = numerator < 0 ? (long)numerator * (-1) : (long)numerator;
    long b = denominator < 0 ? (long)denominator * (-1) : (long)denominator;
    long c = a / b;
    ret += to_string(c);
    a = a % b;
    if (!a) return ret;
    ret.push_back(.);
    unordered_map<long, long> m;
    int i = ret.length() - 1;
    while (a)
    {
        i++;
        if (m.find(a) != m.end()) {
            ret.insert(ret.begin() + m[a], ();
            ret.push_back());
            break;
        }
        m[a] = i;
        a *= 10;
        if (a < b) {
            ret.push_back(0);
            continue;
        }
        ret.push_back(0 + a / b);
        a = a % b;
    }
    return ret;
}

虽然在leetcode上提交成功了,但是在vs2015上运行是错误的,

long a = numerator < 0 ? (long)numerator * (-1) : (long)numerator;

这一句如果是numerator是-2147483648,a会是-2147483648,这非常诡异。不知道vs2015编译器对于这个问题是怎么解决的。

Fraction to Recurring Decimal leetcode

原文:http://www.cnblogs.com/sdlwlxf/p/5152236.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!