Each input file contains one test case. Each case starts with a positive integer N (<=100), followed in the next line N rational numbers "a1/b1 a2/b2 ..." where all the numerators and denominators are in the range of "long int". If there is a negative number, then the sign must appear in front of the numerator.
For each test case, output the sum in the simplest form "integer numerator/denominator" where "integer" is the integer part of the sum, "numerator" < "denominator", and the numerator and the denominator have no common factor. You must output only the fractional part if the integer part is 0.
5 2/5 4/15 1/30 -2/60 8/3
3 1/3
有一说一,牛客网的测试用例更严格
import java.io.*;
import java.util.*;
import java.util.stream.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (br.readLine() != null) {
List<String> list = Arrays.asList(br.readLine().split(" "));
List<Long> numeratorList = list.stream()
.map(x -> Long.parseLong(x.split("/")[0]))
.collect(Collectors.toList());
List<Long> denominatorList = list.stream()
.map(x -> Long.parseLong(x.split("/")[1]))
.collect(Collectors.toList());
if (list.size() < 2) {
format(numeratorList.get(0), denominatorList.get(0));
continue;
}
long denominator = lcm(denominatorList);
long numerator = 0L;
for (int i = 0; i < list.size(); ++i) {
numerator += numeratorList.get(i) * (denominator / denominatorList.get(i));
}
format(numerator, denominator);
}
}
// 求最大公约数
private static long gcd(long a, long b) {
if (a < b) {
long tmp = a;
a = b;
b = tmp;
}
long c;
while ((c = (a % b)) != 0) {
a = b;
b = c;
}
return b;
}
// 求最小公倍数
private static long lcm(long a, long b) {
return (a * b) / gcd(a, b);
}
// 求一串数的最小公倍数
private static long lcm(List<Long> list) {
long start = lcm(list.get(0), list.get(1));
for (int i = 2; i < list.size(); ++i) {
start = lcm(start, list.get(i));
}
return start;
}
//分数简化,转换成结果,输出
private static void format(long numerator, long denominator) {
if (numerator == 0) { //整数和小数部分都为0的情况
System.out.println(0);
return;
}
long tmp = Math.abs(numerator);
long a = tmp / denominator;
long res = tmp - a * denominator;
if (res == 0) {
System.out.print(numerator / denominator);
return;
}
if (a != 0) {
System.out.format("%d ", a);
}
long gcdNum = gcd(res, denominator);
if (numerator < 0) {
res = -res;
}
System.out.format("%d/%d\n", res / gcdNum, denominator / gcdNum);
}
}