PTA7-35 有理数均值
题目:本题要求编写程序,计算N个有理数的平均值。
输入格式:
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …
的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式:
在一行中按照a/b
的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
4
1/2 1/6 1/6 -5/10
输出样例1:
1/6
输入样例2:
2
4/3 2/3
输出样例2:
1
#include<stdio.h>
int Gcd(int a,int b)
{
return b==0?a:Gcd(b,a%b);//辗转相除法求最大公约数函数
}
int main()
{
int n,a,b,gcd,temp;
int suma=0;
int sumb=1;
scanf("%d",&n);
temp=n;
while(temp--)
{
scanf("%d/%d",&a,&b);
if(a==0||b==0)
continue;
if(suma==0) //刚开始累乘求和
{
suma=a;
sumb=b;
}
else
{
suma=suma*b+a*sumb; //累乘求分子分母
sumb=sumb*b;
}
if(temp==0)
sumb=sumb*n;
a=suma>0?suma:-suma;//下面4行实现每一步累乘都约分,防止分子分母超出int表示范围,将suma,sumb设置成long long int可以省去这一步
b=sumb;
gcd=Gcd(a,b);
suma/=gcd;
sumb/=gcd;
}
if(suma==0)
printf("0");
else if(sumb==1)
printf("%d",suma);
else
printf("%d/%d",suma,sumb);
return 0;
}
本代码参考自:https://blog.csdn.net/LightInDarkness/article/details/81463004
辗转相除法求最大公约数步骤:
1,如果b等于0,计算结束,a就是最大公约数
2,否则,计算a除以b的余数,让a等于b,而b等于那个余数
3,回到第一步
例:
a--b--t
12-18-12
18-12-6
12-6-0
6-0