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

  • 相关阅读:
    document 对象
    AdodbStream的方法和属性
    WEB开发者版本
    ATI HD2400
    驱蚊植物
    PHP5+UTF8多文件上传类
    nVIDIA_driver
    ati
    Zend_Http_Client setFileUpload
    Sqlserver2005 数据类型
  • 原文地址:https://www.cnblogs.com/sdlwlxf/p/5152236.html
Copyright © 2011-2022 走看看