2025-03-01 学习记录--C/C++-PTA 7-35 有理数均值

发布于:2025-03-01 ⋅ 阅读:(93) ⋅ 点赞:(0)

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻

一、题目描述 ⭐️

在这里插入图片描述
在这里插入图片描述

二、代码(C语言)⭐️

#include <stdio.h>

// 【关键】计算最大公约数(GCD)
long long gcd(long long a, long long b) {
    while (b != 0) {  // 当 b 不为 0 时循环
        long long temp = b;  // 临时变量存储 b 的值
        b = a % b;  // 计算 a 除以 b 的余数,赋值给 b
        a = temp;  // 将之前存储的 b 的值赋值给 a
    }
    return a;  // 当 b 为 0 时,a 就是最大公约数
}

int main() {
    int n; // 有理数的个数
    scanf("%d", &n); // 读取有理数的个数

    long long fenZiArr[n], // 所有的分子组成一个数组
    fenMuArr[n]; // 所有的分母组成一个数组

    // 获得所有分母的乘积,即通分后的分母
    long long fenMuMultiply = 1; // 初始化分母乘积为 1

    // 将输入的分子分母依次放入各自的数组中去
    for (int i = 0; i < n; i++) {
        scanf("%lld/%lld", &fenZiArr[i], &fenMuArr[i]); // 读取分子和分母

        // 【关键】对 当前分数 进行约分
        long long gcdValue1 = gcd(fenZiArr[i], fenMuArr[i]); // 计算分子和分母的最大公约数
        fenZiArr[i] /= gcdValue1; // 分子约分
        fenMuArr[i] /= gcdValue1; // 分母约分

        // 【关键】计算 当前分母 与 fenMuMultiply 的最大公约数
        long long gcdValue2 = gcd(fenMuMultiply, fenMuArr[i]);
        // 更新 fenMuMultiply 为当前分母与 fenMuMultiply 的最小公倍数
        fenMuMultiply *= (fenMuArr[i] / gcdValue2);
    }

    // 获得通分后的分子
    long long fenZiSum = 0; // 初始化分子和为 0
    for (int i = 0; i < n; i++) {
        fenZiArr[i] *= (fenMuMultiply / fenMuArr[i]); // 将分子通分
        fenZiSum += fenZiArr[i]; // 累加通分后的分子
    }

    // 获得求平均值后的分母
    long long fenMuAverage;
    fenMuAverage = fenMuMultiply * n; // 平均值分母为 fenMuMultiply * n

    // 求所得平均值(fenZiSum / fenMuAverage)的最简分数形式
    long long gcdValue3 = gcd(fenZiSum, fenMuAverage); // 计算分子和分母的最大公约数
    // 约分化简
    fenZiSum /= gcdValue3; // 分子约分
    fenMuAverage /= gcdValue3; // 分母约分

    // 若分母为1,则只输出分子
    if (fenMuAverage == 1) {
        printf("%lld", fenZiSum); // 输出分子
    } else {
        printf("%lld/%lld", fenZiSum, fenMuAverage); // 输出 a/b(分子/分母) 形式
    }

    return 0; // 程序正常结束
}

C语言 使用欧几里得算法(辗转相除法)计算两个整数的最大公约数请看我的另一篇文章

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到