本题要求编写程序,计算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;
}