Fraction to recurring decimal

来源:互联网 发布:苹果7mac地址 编辑:程序博客网 时间:2024/05/21 22:44

Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.

If the fractional part is repeating, enclose the repeating part in parentheses.

For example,

  • Given numerator = 1, denominator = 2, return "0.5".
  • Given numerator = 2, denominator = 1, return "2".
  • Given numerator = 2, denominator = 3, return "0.(6)".

解题思路:

1. 对于整数部分,只需要直接做除法

2. 对于小数部分,维护一个List 和Map,List用于记录对于每一个小数位置得到的结果;Map用于记录对于每一个remainder,他的出现位置对应于List的index

3. while循环,如果remainder== 0,循环终止,不出现循环小数,直接把list的数字append到结果上

4. 如果当前remainder在map中出现过,说明循环开始。拿到当前remainder第一次出现的位置,加上“(”然后append接下来list中的所有数字。


几个edge case:

1. 正负号(这个比较容易实现,唯一的状况是被除数是0的情况)

2. Integer.MIN_VALUE,这个如果取绝对值就变成0,所以目前比较方便的做法是cast成长整形。如divide two integers的做法应该还有更好的办法


    public String fractionToDecimal(int numerator, int denominator) {        if (numerator == 0) {            return "0";        }        int sign = ((numerator ^ denominator)>>>31 & 1) == 1 ? -1 : 1;        long num = (long) numerator;        long den = (long) denominator;        num = Math.abs(num);        den = Math.abs(den);        StringBuilder builder = new StringBuilder();        if (sign < 0) {            builder.append("-");        }        builder.append(num/den);        long remainder = num % den;        if (remainder > 0) {            builder.append(".");        } else {            return builder.toString();        }        List<Long> list = new ArrayList<Long>();        int ind = 0;        Map<Long, Integer> map = new HashMap<Long, Integer>();        while (remainder > 0) {            if (map.containsKey(remainder)) {                int startInd = map.get(remainder);                for (int i = 0; i < startInd; i++) {                    builder.append(list.get(i));                }                builder.append("(");                for (int i = startInd; i < list.size(); i++) {                    builder.append(list.get(i));                }                builder.append(")");                break;            } else {                long q = remainder * 10 / den;                System.out.println(q);                map.put(remainder, ind);                list.add(q);                ind++;                remainder = remainder * 10 % den;            }        }        if (remainder == 0) {            for (long i : list) {                builder.append(i);            }        }        return builder.toString();    }


0 0
原创粉丝点击