题目描述
本题要求编写程序,计算 N 个有理数的和。
输入格式:第一行给出正整数 N(<=100)。随后 N 行,每行给出一个有理数,格式为:a/b(分子/分母)。
输入输出格式
输入:
- 第一行:正整数 N
- 接下来 N 行:a/b 格式的有理数
输出:和,化为最简形式(如果为整数则直接输出整数)
样例
输入
5
2/5
1/5
3/10
4/5
1/2
输出
3/1
解题思路
- 读取 N 个分数
- 累加所有分数,使用通分求和
- 分子分母分别累加,最后约分
- 输出最简形式
关键:分子分母可能很大,需要使用 long 类型
代码实现
Java
import java.util.Scanner;
public class Main {
static long gcd(long a, long b) {
return b == 0 ? Math.abs(a) : gcd(b, a % b);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
long num = 0, den = 1;
for (int i = 0; i < n; i++) {
String frac = scanner.next();
String[] parts = frac.split("/");
long a = Long.parseLong(parts[0]);
long b = Long.parseLong(parts[1]);
// 累加:num/den + a/b = (num*b + a*den) / (den*b)
num = num * b + a * den;
den = den * b;
// 约分
long g = gcd(num, den);
num /= g;
den /= g;
}
// 整数输出
if (den == 1) {
System.out.println(num);
} else {
System.out.println(num + "/" + den);
}
}
}
Python
from math import gcd
n = int(input())
num, den = 0, 1
for _ in range(n):
frac = input()
a, b = map(int, frac.split('/'))
num = num * b + a * den
den = den * b
g = gcd(num, den)
num //= g
den //= g
if den == 1:
print(num)
else:
print(f"{num}/{den}")
复杂度分析
- 时间复杂度:O(N log M),M 为分子分母最大值
- 空间复杂度:O(1)
总结
本题考察分数运算和最大公约数(欧几里得算法)。核心是分数通分、累加和约分。