java-HJ82_将真分数分解为埃及分数

java-HJ82 将真分数分解为埃及分数

import java.util.Scanner;

public class Main {
    private static StringBuilder result = new StringBuilder();

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);

        while(in.hasNext()){
            String[] fraction = in.nextLine().trim().split("/");
            // 分子
            Integer a = Integer.parseInt(fraction[0]);
            // 分母
            Integer b = Integer.parseInt(fraction[1]);

            result = new StringBuilder();

            solution(a, b);
        }
    }

    /**
     * 递归
     * @param a
     * @param b
     */
    private static void solution(Integer a, Integer b){
        egypt(a, b);

        System.out.println(result);
    }

    /**
     * 数学法: 真分数 -> 埃及分数
     * 
     * 算法:
     * 设某个真分数的分子为a, 分母为b;
     * 把c=(b/a+1)作为分解式中第一个埃及分数的分母;
     * 将a-b%a 或 a*c-b作为新的a;
     * 将b*c作为新的b;
     * 
     * 如果a=1, 则最后一个埃及分数为1/b, 算法结束;
     * 如果a>1 && b%a=0, 则最后一个埃及分数为1/(b/a), 算法结束;
     * 否则重复上面的步骤.
     * 
     * 优化: 当b%(a-1)=0时, a/b=1/(b/(a−1))+1/b, 则最后两个埃及分数为1/(b/(a-1))和1/b, 算法结束;
     * 
     * @param a   分子
     * @param b   分母
     */
    private static void egypt(Integer a, Integer b){
        // a=1 则最后一个埃及分数为1/b
        if(a == 1){
            result.append("1/"+b);
            return;
        }

        // a>1 && b%a=0 则最后一个埃及分数为1/(b/a)
        if(b%a == 0){
            result.append("1/"+b/a);
            return;
        }

        // b%(a-1)=0 则最后两个埃及分数为1/(b/(a-1))和1/b
        if(b%(a-1) == 0){
            result.append("1/"+b/(a-1)+"+1/"+b);
            return;
        }

        // 埃及分数的分母
        int c = b/a+1;
        result.append("1/"+c+"+");
        egypt(a-b%a, b*c);
        // egypt(a*c-b, b*c);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值