ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Medium | LeetCode 166. 分数到小数 | 数学

2021-04-06 15:04:44  阅读:332  来源: 互联网

标签:Medium denominator numerator ans dividend 166 LeetCode append 小数


166. 分数到小数

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

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

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

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

示例 1:

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

示例 2:

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

示例 3:

输入:numerator = 2, denominator = 3
输出:"0.(6)"

示例 4:

输入:numerator = 4, denominator = 333
输出:"0.(012)"

示例 5:

输入:numerator = 1, denominator = 5
输出:"0.2"

解题思路

模拟手动除法的运算。

在小数部分, 同样模拟手动除法的算法, 记录所有余数到HashMap里, 如果发生某个余数已经在HashMap存在了, 就认为是已经出现了无限循环, 需要将这部分用括号圈起来。

public String fractionToDecimal(int numerator, int denominator) {
    // 0 除以任何数都是 0
    if (numerator == 0) {
        return "0";
    }
    // 转成 long, 绕开整形溢出陷阱
    long dividend = numerator, divisor = denominator;
    boolean negitive = false;
    // 判断符号, 同正同负才是正, 否则是负
    if (numerator >= 0 ^ denominator >= 0) {
        negitive = true;
    }
    // 转为正数运算
    dividend = Math.abs(dividend);
    divisor = Math.abs(divisor);
    StringBuilder ans = new StringBuilder();
    // 负数
    if (negitive) {
        ans.append("-");
    }
    // 计算整数部分
    long quotient = dividend / divisor;
    // 加入整数部分
    ans.append(quotient);
    // 计算当前余数
    dividend = dividend % divisor;
    // 没有余数, 说明可以除尽, 没有小数部分
    if (dividend == 0) {
        return ans.toString();
    }
    int idx = -1, curPos = 0;
    Map<Long, Integer> map = new HashMap<>();
    // 下面是除法的手动模拟计算
    StringBuilder builder = new StringBuilder();
    while (dividend != 0) {
        // 余数 * 10 即为当前被除数
        dividend *= 10;
        // 如果当前被除数之前已经出现过了, 那么代表循环开始
        if (map.containsKey(dividend)) {
            // 获得循环节的位置
            idx = map.get(dividend);
            break;
        }
        // 更新 map
        map.put(dividend, curPos);
        // 记录当前结果
        builder.append(dividend / divisor);
        // 计算当前余数
        dividend %= divisor;
        // 更新小数指针位置
        curPos++;
    }

    String decmical = builder.toString();
    // 如果 map 中没有元素, 代表没有小数部分
    if (map.size() != 0) {
        ans.append(".");
    }
    // 存在循环节就加入括号, 否则直接加入小数部分
    if (idx != -1) {
        ans.append(decmical, 0, idx);
        ans.append("(");
        ans.append(decmical.substring(idx));
        ans.append(")");
    } else {
        ans.append(decmical);
    }
    return ans.toString();
}

标签:Medium,denominator,numerator,ans,dividend,166,LeetCode,append,小数
来源: https://www.cnblogs.com/chenrj97/p/14621838.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有