1. 程式人生 > >模擬-LeetCode166-分數到小數

模擬-LeetCode166-分數到小數

題目


給定兩個整數,分別表示分數的分子 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型別再加 ‘-’