模拟-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类型再加 ‘-’

猜你喜欢

转载自blog.csdn.net/qq_36025975/article/details/83898505