給定 N 個有理數,求它們的平均值,結果以最簡分數形式輸出(若分母為 1 則輸出整數)。
rational 包含分子 numerator 和分母 denominator。sum = a/b + c/d = (a*d + c*b) / (b*d)。int 範圍。#include <stdio.h>
struct rational {
int numerator;
int denominator;
};
// 輾轉相除法求最大公約數,效率優於窮舉法
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
int main(void) {
int n;
scanf("%d", &n);
struct rational nums[101], sum = {0, 1}; // 初始化為 0/1
for (int i = 0; i < n; i++) {
scanf("%d/%d", &nums[i].numerator, &nums[i].denominator);
}
// 累加所有有理數
for (int i = 0; i < n; i++) {
sum.numerator = sum.numerator * nums[i].denominator + nums[i].numerator * sum.denominator;
sum.denominator = sum.denominator * nums[i].denominator;
if (sum.numerator != 0) {
int g = gcd(sum.numerator, sum.denominator);
sum.numerator /= g;
sum.denominator /= g;
}
}
// 求平均值:分母乘以 n
sum.denominator *= n;
int g = gcd(sum.numerator, sum.denominator);
sum.numerator /= g;
sum.denominator /= g;
// 輸出
if (sum.denominator == 1)
printf("%d\n", sum.numerator);
else
printf("%d/%d\n", sum.numerator, sum.denominator);
return 0;
}
sum = {0, 1} 而非直接賦值第一個數,使邏輯更統一。輸入: 3 1/2 1/3 1/6 輸出: 1/3
驗證:(1/2 + 1/3 + 1/6) / 3 = (1) / 3 = 1/3。