题目链接:7-35 有理数均值
一. 题目
1. 题目
2. 输入输出样例
3. 限制
二、代码
1. 代码实现
#include <iostream>
using namespace std;
// 计算公约数
int calGcd(int a, int b) {
int gcd;
bool negative = false;
if (a == a / b * b) { // b整除a
return b;
} else if (b == b / a * a) { // a整除b
return a;
}
if (a < 0 && b < 0) {
negative = true;
} else {
if (a < 0) {
a = -a;
} else if (b < 0) {
b = -b;
}
}
gcd = 1;
for (int i = min(a, b); i > 1; i--) {
if (a % i == 0 && b % i == 0) {
gcd = i;
break;
}
}
if (negative) {
gcd = -gcd;
}
return gcd;
}
// 约分函数(&表示修改会对原传入参数生效)
void divGcd(int& a, int& b) {
if (a == 0) { //若分子为0
b = 1;
return;
}
int gcd = 1;
gcd = calGcd(a, b);
if (gcd != 1) { // 若存在公约数
a /= gcd;
b /= gcd;
}
}
int main(void) {
int N;
int sum_a = 0; // 分子的和
int sum_b = 1; // 分母的和
cin >> N;
for (int i = 0; i < N; i++) {
int a, b;
char slash;
cin >> a >> slash >> b;
divGcd(a, b); // 对输入参数约分
sum_a = sum_a * b + a * sum_b;
sum_b = sum_b * b;
divGcd(sum_a, sum_b); // 求和后再次约分
}
sum_b *= N;
divGcd(sum_a, sum_b); // 对结果约分
if (sum_b == 1) { // 若分母为1,则只输入分子
cout << sum_a << endl;
} else {
cout << sum_a << "/" << sum_b << endl;
}
return 0;
}