题解 | #将真分数分解为埃及分数#java废话版本,屎山代码堆积而成
将真分数分解为埃及分数
http://www.nowcoder.com/practice/e0480b2c6aa24bfba0935ffcca3ccb7b
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = bf.readLine()) != null) {
String[] split = str.split("/");
int num1 = Integer.parseInt(split[0]);
int tmp = num1;
int num2 = Integer.parseInt(split[1]);
while (gcd(num1, num2) != 1) {
int temp = gcd(num1, num2);
num1 /= temp;
num2 /= temp;
}
boolean flag = true;
for (int i = 1; flag; i++) {
int a = num1 * i, b = num2 * i;
List<Integer> list = find(b);
ArrayList<Integer> res = new ArrayList<>();
if (isValid(a, 0, 0, list, res)) {
for (int k = res.size() - 1; k >= 0; k--) {
System.out.print("1/" + list.get(list.size() - 1) / res.get(k));
if (k != 0) System.out.print("+");
}
System.out.println();
flag = false;
}
}
}
}
// 目标和 每一步和 索引 所有的子集 每一步是否选择这个自己记录在path里面
static boolean isValid(int num, int sum, int index, List<Integer> list, List<Integer> path) {
if (num == sum) {
return true;
} else if (num < sum) {
return false;
}
boolean flag = false;
for (int i = index; i < list.size(); i++) {
flag = flag || isValid(num, sum, i + 1, list, path);
if (flag) {
return true;
}
path.add(list.get(i));
flag = flag || isValid(num, sum + list.get(i), i + 1, list, path);
if (flag) {
return true;
}
path.remove(path.size() - 1);
}
return false;
}
static List<Integer> find(int num) {
List<Integer> res = new ArrayList<>();
for (int i = 2; i <= num; i++) {
if (num % i == 0) {
res.add(i);
}
}
return res;
}
static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
}