模擬-LeetCode166-分數到小數
阿新 • • 發佈:2018-12-04
題目
給定兩個整數,分別表示分數的分子 numerator 和分母 denominator,以字串形式返回小數。
如果小數部分為迴圈小數,則將迴圈的部分括在括號內。
示例 1:
輸入: numerator = 1, denominator = 2
輸出: "0.5"
示例 2:
輸入: numerator = 2, denominator = 1
輸出: "2"
示例 3:
輸入: numerator = 2, denominator = 3
輸出: "0.(6)"
思路
需要知道的是,兩個整數相除,結果只有兩種可能:有限迴圈小數和無限迴圈小數,不可能出現無限不迴圈小數。
可以先考慮被除數和除數都為正的情況,最後根據被除數和除數是否符號相同再決定結果是否新增負號。
模擬除法過程。
餘數後補0(x10)繼續除法。注意餘數重複出現的時候就是需要無限迴圈的時候。
程式碼
class Solution { public String fractionToDecimal(int numerator, int denominator) { //a表示分子的絕對值,防止溢位情況(分子為 -(2的31次方)) 使用long型別 long a=0; if(numerator>=0){ a=numerator; }else{ //防止溢位情況,先轉換為long型別再加‘-’ a=-(long)numerator; } //b表示分母的絕對值,防止溢位情況(分母為 -(2的31次方)) 使用long型別 long b=0; if(denominator>0){ b=denominator; }else { //防止溢位情況,先轉換為long型別再加‘-’ b=-(long)denominator; } String res=""; // 同樣使用long型別 long shang=a/b; long yushu=a%b; if(yushu==0){ res+=shang+""; }else{ res+=shang+"."; // list存放所有餘數(被除數)列表 List<Long> l=new ArrayList<Long>(); l.add(yushu); // 進行小數點之後的計算 res+=xiaoshuchufa(yushu,b,"",l); } // 結果是否為負數 if(numerator>0 && denominator<0 || numerator<0 && denominator>0){ res="-"+res; } return res; } public static String xiaoshuchufa(long a, long b, String res, List<Long> l){ a=a*10; long shang=a/b; long yushu=a%b; if(yushu==0){ res+=shang; return res; }else{ res+=shang; //餘數重複情況,意味著出現無限迴圈的情況 if(l.contains(yushu)){ res+=")"; //找到重複餘數之前所在的位置新增"(" for(int i=0;i<l.size();i++){ if(l.get(i)==yushu){ res=res.substring(0,i)+"("+res.substring(i); break; } } return res; }else{ l.add(yushu); return xiaoshuchufa(yushu,b,res,l); } } } }
注意
1.模擬除法過程
2.int溢位使用long,先轉換為long型別再加 ‘-’