Bootstrap

比较有理数大小C语言pta,PTA-基础编程题目-5-35有理数的均值(c)

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

输入格式:

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

输出格式:

在一行中按照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

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

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

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;

}

;