有理数均值【未AC】

有一个测试点若不随时化简,则会溢出未通过


题目描述

本题要求编写程序,计算N个有理数的平均值。

输入格式
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。

输出格式
在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

输入样例1

1
2
4
1/2 1/6 3/6 -5/10

输出样例1

1
1/6

输入样例2

1
2
2
4/3 2/3

输出样例2

1
1

我的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <stdio.h>
#include <math.h>
//#define long long int int
//求最小公倍数
long long int gm(int b1,int b2)
{
long long int i;
long long int max=b2,min=b1;
if(min>max)
{
long long int temp=min;min=max;max=temp;
}
for(i=max;i<=max*min;++i)
{
if(i%min==0&&i%max==0)
return i;
}
}
//求最大公因数
long long int gy(int a1,int b1)
{
//局部嘛,反正对main里面的无影响,就这样喽
if(a1>b1)
{
long long int temp=a1;a1=b1;b1=temp;
}
long long int i;
for(i=a1;i>=1;--i)
{
if(a1%i==0&&b1%i==0)
return i;
}
}
int main()
{
int n;
scanf("%d",&n);
int nn=n;//n的副本,因为后面n会自减
long long int a1,b1,a2,b2;
scanf("%lld/%lld",&a1,&b1);//不动,只管累加
n-=1;
long long int mbs;//最小公倍数
long long int mys;//最大公因数
while(n--)
{
scanf("%lld/%lld",&a2,&b2);//循环接收新值
mbs=gm(b1,b2);//求b1和b2的最小公倍数
//a1=a1*(mbs/b1)+a2*(mbs/b2);b1=mbs;//通分累加
a1=(mbs/b1)*a1+(mbs/b2)*a2;b1=mbs;//通分累加
//printf("%d/%d\n",a1,b1);
if(a1!=0)//分子有可能变为0,那么此时就是0/b1了,分母是不可能变为0的,所以这里仅对分子讨论
{ //要及时化简,否则溢出
mys=gy(fabs(a1),b1);
a1/=mys;b1/=mys;
}
else//a1=0
{
b1=1;//b1是啥都行,只要b1不大(这样就能防止b1溢出),为了方便取1好了
}

}

//最后来求平均值
b1=b1*nn;//a1*1相当于不变
long long int fenzi=a1,fenmu=b1;
if(fenzi==0)
printf("0");
else
{
long long int g;//分子和分母的最大公因数
g=gy(fabs(fenzi),fenmu);//分子可能为负数
fenzi/=g;fenmu/=g;
if(fenmu==1)
printf("%lld",fenzi);
else
printf("%lld/%lld",fenzi,fenmu);

}
}
凡希 wechat
喜欢所以热爱,坚持干货分享,欢迎订阅我的微信公众号
呐,请我吃辣条