题目
计算 N N N 个有理数的平均值。
输入格式
输入第一行给出正整数 N ( ≤ 100 ) N(≤100) N(≤100);第二行中按照 a 1 / b 1 a1/b1 a1/b1 a 2 / b 2 a2/b2 a2/b2 …的格式给出 N N N 个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式
在一行中按照 a / b a/b a/b 的格式输出 N N N 个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为 1 1 1,则只输出分子。
输入样例1
4
1/2 1/6 3/6 -5/10
输出样例1
1/6
输入样例2
2
4/3 2/3
输出样例2
1
题解
解题思路
输入分数的个数,然后输入分数。先将所有分数进行通分,然后进行相加,然后利用辗转相除法,算出最大公约数,然后进行约分,最后得出结论。
完整代码
#include <stdio.h>
#include<iostream>
using namespace std;
int GCD(int A, int B) // 约分函数,求出最大公约数
{
int t = 0;
while(t = A % B) // 辗转相除法
{
A = B;
B = t;
}
return B;
}
int main(void)
{
int a[1001], b[1001]; // 定义分子、分母数组
int i = 0, A = 0, B = 1, C = 0, N; // A大分子,B大分母
cout << "请输入一个正整数:"; // 提交时注释此行
cin >> N;
cout << "请输入 "<< N << " 个分数:"; // 提交时注释此行
for (i = 1; i <= N; i++)
scanf("%d/%d", &a[i], &b[i]);
for (i = 1; i <= N; i++)
{
A = A * b[i] + a[i] * B; // 将每个分子通分,再相加
B = B * b[i]; // 求分母的公倍数
C = GCD(A, B);
A /= C;
B /= C;
}
B = B * N; // 将分母乘以N
C = GCD(A, B);
A /= C;
B /= C;
if (B == 1)
cout << A << endl;
else
cout << A << "/" << B << endl;
return 0;
}