前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >166. 分数到小数

166. 分数到小数

作者头像
张伦聪zhangluncong
发布2022-10-26 18:06:50
3010
发布2022-10-26 18:06:50
举报

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

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

示例 1:

代码语言:javascript
复制
输入: numerator = 1, denominator = 2
输出: "0.5"

示例 2:

代码语言:javascript
复制
输入: numerator = 2, denominator = 1
输出: "2"

示例 3:

代码语言:javascript
复制
输入: numerator = 2, denominator = 3
输出: "0.(6)"

解:全在注释里。/求商,%求余数。除不尽的情况一定是最后一位小数不断循环比如0.125555…这种5一直循环的小数,不可能存在比如0.125125125125…这种125循环的小数。

代码语言:javascript
复制
class Solution {
     public String fractionToDecimal(int numerator, int denominator) {
        if (denominator == 0) {
            return "NaN";
        }//特殊情况1
        if (numerator == 0) {
            return "0";
        }  //特殊情况2

        // 如果两个数符号不同,结果为负数  >>>为无符号右移动,int类型为32位,在计算机中以
        //补码进行计算,无符号右移31位剩下补码的符号位,正数会是0,负数会是1,再进行异或^操作,
        //都为正数会得到(0 ^ 0) == 0,都为负数会得到(1 ^ 1 == 0),一正一负会得到(0 ^ 1 == 1)
        String sign = (denominator >>> 31 ^ numerator >>> 31) == 1 ? "-" : "";

        // 先把除数和被除数转为long,以免除法和绝对值运算的时候溢出
        // 比如 -2147483648/-1 = -2147483648, abs(-2147483648) = -2147483648
        long num = numerator;
        long den = denominator;
        num = Math.abs(num);
        den = Math.abs(den);
        //商
        long major = num / den;
        //余数
        long rem = num % den;
        //能被除尽,直接返回
        if (rem == 0) {
            return sign + major;
        }

        StringBuilder ans = new StringBuilder(sign + major + '.');
        Map<Long, Integer> map = new HashMap<>();
        while (rem != 0) {
            // 如果余数已经出现过一次,那么循环要开始了
            if (map.containsKey(rem)) {
                int index = map.get(rem);
                ans.insert(index, '(').append(')');
                break;
            } else {
                //小学数学,不够借一位,*10,把商放入sb
                ans.append(rem * 10 / den);
                map.put(rem, ans.length() - 1);
            }
            //余数
            rem = rem * 10 % den;
        }

        return ans.toString();
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档