面试 · 2022年5月31日 0

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

描述

分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。注:真分数指分子小于分母的分数,分子和分母有可能gcd不为1!
如有多个解,请输出任意一个。

输入描述:

输入一个真分数,String型

输出描述:

输出分解后的string

示例1

输入:

8/11
2/4

输出:

1/2+1/5+1/55+1/110
1/3+1/6

说明:

第二个样例直接输出1/2也是可以的
import java.util.Scanner;

/**
 * 先将 a/b 转换成 1/x+y/z 的形式
 * y/z 使用递归继续分解,直到分子为1
 * 
 * b除以a,得商x,得余数y   b=a*x+y
 * a/b = 1/(x+1) + (a-y)/b(x+1)
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while (sc.hasNext()) {
            String[] str = sc.next().split("/");
            // 分子
            int a = Integer.parseInt(str[0]);
            // 分母
            int b = Integer.parseInt(str[1]);

            result = new StringBuffer();
            process(a, b, result);
            System.out.println(result);
        }
    }

    private static void process(int a, int b, StringBuffer result) {
        if (result.length() != 0) {
            result.append("+");
        }

        int x = b / a;

        if (a == 1 || b % a == 0) {
            result.append("1/").append(x);
        } else {
            int y = b % a;
            result.append("1/").append(x + 1);
            process(a - y, b * (x + 1), result);
        }
    }

    static StringBuffer result;
}