【leetcode】 分数到小数

给定两个整数,分别表示分数的分子 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) {
        if (numerator == Integer.MIN_VALUE && denominator == -1) {
            //边界条件,没法直接除,因为除完结果溢出
            return "2147483648";
        }

        if (numerator == -1 && denominator == Integer.MIN_VALUE) {
            //边界条件,都是int类型,没法除
            return "0.0000000004656612873077392578125";
        }

        String res = "";
        int shang = numerator / denominator;
        int yushu = numerator % denominator;
        if ((double) numerator / (double) denominator < 0 && shang == 0) {
            //如果两个一正一负,除完shang为0,但是我们要的是-0
            res += "-";
        }
        res += shang;

        if (yushu == 0) {
            return res;
        }

        res += ".";
        Map<Integer, Integer> map = new HashMap<>();
        int i = 0;
        while (yushu != 0) {
            yushu = Math.abs(yushu);
            denominator = Math.abs(denominator);
            yushu *= 10;

            if (map.containsKey(yushu)) {
                int start = map.get(yushu);
                int end = res.length();
                res = res.substring(0, start) + "(" + res.substring(start, end) + ")";
                return res;
            }
            map.put(yushu, res.length());
            shang = yushu / denominator;
            yushu = yushu % denominator;
            res += shang;
        }
        return res;
    }
}
发布了251 篇原创文章 · 获赞 270 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/kangbin825/article/details/105447655