栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode-每日一题 166. 分数到小数 [Java实现] [极速]

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode-每日一题 166. 分数到小数 [Java实现] [极速]

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

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

如果存在多个答案,只需返回 任意一个 。

对于所有给定的输入,保证 答案字符串的长度小于 10^4 。

示例 1:

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


方法一:长除法

长除法在本题中的应用:

        我们可以对被除数每次进行除法运算后的余数进行处理,若不为零则将余数*10(向前进一位),再用除数除以该余数计算当前位数下的值,并对当前余数求余更新余数的值;若为零则代表已经除尽可以中断除法。

在实际操作中,我们还需注意以下几点

  • 因为给定的除数与被除数可取任意int值,为防止数据溢出先将其转换为long型
  • 为了便于运算,我们在开始判断结果的符号并将除数与被除数取绝对值
  • 在对括号进行处理时,因为无限循环小数的循环位数只可能出现在小数位,所以对于标志变量的初始值应设置为整数部分长度,并在每次循环后进行更新。
  • 对于是否出现重复小数位,我们可以用 HashMap 储存余数的值,通过判断余数是否重复来判别。
    private final HashMap map = new HashMap<>(1<<5);

    public String fractionToDecimal(int numerator, int denominator) {
        if (numerator == 0) return "0";
        boolean positive = numerator >= 0 && denominator >= 0 || numerator < 0 && denominator < 0;
        long a = numerator, b = denominator;
        a = (a >= 0 ? a : -a); b = (b >= 0 ? b : -b);
        StringBuilder builder = new StringBuilder();
        builder.append(a/b);
        long remain = a%b * 10;
        if (remain != 0) builder.append('.');
        int index = builder.length();
        while (remain != 0) {
            if (map.containsKey(remain)) {
                builder.insert(index, ')');
                builder.insert(map.get(remain), (Object) '(');
                break;
            } else {
                map.put(remain, index);
                builder.append(remain/b);
                remain = remain%b * 10;
            }
            ++ index;
        }
        return positive ? builder.toString() : "-" + builder;
    }

               ​​​​​​​        ​​​​​​​        

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/287440.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号