PAT甲级——1081 Rational Sum——分数 20

题目


解法1

点击查看代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

struct Rnum {
    long long nr;
    long long dr;
};

// 最大公约数
long long gcd(long long a, long long b) {
    return b == 0 ? a : gcd(b, a % b);
}

// 最小公倍数
long long lcm(long long a, long long b) {
    return a / gcd(a, b) * b;
}

int main() {
    int N;
    cin >> N;
    vector<Rnum> vr(N);
    long long DR = 1; // 分母最小公倍数

    for (int i = 0; i < N; i++) {
        long long nr, dr;
        scanf("%lld/%lld", &nr, &dr);
        
        // 统一分子带负号,分母为正
        if (dr < 0) {
            dr = -dr;
            nr = -nr;
        }
        // 约分
        long long g = gcd(abs(nr), dr);
        nr /= g;
        dr /= g;

        vr[i] = {nr, dr};
        DR = lcm(DR, dr); // 记录最小公倍数
    }

    // 求和分子
    long long NR = 0;
    for (auto& frac : vr) {
        long long base = DR / frac.dr;
        NR += frac.nr * base;
    }

    if (NR == 0) {
        cout << 0 << endl;
        return 0;
    }

    long long intPart = NR / DR;
    long long remNr = abs(NR % DR);
    long long g = gcd(remNr, DR); // 约分
    remNr /= g;
    DR /= g;

     // 输出  1. 既有整数,也有分数 2.只有整数 3.只有分数
    if (intPart != 0 && remNr != 0) cout << intPart << " " << remNr << "/" << DR << endl;
    else if (remNr == 0) cout << intPart << endl;
    else if (intPart == 0) cout << (NR < 0 ? "-" : "") << remNr << "/" << DR << endl;

    return 0;
}

posted on 2025-04-26 09:34  LEESOL-cn  阅读(18)  评论(0)    收藏  举报

导航