leetcode:(166) Fraction To Recurring Decimal(java)
阿新 • • 發佈:2018-11-06
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); } }