L1-009 N 个数求和(20分)[java][python]

4 阅读1分钟

题目描述

本题要求编写程序,计算 N 个有理数的和。

输入格式:第一行给出正整数 N(<=100)。随后 N 行,每行给出一个有理数,格式为:a/b(分子/分母)。

输入输出格式

输入

  • 第一行:正整数 N
  • 接下来 N 行:a/b 格式的有理数

输出:和,化为最简形式(如果为整数则直接输出整数)

样例

输入

5
2/5
1/5
3/10
4/5
1/2

输出

3/1

解题思路

  1. 读取 N 个分数
  2. 累加所有分数,使用通分求和
  3. 分子分母分别累加,最后约分
  4. 输出最简形式

关键:分子分母可能很大,需要使用 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)

总结

本题考察分数运算和最大公约数(欧几里得算法)。核心是分数通分、累加和约分。