166 Fraction to Recurring Decimal 分数到小数

给定两个整数,分别表示分数的分子和分母,返回字符串格式的小数。
如果小数部分为循环小数,则将重复部分括在括号内。
例如,
    给出 分子 = 1, 分母 = 2,返回 "0.5".
    给出 分子 = 2, 分母 = 1,返回 "2".
    给出 分子 = 2, 分母 = 3,返回 "0.(6)".

详见:https://leetcode.com/problems/fraction-to-recurring-decimal/description/

Java实现:

class Solution {
    public String fractionToDecimal(int numerator, int denominator) { 
        if(numerator == 0){
             return "0";
        }
        if(denominator == 0){
            return "";
        } 
        
        String res = "";
        
        //判断结果是否为负数,加负号
        if((numerator<0) ^ (denominator<0)){
            res += "-";
        }
        
        //保证分子分母都为正数,防止取绝对值溢出,先将int转换为long,再取绝对值
        long num = numerator;
        long den = denominator;
        num = Math.abs(num);
        den = Math.abs(den);
        
        //得到结果的整数部分
        long numInt = num/den;
        res += String.valueOf(numInt);
        
        //判断是否能整除,如果能,则直接返回结果
        long number = (num%den)*10;
        if(number==0){
            return res;
        }
        
        //结果的小数部分:使用map记录每次操作之后的余数和对应的下标,HashMap的<key, value>分别对应<当前余数, 对应结果的下标>,当出现重复值的时候,可以通过对应下标寻找到重复部分。
        HashMap<Long, Integer> map = new HashMap<Long, Integer>();
        res += ".";
        while(number!=0){
            //判断map中是否出现过该余数,如果出现过则开始循环
            if(map.containsKey(number)){
                int beg = map.get(number); //循环体开始的位置
                String part1 = res.substring(0, beg);
                String part2 = res.substring(beg, res.length());
                res = part1 + "(" + part2 + ")";
                return res;
            }
            
            //继续下除
            map.put(number, res.length());
            numInt = number / den;
            res += String.valueOf(numInt);
            number = (number%den) * 10;
        }
        
        return res;
    }
}

详见:https://www.cnblogs.com/grandyang/p/4238577.html

转载于:https://www.cnblogs.com/xidian2014/p/8729385.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值