无线循环转换为最简分数

 /**
     *
     * @param repeating
     * @param separate
     * @return
     */
    public static String Repeating2Smallest(String repeating, String separate){
        String separate_l = separate.substring(0,1);
        String separate_r = separate.substring(1,2);
        String separate_p = ".";
        int index_p = repeating.indexOf(separate_p);
        int index_l = repeating.indexOf(separate_l);
        int index_r = repeating.indexOf(separate_r);
        BigInteger number = new BigInteger(repeating.substring(0,index_p));
        int n = index_l-index_p-1;
        BigInteger a = BigInteger.ZERO;
        if(n>0)a = new BigInteger(repeating.substring(index_p+1,index_l));
        int m = index_r-index_l-1;
        BigInteger b = BigInteger.ZERO;
        if(m<=0) return "请输入正确的循环体";
        if(m>0)b= new BigInteger(repeating.substring(index_l+1,index_r));
         BigInteger numerator = NumeratorFormula(m, a, b);
        BigInteger denominator = DenominatorFormula(n , m);
        BigInteger gcd = BigInteger.ZERO;
        while(!gcd.equals(BigInteger.ONE)){
            gcd = numerator.gcd(denominator);
            numerator = numerator.divide(gcd);
            denominator = denominator.divide(gcd);
        }
        return number+" "+numerator+"/"+denominator;
    }

    /**
     *
     * @param m
     * @param a
     * @param b
     * @return
     */
    private static BigInteger NumeratorFormula(int m,BigInteger a,BigInteger b){
        return BigInteger.TEN.pow(m).subtract(BigInteger.ONE).multiply(a).add(b);
    }

    /**
     *
     * @param n
     * @param m
     * @return
     */
    private static BigInteger DenominatorFormula(int n,int m){
        return BigInteger.TEN.pow(m).subtract(BigInteger.ONE).multiply(BigInteger.TEN.pow(n));
    }

    public static void main(String[] args) {
        String s = "0.19[1919]";
        System.out.println(Repeating2Smallest(s,"[]"));
    }

 

posted @ 2020-04-06 20:28  爱上胡萝卜的猴子  阅读(143)  评论(0编辑  收藏  举报