PTA7-35 有理数均值

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
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

你可能感兴趣的:(PTA,基础编程题目集,PTA,C语言)