2025-03-01 学习记录--C/C++-PTA 7-35 有理数均值
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻
一、题目描述 ⭐️
二、代码(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
语言 使用欧几里得算法(辗转相除法)计算两个整数的最大公约数请看我的另一篇文章。