有理数均值 (20分)
本题要求编写程序,计算N个有理数的平均值。
输入格式:
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …
的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式:
在一行中按照a/b
的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
4
1/2 1/6 3/6 -5/10
输出样例1:
1/6
输入样例2:
2
4/3 2/3
输出样例2:
1
#include<bits/stdc++.h>
using namespace std;
long long lcm(long long a, long long b)
{
return a*b/__gcd(a,b);
}
int main()
{
int n;
scanf("%d", &n);
long long a[110];
long long b[110];
scanf("%lld/%lld",&a[0],&b[0]);
long long mu = b[0];
long long fen = a[0];
for(int i = 1; i < n; i++)
{
scanf("%lld/%lld",&a[i], &b[i]);
long long tmp = mu;
mu = lcm(mu, b[i]);
a[i] = mu/b[i]*a[i];
fen = mu/tmp*fen;
fen += a[i];
//printf("%lld-- %lld\n",fen,mu);
long long g = __gcd(fen, mu);
fen/=g;
mu/= g;
}
mu = n * mu;
long long gg = __gcd(fen, mu);
long long xx = fen/gg;
long long yy = mu/gg;
if(xx == yy)
printf("1\n");
else if(xx == 0)
printf("0\n");
else if(yy == 1)
printf("%lld\n",xx);
else
printf("%lld/%lld\n",xx,yy);
}