1. 程式人生 > >leetcode:(166) Fraction To Recurring Decimal(java)

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);
    }
}