本题要求编写程序,计算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;
//避免int长度不够,本文均采用long long
long long maxcom(long long x,long long y) //求最大公约数(辗转相除法)
{
if(x%y==0)return y;
else
{
return maxcom(y,x%y);
}
}
int main()
{
long long z1,z2,m1,m2,n,i; //z1表示第一个输入的分子 m1表示对应的分母
cin>>n;
scanf("%lld/%lld",&z1,&m1);
for(i=1;i<n;i++) //每次输入后执行两个数的相加
{
scanf("%lld/%lld",&z2,&m2); //每次输入的分子 分母分别用z2 m2表示
z1=z1*m2+z2*m1; //交叉相乘算分子
m1*=m2; //分母相乘当分母
long long max=maxcom(z1,m1); //求最大公约数进行约分
m1/=max;
z1/=max;
}
m1*=n; //求平均数,将分母乘个数再进行约分
long long max=maxcom(z1,m1);
m1/=max;
z1/=max;
cout<<z1;
if(m1!=1)cout<<"/"<<m1; //分母不为1时,输出/和分母
return 0;
}