看了好久的代码, 终于看懂了:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); String[] s = new String[n]; long fm2 = 1; long sum = 0; s[0] = sc.next(); for (int i = 1; i < n; i++) { s[i] = sc.next(); if (fm2 % getfm(s[i]) != 0) { // 防止直接分母全部相乘超范围 fm2 *= getfm(s[i]); // 如果原来初始化为1的分母变量fm2 不能整除 下一个数s[i]的分母, 那么就将s[i]的分母乘以fm2, 更新分母变量 } } sc.close(); for (int i = 0; i < n; i++) { sum += getfz(s[i]) * fm2 / getfm(s[i]); } // sum是两个分母的最大公约数 /* * 大致分类 ① 分母等于0 ②分子(绝对值)小于分母 包括正数和负数 ③分子等于分母 ④分子(绝对值)大于分母 包括正数和负数 第④种情况就涉及到带分数 */ if (sum == 0) { System.out.println(0); } else { if (Math.abs(sum) < fm2) { if (gcd(sum, fm2) == 1) { System.out.printf("%d/%d\n", sum, fm2); } else { System.out.printf("%d/%d\n", sum / gcd(sum, fm2), fm2 / gcd(sum, fm2)); } } else if (Math.abs(sum) == fm2) { if (sum < 0) { System.out.println(-1); } else { System.out.println(1); } } else { if (sum < 0) { sum = -sum; long x = sum / fm2; if (sum % fm2 != 0) { System.out.printf("-%d -%d/%d\n", x, ((sum - fm2 * x) / gcd((sum - fm2 * x), fm2)), (fm2 / gcd((sum - fm2 * x), fm2))); // 分子分母同时除以最大公倍数 } else { System.out.println(-x); } } else { long x = sum / fm2; if (sum % fm2 != 0) { System.out.printf("%d %d/%d\n", x, ((sum - fm2 * x) / gcd((sum - fm2 * x), fm2)), (fm2 / gcd((sum - fm2 * x), fm2))); // 分子分母同时除以最大公倍数 } else { System.out.println(x); } } } } } public static long getfz(String s) { String[] s1 = s.split("/"); return Long.parseLong(s1[0]); } public static long getfm(String s) { String[] s1 = s.split("/"); return Long.parseLong(s1[1]); } public static long gcd(long a, long b) { // 求最大公约数 if (a < 0) { a = -a; } if (b < 0) { b = -b; } if (a < b) { long temp = a; a = b; b = temp; } if (a % b == 0) { return b; } else { return gcd(b, a % b); } } }