#include <stdio.h>
long int gcd(long int x,long int y);
int main()
{
int N;
scanf("%d",&N);
long int son,mom;//如果用int,随时约分的情况下还是会溢出,于是上long int
long int MOM = 1,SON = 0,t,t1;
for(int i=0;i<N;i++){
scanf("%ld/%ld",&son,&mom);//读入N个分子分母
MOM *= mom;
SON *= mom;
SON += son*MOM/mom;
t = gcd(MOM,SON);
SON /= t;
MOM /= t;//每次都约分
}
MOM *= N;//平均处理
t1 = gcd(MOM,SON);
SON /= t1;
MOM /= t1;
//最后约分一下
if(MOM==1)
printf("%ld",SON);
else
printf("%ld/%ld",SON,MOM);//输出
return 0;
}
long int gcd(long int x,long int y)
{
long int t;
while(y!=0){
t = x%y;
x = y;
y = t;
}
if(x!=0)
return x;
else
return 1;
}//辗转相除法求最大公约数,用于约分
尝试数次数天数小时后....终于通过了
本题要求编写程序,计算N个有理数的平均值。
输入格式:
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …
的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式:
在一行中按照a/b
的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
反思:
1.目前见过的所有求最大公约数的方法中,辗转相除法复杂度最低,为O(logN)
2.分模块地逐次实现功能,比一次性把功能(加和,求均值)塞进for循环明智太多...