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

posted on 2018-04-06 23:20  lina2014  阅读(312)  评论(0编辑  收藏  举报

导航