题目链接: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整除areturn b;} else if (b == b / a * a) { // a整除breturn 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) { //若分子为0b = 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;
}