zoukankan      html  css  js  c++  java
  • Fraction to Recurring Decimal leetcode

    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编译器对于这个问题是怎么解决的。

  • 相关阅读:
    Python解析excel文件并存入sqlite数据库
    python简单爬虫
    Python开发简单记事本
    Django初体验——搭建简易blog
    LeetCode — (1)
    机器学习(九)—FP-growth算法
    机器学习(八)—Apriori算法
    linux下debug工具
    linux同步与通信
    后台开发之IO缓冲区管理
  • 原文地址:https://www.cnblogs.com/sdlwlxf/p/5152236.html
Copyright © 2011-2022 走看看