leetcode:(166) Fraction To Recurring Decimal(java)

package LeetCode_HashTable;

import java.util.HashMap;

/**
 * 题目:
 *      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.
 * 解题思路:
 *      整数部分很好处理,只要注意正负号的区分就行了,但是如何处理小数部分呢。如果只是简单的除法,那我们每次把余数乘以10,
 *      再除以被除数就可以得到当前位的小数了,得到新的余数,直到余数为0。难点在于,对于无尽循环小数,我们一直这么做永远也不能让余数变为0。
 *      这里我们可以用一个哈希表记录每次的余数,如果余数出现重复的时候,说明就产生循环了。为了能找出小数中循环的部分,
 *      我们在用哈希表时,还要把每个余数对应的小数位记录下来,这样子我们一旦遇到重复,就知道是从哪里开始循环的。
 *      注意:
 *          如果输入的被除数很大,那么余数乘以10有可能溢出,所以我们用long来保存numerator和denominator。
 *
 */

public class FractionToDecimal_166_1020 {
    public String FractionToDecimal(int numerator, int denominator) {

        StringBuilder result = new StringBuilder();
        //判断分子是否为0
        if (numerator == 0) {
            return "0";
        }

        //判断正负
        //result.append(((numerator > 0) ^ (denominator > 0)) ? "-" : "");
        if ((numerator > 0) ^ (denominator > 0)) {
            result.append("-");
        } else
            result.append("");

        Long num =  Math.abs((long) numerator);
        Long den = Math.abs((long) denominator);

        //整数部分
        result.append(num / den);
        num = num % den;
        if (num == 0) {
            return result.toString();
        }

        //确定小数部分
        result.append(".");
        HashMap<Long, Integer> map = new HashMap<>();
        map.put(num, result.length());


        while (num != 0) {
            num *= 10;
            result.append(num / den);
            num %= den;

            if (map.containsKey(num)) {
                int index = map.get(num);
                result.insert(index, "(");
                result.append(")");
                break;
            } else map.put(num, result.length());
        }
        return result.toString();
    }
    public static void main(String[] args) {
        int numerator = -1;
        int denominator = -2147483648;

        FractionToDecimal_166_1020 test = new FractionToDecimal_166_1020();
        String result = test.FractionToDecimal(numerator, denominator);
        System.out.println(result);
    }
}

猜你喜欢

转载自blog.csdn.net/Sunshine_liang1/article/details/83211626