1. 程式人生 > >PTA-基礎程式設計題目-5-35有理數的均值(c)

PTA-基礎程式設計題目-5-35有理數的均值(c)

5-35 有理數均值   (20分)

本題要求編寫程式,計算N個有理數的平均值。

輸入格式:

輸入第一行給出正整數N(≤\le100);第二行中按照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<stdio.h>
typedef struct node{
    int a;
    int b;
}type;
int gcd(int sum,int add);        //求最大公約數的函式 
int main(void)
{    
    int n,c;                    //c為兩數的最大公約數 
    int i,j;
    int sum,add;                //sum為分子的積的和,add為分母積 
    scanf("%d",&n);
    type t[n];                //建立一個n大小的結構體陣列 

    for(i=0;i<n;i++)    {
        scanf("%d/%d",&t[i].a,&t[i].b);            
    }

    if(n==1)    {
        if(t[0].a!=0)    {
            c=gcd(t[0].a,t[0].b);
            t[0].a/=c;
            t[0].b/=c;
            if(t[0].a%t[0].b==0)        //如果分母為1,則輸出分子就夠了 
                printf("%d\n",t[0].a/t[0].b);
            else
                printf("%d/%d\n",t[0].a,t[0].b);
            return 0;
        }    else if(t[0].a==0)    {    //輸入的a為0的時候 
            printf("0\n");
            return 0;
        }    
        
    }    else {        //n大於1的時候 
        sum=t[0].a;
        add=t[0].b;
        for(i=1;i<n;i++)    {
            sum=sum*t[i].b+t[i].a*add;            //  sum=a0*b1+a1*b0, add=b0*b1;
            add=add*t[i].b;
            c=gcd(sum,add);        //c為最大公約數; 
            sum/=c;                //約分 
            add/=c;         
        }
        add*=n;                //分母乘以n,再跟分子約分; 
        c=gcd(sum,add);
        sum/=c;
        add/=c;
        if(sum%add==0)    {        // 注意輸出的格式,分母為0的時候 
            printf("%d\n",sum/add);
        }    else    {
            printf("%d/%d\n",sum,add);
            return 0;
        }
    }
}
int gcd(int sum,int add)
{    
    int x,y,c;
    x=sum;y=add;
        while(sum!=0)    {
            c=add%sum; add=sum; sum=c;
        }
    c=add;
    return c;            
}